Commit e2e843a3 authored by Mike Gorchak's avatar Mike Gorchak

Continue working on 2D support in Photon

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404055
parent c1665b6a
...@@ -817,7 +817,7 @@ photon_createwindow(_THIS, SDL_Window * window) ...@@ -817,7 +817,7 @@ photon_createwindow(_THIS, SDL_Window * window)
if (window->title != NULL) { if (window->title != NULL) {
PtSetArg(&winargs[winargc++], Pt_ARG_WINDOW_TITLE, window->title, 0); PtSetArg(&winargs[winargc++], Pt_ARG_WINDOW_TITLE, window->title, 0);
} else { } else {
PtSetArg(&winargs[winargc++], Pt_ARG_WINDOW_TITLE, "", 0); PtSetArg(&winargs[winargc++], Pt_ARG_WINDOW_TITLE, "SDL unnamed application", 0);
} }
/* TODO: handle SDL_WINDOW_INPUT_GRABBED */ /* TODO: handle SDL_WINDOW_INPUT_GRABBED */
......
...@@ -94,8 +94,7 @@ SDL_RenderDriver photon_renderdriver = { ...@@ -94,8 +94,7 @@ SDL_RenderDriver photon_renderdriver = {
SDL_RENDERER_ACCELERATED), SDL_RENDERER_ACCELERATED),
(SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
SDL_TEXTUREMODULATE_ALPHA), SDL_TEXTUREMODULATE_ALPHA),
(SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | SDL_BLENDMODE_BLEND),
SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD),
(SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_SLOW | (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_SLOW |
SDL_TEXTURESCALEMODE_FAST | SDL_TEXTURESCALEMODE_BEST), SDL_TEXTURESCALEMODE_FAST | SDL_TEXTURESCALEMODE_BEST),
10, 10,
...@@ -222,6 +221,10 @@ photon_createrenderer(SDL_Window * window, Uint32 flags) ...@@ -222,6 +221,10 @@ photon_createrenderer(SDL_Window * window, Uint32 flags)
PgDefaultGC(rdata->gc); PgDefaultGC(rdata->gc);
} }
/* Setup textures supported by current renderer instance */
renderer->info.num_texture_formats=1;
renderer->info.texture_formats[0]=didata->current_mode.format;
return renderer; return renderer;
} }
...@@ -343,7 +346,7 @@ static int _photon_recreate_surfaces(SDL_Renderer * renderer) ...@@ -343,7 +346,7 @@ static int _photon_recreate_surfaces(SDL_Renderer * renderer)
for (it=0; it<rdata->surfaces_count; it++) for (it=0; it<rdata->surfaces_count; it++)
{ {
rdata->osurfaces[it]=PdCreateOffscreenContext(0, window->w, window->h, rdata->osurfaces[it]=PdCreateOffscreenContext(0, window->w, window->h,
Pg_OSC_MEM_LINEAR_ACCESSIBLE | Pg_OSC_MEM_LINEAR_ACCESSIBLE | Pg_OSC_MEM_PAGE_ALIGN |
/* in case if 2D acceleration is not available use CPU optimized surfaces */ /* in case if 2D acceleration is not available use CPU optimized surfaces */
Pg_OSC_MEM_HINT_CPU_READ | Pg_OSC_MEM_HINT_CPU_WRITE | Pg_OSC_MEM_HINT_CPU_READ | Pg_OSC_MEM_HINT_CPU_WRITE |
/* in case if 2D acceleration is available use it */ /* in case if 2D acceleration is available use it */
...@@ -445,6 +448,7 @@ static int _photon_recreate_surfaces(SDL_Renderer * renderer) ...@@ -445,6 +448,7 @@ static int _photon_recreate_surfaces(SDL_Renderer * renderer)
} }
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
{ {
/* do nothing with surface allocation */ /* do nothing with surface allocation */
rdata->surfaces_type=SDL_PHOTON_SURFTYPE_UNKNOWN; rdata->surfaces_type=SDL_PHOTON_SURFTYPE_UNKNOWN;
...@@ -493,6 +497,7 @@ static int _photon_recreate_surfaces(SDL_Renderer * renderer) ...@@ -493,6 +497,7 @@ static int _photon_recreate_surfaces(SDL_Renderer * renderer)
PgSetGCCx(rdata->pcontexts[rdata->surface_render_idx], rdata->gc); PgSetGCCx(rdata->pcontexts[rdata->surface_render_idx], rdata->gc);
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
break; break;
} }
...@@ -520,6 +525,7 @@ int _photon_update_rectangles(SDL_Renderer* renderer, PhRect_t* rect) ...@@ -520,6 +525,7 @@ int _photon_update_rectangles(SDL_Renderer* renderer, PhRect_t* rect)
PmMemFlush(rdata->pcontexts[rdata->surface_visible_idx], rdata->psurfaces[rdata->surface_visible_idx]); PmMemFlush(rdata->pcontexts[rdata->surface_visible_idx], rdata->psurfaces[rdata->surface_visible_idx]);
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
return; return;
} }
} }
...@@ -538,6 +544,7 @@ int _photon_update_rectangles(SDL_Renderer* renderer, PhRect_t* rect) ...@@ -538,6 +544,7 @@ int _photon_update_rectangles(SDL_Renderer* renderer, PhRect_t* rect)
PgDrawPhImageRectv(&src_point, rdata->psurfaces[rdata->surface_visible_idx], rect, 0); PgDrawPhImageRectv(&src_point, rdata->psurfaces[rdata->surface_visible_idx], rect, 0);
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
break; break;
} }
} }
...@@ -567,6 +574,7 @@ photon_activaterenderer(SDL_Renderer * renderer) ...@@ -567,6 +574,7 @@ photon_activaterenderer(SDL_Renderer * renderer)
PgSetGCCx(rdata->pcontexts[rdata->surface_render_idx], rdata->gc); PgSetGCCx(rdata->pcontexts[rdata->surface_render_idx], rdata->gc);
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
break; break;
} }
...@@ -582,10 +590,33 @@ photon_displaymodechanged(SDL_Renderer * renderer) ...@@ -582,10 +590,33 @@ photon_displaymodechanged(SDL_Renderer * renderer)
static int static int
photon_createtexture(SDL_Renderer * renderer, SDL_Texture * texture) photon_createtexture(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
SDL_RenderData *renderdata = (SDL_RenderData *) renderer->driverdata; SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
SDL_Window *window = SDL_GetWindowFromID(renderer->window); SDL_Window *window = SDL_GetWindowFromID(renderer->window);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
SDL_DisplayData *didata = (SDL_DisplayData *) display->driverdata;
SDL_TextureData *tdata = NULL; SDL_TextureData *tdata = NULL;
uint32_t it;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't create texture for OpenGL ES window");
return -1;
}
/* Check if requested texture format is supported */
for (it=0; it<renderer->info.num_texture_formats; it++)
{
if (renderer->info.texture_formats[it]==texture->format)
{
break;
}
}
if (it==renderer->info.num_texture_formats)
{
SDL_SetError("Photon: requested texture format is not supported");
return -1;
}
/* Allocate texture driver data */ /* Allocate texture driver data */
tdata = (SDL_TextureData *) SDL_calloc(1, sizeof(SDL_TextureData)); tdata = (SDL_TextureData *) SDL_calloc(1, sizeof(SDL_TextureData));
...@@ -596,12 +627,105 @@ photon_createtexture(SDL_Renderer * renderer, SDL_Texture * texture) ...@@ -596,12 +627,105 @@ photon_createtexture(SDL_Renderer * renderer, SDL_Texture * texture)
/* Set texture driver data */ /* Set texture driver data */
texture->driverdata = tdata; texture->driverdata = tdata;
/* Try offscreen allocation only in case if displayable buffers are also offscreen */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_OFFSCREEN)
{
/* Try to allocate offscreen memory first */
tdata->osurface=PdCreateOffscreenContext(0, texture->w, texture->h,
Pg_OSC_MEM_LINEAR_ACCESSIBLE | Pg_OSC_MEM_PAGE_ALIGN |
/* in case if 2D acceleration is not available use CPU optimized surfaces */
Pg_OSC_MEM_HINT_CPU_READ | Pg_OSC_MEM_HINT_CPU_WRITE |
/* in case if 2D acceleration is available use it */
Pg_OSC_MEM_2D_WRITABLE | Pg_OSC_MEM_2D_READABLE);
}
/* Check if offscreen allocation has been failed */
if (tdata->osurface==NULL)
{
PhPoint_t translation={0, 0};
PhDim_t dimension={texture->w, texture->h};
uint32_t image_pfmt=photon_sdl_to_image_pixelformat(didata->current_mode.format);
/* Allocate photon image */
if (image_pfmt==Pg_IMAGE_PALETTE_BYTE)
{
tdata->psurface=PhCreateImage(NULL, texture->w, texture->h,
image_pfmt, NULL, 256, 1);
}
else
{
tdata->psurface=PhCreateImage(NULL, texture->w, texture->h,
image_pfmt, NULL, 0, 1);
}
if (tdata->psurface==NULL)
{
return -1;
}
/* Create memory context for PhImage_t */
tdata->pcontext=PmMemCreateMC(tdata->psurface, &dimension, &translation);
if (tdata->pcontext==NULL)
{
/* Destroy PhImage */
if (tdata->psurface!=NULL)
{
if (tdata->psurface->palette!=NULL)
{
SDL_free(tdata->psurface->palette);
tdata->psurface->palette=NULL;
}
/* Destroy shared memory for PhImage_t */
PgShmemDestroy(tdata->psurface->image);
tdata->psurface->image=NULL;
SDL_free(tdata->psurface);
tdata->psurface=NULL;
}
}
tdata->surface_type=SDL_PHOTON_SURFTYPE_PHIMAGE;
}
else
{
tdata->surface_type=SDL_PHOTON_SURFTYPE_OFFSCREEN;
}
return 0;
} }
static int static int
photon_querytexturepixels(SDL_Renderer * renderer, SDL_Texture * texture, photon_querytexturepixels(SDL_Renderer * renderer, SDL_Texture * texture,
void **pixels, int *pitch) void **pixels, int *pitch)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
SDL_TextureData* tdata=(SDL_TextureData*)texture->driverdata;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't query texture pixels for OpenGL ES window");
return -1;
}
/* Clear outcoming parameters */
*pixels=NULL;
*pitch=0;
switch (tdata->surface_type)
{
case SDL_PHOTON_SURFTYPE_OFFSCREEN:
*pixels=(void*)PdGetOffscreenContextPtr(tdata->osurface);
*pitch=tdata->osurface->pitch;
break;
case SDL_PHOTON_SURFTYPE_PHIMAGE:
*pixels=(void*)tdata->psurface->image;
*pitch=tdata->psurface->bpl;
break;
default:
break;
}
return 0;
} }
static int static int
...@@ -609,38 +733,151 @@ photon_settexturepalette(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -609,38 +733,151 @@ photon_settexturepalette(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Color * colors, int firstcolor, const SDL_Color * colors, int firstcolor,
int ncolors) int ncolors)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
SDL_TextureData* tdata=(SDL_TextureData*)texture->driverdata;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't set texture palette for OpenGL ES window");
return -1;
}
if (texture->format!=SDL_PIXELFORMAT_INDEX8)
{
SDL_SetError("Photon: can't set palette for non-paletted texture");
return -1;
}
return -1;
} }
static int static int
photon_gettexturepalette(SDL_Renderer * renderer, SDL_Texture * texture, photon_gettexturepalette(SDL_Renderer * renderer, SDL_Texture * texture,
SDL_Color * colors, int firstcolor, int ncolors) SDL_Color * colors, int firstcolor, int ncolors)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
SDL_TextureData* tdata=(SDL_TextureData*)texture->driverdata;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't return texture palette for OpenGL ES window");
return -1;
}
if (texture->format!=SDL_PIXELFORMAT_INDEX8)
{
SDL_SetError("Photon: can't return palette for non-paletted texture");
return -1;
}
return -1;
} }
static int static int
photon_settexturecolormod(SDL_Renderer * renderer, SDL_Texture * texture) photon_settexturecolormod(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
/* TODO */
return -1;
} }
static int static int
photon_settexturealphamod(SDL_Renderer * renderer, SDL_Texture * texture) photon_settexturealphamod(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
/* TODO */
return -1;
} }
static int static int
photon_settextureblendmode(SDL_Renderer * renderer, SDL_Texture * texture) photon_settextureblendmode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't set texture blend mode for OpenGL ES window");
return -1;
}
switch (texture->blendMode)
{
case SDL_BLENDMODE_NONE:
case SDL_BLENDMODE_MASK:
case SDL_BLENDMODE_BLEND:
return 0;
case SDL_BLENDMODE_ADD:
case SDL_BLENDMODE_MOD:
default:
SDL_Unsupported();
texture->blendMode = SDL_BLENDMODE_NONE;
return -1;
}
} }
static int static int
photon_settexturescalemode(SDL_Renderer * renderer, SDL_Texture * texture) photon_settexturescalemode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
/* TODO */
return -1;
} }
static int static int
photon_updatetexture(SDL_Renderer * renderer, SDL_Texture * texture, photon_updatetexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, const void *pixels, int pitch) const SDL_Rect * rect, const void *pixels, int pitch)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
SDL_TextureData* tdata=(SDL_TextureData*)texture->driverdata;
uint8_t* src=(uint8_t*)pixels;
uint8_t* dst;
uint32_t dst_pitch;
uint32_t it;
uint32_t copy_length;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't update texture for OpenGL ES window");
return -1;
}
switch (tdata->surface_type)
{
case SDL_PHOTON_SURFTYPE_OFFSCREEN:
dst=(uint8_t*)PdGetOffscreenContextPtr(tdata->osurface);
dst_pitch=tdata->osurface->pitch;
if (dst==NULL)
{
SDL_SetError("Photon: can't get pointer to texture surface");
return -1;
}
break;
case SDL_PHOTON_SURFTYPE_PHIMAGE:
dst=(uint8_t*)tdata->psurface->image;
dst_pitch=tdata->psurface->bpl;
if (dst==NULL)
{
SDL_SetError("Photon: can't get pointer to texture surface");
return -1;
}
break;
default:
SDL_SetError("Photon: invalid internal surface type");
return -1;
}
dst+=rect->y * dst_pitch + rect->x * SDL_BYTESPERPIXEL(texture->format);
copy_length=rect->w * SDL_BYTESPERPIXEL(texture->format);
for (it = 0; it < rect->h; it++)
{
SDL_memcpy(dst, src, copy_length);
src+=pitch;
dst+=dst_pitch;
}
return 0;
} }
static int static int
...@@ -648,17 +885,59 @@ photon_locktexture(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -648,17 +885,59 @@ photon_locktexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, int markDirty, void **pixels, const SDL_Rect * rect, int markDirty, void **pixels,
int *pitch) int *pitch)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
SDL_TextureData* tdata=(SDL_TextureData*)texture->driverdata;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't lock texture for OpenGL ES window");
return -1;
}
/* Clear outcoming parameters */
*pixels=NULL;
*pitch=0;
switch (tdata->surface_type)
{
case SDL_PHOTON_SURFTYPE_OFFSCREEN:
*pixels=(void*)((uint8_t*)PdGetOffscreenContextPtr(tdata->osurface) +
rect->y * tdata->osurface->pitch +
rect->x * SDL_BYTESPERPIXEL(texture->format));
*pitch=tdata->osurface->pitch;
break;
case SDL_PHOTON_SURFTYPE_PHIMAGE:
*pixels=(void*)((uint8_t*)tdata->psurface->image +
rect->y * tdata->osurface->pitch +
rect->x * SDL_BYTESPERPIXEL(texture->format));
*pitch=tdata->psurface->bpl;
break;
default:
break;
}
return 0;
} }
static void static void
photon_unlocktexture(SDL_Renderer * renderer, SDL_Texture * texture) photon_unlocktexture(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't unlock texture for OpenGL ES window");
return;
}
} }
static void static void
photon_dirtytexture(SDL_Renderer * renderer, SDL_Texture * texture, photon_dirtytexture(SDL_Renderer * renderer, SDL_Texture * texture,
int numrects, const SDL_Rect * rects) int numrects, const SDL_Rect * rects)
{ {
/* TODO */
} }
static int static int
...@@ -666,6 +945,13 @@ photon_setdrawcolor(SDL_Renderer * renderer) ...@@ -666,6 +945,13 @@ photon_setdrawcolor(SDL_Renderer * renderer)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata; SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't set draw color for OpenGL ES window");
return -1;
}
switch (rdata->surfaces_type) switch (rdata->surfaces_type)
{ {
case SDL_PHOTON_SURFTYPE_OFFSCREEN: case SDL_PHOTON_SURFTYPE_OFFSCREEN:
...@@ -674,13 +960,18 @@ photon_setdrawcolor(SDL_Renderer * renderer) ...@@ -674,13 +960,18 @@ photon_setdrawcolor(SDL_Renderer * renderer)
PgSetStrokeColorCx(rdata->gc, PgRGB(renderer->r, renderer->g, renderer->b)); PgSetStrokeColorCx(rdata->gc, PgRGB(renderer->r, renderer->g, renderer->b));
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
break; break;
} }
return 0;
} }
static int static int
photon_setdrawblendmode(SDL_Renderer * renderer) photon_setdrawblendmode(SDL_Renderer * renderer)
{ {
/* TODO */
return -1;
} }
static int static int
...@@ -688,6 +979,13 @@ photon_renderpoint(SDL_Renderer * renderer, int x, int y) ...@@ -688,6 +979,13 @@ photon_renderpoint(SDL_Renderer * renderer, int x, int y)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata; SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't render point in OpenGL ES window");
return -1;
}
switch (rdata->surfaces_type) switch (rdata->surfaces_type)
{ {
case SDL_PHOTON_SURFTYPE_OFFSCREEN: case SDL_PHOTON_SURFTYPE_OFFSCREEN:
...@@ -697,8 +995,11 @@ photon_renderpoint(SDL_Renderer * renderer, int x, int y) ...@@ -697,8 +995,11 @@ photon_renderpoint(SDL_Renderer * renderer, int x, int y)
PgDrawIPixelCx(rdata->pcontexts[rdata->surface_render_idx], x, y); PgDrawIPixelCx(rdata->pcontexts[rdata->surface_render_idx], x, y);
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
break; break;
} }
return 0;
} }
static int static int
...@@ -706,6 +1007,13 @@ photon_renderline(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) ...@@ -706,6 +1007,13 @@ photon_renderline(SDL_Renderer * renderer, int x1, int y1, int x2, int y2)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata; SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't render line in OpenGL ES window");
return -1;
}
switch (rdata->surfaces_type) switch (rdata->surfaces_type)
{ {
case SDL_PHOTON_SURFTYPE_OFFSCREEN: case SDL_PHOTON_SURFTYPE_OFFSCREEN:
...@@ -715,8 +1023,11 @@ photon_renderline(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) ...@@ -715,8 +1023,11 @@ photon_renderline(SDL_Renderer * renderer, int x1, int y1, int x2, int y2)
PgDrawILineCx(rdata->pcontexts[rdata->surface_render_idx], x1, y1, x2, y2); PgDrawILineCx(rdata->pcontexts[rdata->surface_render_idx], x1, y1, x2, y2);
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
break; break;
} }
return 0;
} }
static int static int
...@@ -724,6 +1035,13 @@ photon_renderfill(SDL_Renderer * renderer, const SDL_Rect * rect) ...@@ -724,6 +1035,13 @@ photon_renderfill(SDL_Renderer * renderer, const SDL_Rect * rect)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata; SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't render filled box in OpenGL ES window");
return -1;
}
switch (rdata->surfaces_type) switch (rdata->surfaces_type)
{ {
case SDL_PHOTON_SURFTYPE_OFFSCREEN: case SDL_PHOTON_SURFTYPE_OFFSCREEN:
...@@ -733,6 +1051,7 @@ photon_renderfill(SDL_Renderer * renderer, const SDL_Rect * rect) ...@@ -733,6 +1051,7 @@ photon_renderfill(SDL_Renderer * renderer, const SDL_Rect * rect)
PgDrawIRectCx(rdata->pcontexts[rdata->surface_render_idx], rect->x, rect->y, rect->w+rect->x-1, rect->h+rect->y-1, Pg_DRAW_FILL); PgDrawIRectCx(rdata->pcontexts[rdata->surface_render_idx], rect->x, rect->y, rect->w+rect->x-1, rect->h+rect->y-1, Pg_DRAW_FILL);
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
break; break;
} }
} }
...@@ -741,6 +1060,110 @@ static int ...@@ -741,6 +1060,110 @@ static int
photon_rendercopy(SDL_Renderer * renderer, SDL_Texture * texture, photon_rendercopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect) const SDL_Rect * srcrect, const SDL_Rect * dstrect)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
SDL_TextureData* tdata=(SDL_TextureData*)texture->driverdata;
PhRect_t src_rect;
PhRect_t dst_rect;
PhPoint_t dst_point;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't blit textures in OpenGL ES window");
return -1;
}
/* Switch on requested graphics context modifiers */
switch(texture->blendMode)
{
case SDL_BLENDMODE_MASK:
/* Enable and set chroma key */
PgChromaOnCx(rdata->gc);
PgSetChromaCx(rdata->gc, PgRGB(255, 255, 255), Pg_CHROMA_SRC_MATCH | Pg_CHROMA_NODRAW);
break;
case SDL_BLENDMODE_BLEND:
/* TODO */
break;
case SDL_BLENDMODE_NONE:
default:
/* Do nothing */
break;
}
/* Set source blit area */
src_rect.ul.x = srcrect->x;
src_rect.ul.y = srcrect->y;
src_rect.lr.x = srcrect->x + srcrect->w - 1;
src_rect.lr.y = srcrect->y + srcrect->h - 1;
/* Set destination blit area */
dst_rect.ul.x = dstrect->x;
dst_rect.ul.y = dstrect->y;
dst_rect.lr.x = dstrect->x + dstrect->w - 1;
dst_rect.lr.y = dstrect->y + dstrect->h - 1;
/* Set destination point */
dst_point.x = dstrect->x;
dst_point.y = dstrect->y;
/* Do blit */
switch (rdata->surfaces_type)
{
case SDL_PHOTON_SURFTYPE_OFFSCREEN:
/* two possible combinations */
switch (tdata->surface_type)
{
case SDL_PHOTON_SURFTYPE_OFFSCREEN:
/* easiest full accelerated combination: offscreen->offscreen */
PgContextBlitCx(rdata->osurfaces[rdata->surface_render_idx], tdata->osurface,
&src_rect, rdata->osurfaces[rdata->surface_render_idx], &dst_rect);
break;
case SDL_PHOTON_SURFTYPE_PHIMAGE:
/* not accelerated combination: PhImage->offscreen */
/* scaling is not supported in this method */
PgDrawPhImageRectCxv(rdata->osurfaces[rdata->surface_render_idx], &dst_point,
tdata->psurface, &src_rect, 0);
break;
default:
break;
}
break;
case SDL_PHOTON_SURFTYPE_PHIMAGE:
/* two possible combinations */
switch (tdata->surface_type)
{
case SDL_PHOTON_SURFTYPE_OFFSCREEN:
/* not supported combination: offscreen->PhImage */
return -1;
case SDL_PHOTON_SURFTYPE_PHIMAGE:
/* not accelerated combination, but fast: PhImage->PhImage */
/* scaling is not supported in this method */
PgDrawPhImageRectCxv(rdata->pcontexts[rdata->surface_render_idx], &dst_point, tdata->psurface, &src_rect, 0);
break;
default:
break;
}
break;
}
/* Switch off graphics context modifiers */
switch(texture->blendMode)
{
case SDL_BLENDMODE_MASK:
/* Disable chroma key */
PgChromaOffCx(rdata->gc);
break;
case SDL_BLENDMODE_BLEND:
/* TODO */
break;
case SDL_BLENDMODE_NONE:
default:
/* Do nothing */
break;
}
return 0;
} }
static void static void
...@@ -752,6 +1175,13 @@ photon_renderpresent(SDL_Renderer * renderer) ...@@ -752,6 +1175,13 @@ photon_renderpresent(SDL_Renderer * renderer)
PhRect_t src_rect; PhRect_t src_rect;
PhPoint_t src_point; PhPoint_t src_point;
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't render present for OpenGL ES window");
return;
}
/* Flush all undrawn graphics data to surface */ /* Flush all undrawn graphics data to surface */
switch (rdata->surfaces_type) switch (rdata->surfaces_type)
{ {
...@@ -763,6 +1193,7 @@ photon_renderpresent(SDL_Renderer * renderer) ...@@ -763,6 +1193,7 @@ photon_renderpresent(SDL_Renderer * renderer)
PmMemFlush(rdata->pcontexts[rdata->surface_render_idx], rdata->psurfaces[rdata->surface_render_idx]); PmMemFlush(rdata->pcontexts[rdata->surface_render_idx], rdata->psurfaces[rdata->surface_render_idx]);
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
return; return;
} }
...@@ -787,6 +1218,7 @@ photon_renderpresent(SDL_Renderer * renderer) ...@@ -787,6 +1218,7 @@ photon_renderpresent(SDL_Renderer * renderer)
PgDrawPhImagev(&src_point, rdata->psurfaces[rdata->surface_render_idx], 0); PgDrawPhImagev(&src_point, rdata->psurfaces[rdata->surface_render_idx], 0);
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
break; break;
} }
...@@ -798,6 +1230,55 @@ photon_renderpresent(SDL_Renderer * renderer) ...@@ -798,6 +1230,55 @@ photon_renderpresent(SDL_Renderer * renderer)
static void static void
photon_destroytexture(SDL_Renderer * renderer, SDL_Texture * texture) photon_destroytexture(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
SDL_TextureData* tdata=(SDL_TextureData*)texture->driverdata;
/* Check if partially created texture must be destroyed */
if (tdata==NULL)
{
return;
}
/* Check, if it is not initialized */
if (rdata->surfaces_type==SDL_PHOTON_SURFTYPE_UNKNOWN)
{
SDL_SetError("Photon: can't destroy texture for OpenGL ES window");
return;
}
switch (tdata->surface_type)
{
case SDL_PHOTON_SURFTYPE_OFFSCREEN:
if (tdata->osurface!=NULL)
{
PhDCRelease(tdata->osurface);
tdata->osurface = NULL;
}
break;
case SDL_PHOTON_SURFTYPE_PHIMAGE:
if (tdata->pcontext!=NULL)
{
PmMemReleaseMC(tdata->pcontext);
tdata->pcontext=NULL;
}
if (tdata->psurface!=NULL)
{
if (tdata->psurface->palette!=NULL)
{
SDL_free(tdata->psurface->palette);
tdata->psurface->palette=NULL;
}
/* Destroy shared memory for PhImage_t */
PgShmemDestroy(tdata->psurface->image);
tdata->psurface->image=NULL;
SDL_free(tdata->psurface);
tdata->psurface=NULL;
}
break;
default:
break;
}
} }
static void static void
...@@ -857,6 +1338,7 @@ photon_destroyrenderer(SDL_Renderer * renderer) ...@@ -857,6 +1338,7 @@ photon_destroyrenderer(SDL_Renderer * renderer)
} }
break; break;
case SDL_PHOTON_SURFTYPE_UNKNOWN: case SDL_PHOTON_SURFTYPE_UNKNOWN:
default:
{ {
/* nothing to do */ /* nothing to do */
} }
......
...@@ -55,6 +55,10 @@ typedef struct SDL_RenderData ...@@ -55,6 +55,10 @@ typedef struct SDL_RenderData
typedef struct SDL_TextureData typedef struct SDL_TextureData
{ {
uint32_t surface_type;
PdOffscreenContext_t* osurface;
PhImage_t* psurface;
PmMemoryContext_t* pcontext;
} SDL_TextureData; } SDL_TextureData;
extern void photon_addrenderdriver(_THIS); extern void photon_addrenderdriver(_THIS);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment