Commit 0ce7835a authored by Mike Gorchak's avatar Mike Gorchak

All 2D operations in Photon driver have been finished. The driver is ready to...

All 2D operations in Photon driver have been finished. The driver is ready to use. There fullscreen modes and YUV textures are rest only.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404083
parent c6540a32
...@@ -270,7 +270,7 @@ photon_addrenderdriver(_THIS) ...@@ -270,7 +270,7 @@ photon_addrenderdriver(_THIS)
} }
/****************************************************************************/ /****************************************************************************/
/* Render helper functions */ /* Renderer helper functions */
/****************************************************************************/ /****************************************************************************/
static int _photon_recreate_surfaces(SDL_Renderer * renderer) static int _photon_recreate_surfaces(SDL_Renderer * renderer)
...@@ -577,6 +577,100 @@ int _photon_update_rectangles(SDL_Renderer* renderer, PhRect_t* rect) ...@@ -577,6 +577,100 @@ int _photon_update_rectangles(SDL_Renderer* renderer, PhRect_t* rect)
} }
} }
int _photon_set_blending(SDL_Renderer* renderer, uint32_t blendmode, uint32_t globalalpha, uint32_t blendsource)
{
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
/* Switch on requested graphics context modifiers */
switch (blendmode)
{
case SDL_BLENDMODE_MASK:
/* Enable and set chroma key */
if (blendsource==SDL_PHOTON_TEXTURE_BLEND)
{
PgSetChromaCx(rdata->gc, PgRGB(255, 255, 255), Pg_CHROMA_SRC_MATCH | Pg_CHROMA_NODRAW);
PgChromaOnCx(rdata->gc);
}
break;
case SDL_BLENDMODE_BLEND:
/* Enable and set chroma key and alpha blending */
if (blendsource==SDL_PHOTON_TEXTURE_BLEND)
{
PgSetChromaCx(rdata->gc, PgRGB(255, 255, 255), Pg_CHROMA_SRC_MATCH | Pg_CHROMA_NODRAW);
PgChromaOnCx(rdata->gc);
}
PgSetAlphaCx(rdata->gc, Pg_ALPHA_OP_SRC_GLOBAL | Pg_BLEND_SRC_As | Pg_BLEND_DST_1mAs, NULL, NULL, globalalpha, 0);
PgAlphaOnCx(rdata->gc);
break;
case SDL_BLENDMODE_ADD:
/* Enable and set chroma key and alpha blending */
if (blendsource==SDL_PHOTON_TEXTURE_BLEND)
{
PgSetChromaCx(rdata->gc, PgRGB(255, 255, 255), Pg_CHROMA_SRC_MATCH | Pg_CHROMA_NODRAW);
PgChromaOnCx(rdata->gc);
}
PgSetAlphaCx(rdata->gc, Pg_ALPHA_OP_SRC_GLOBAL | Pg_BLEND_SRC_As | Pg_BLEND_DST_1, NULL, NULL, globalalpha, 0);
PgAlphaOnCx(rdata->gc);
break;
case SDL_BLENDMODE_MOD:
/* Enable and set alpha blending */
PgSetAlphaCx(rdata->gc, Pg_BLEND_SRC_0 | Pg_BLEND_DST_S, NULL, NULL, 0, 0);
PgAlphaOnCx(rdata->gc);
break;
case SDL_BLENDMODE_NONE:
/* Do nothing */
break;
default:
return -1;
}
return 0;
}
int _photon_reset_blending(SDL_Renderer* renderer, uint32_t blendmode, uint32_t blendsource)
{
SDL_RenderData *rdata = (SDL_RenderData *) renderer->driverdata;
/* Switch off graphics context modifiers */
switch (blendmode)
{
case SDL_BLENDMODE_MASK:
/* Disable chroma key */
if (blendsource==SDL_PHOTON_TEXTURE_BLEND)
{
PgChromaOffCx(rdata->gc);
}
break;
case SDL_BLENDMODE_BLEND:
/* Disable chroma key and alpha blending */
if (blendsource==SDL_PHOTON_TEXTURE_BLEND)
{
PgChromaOffCx(rdata->gc);
}
PgAlphaOffCx(rdata->gc);
break;
case SDL_BLENDMODE_ADD:
/* Disable chroma key and alpha blending */
if (blendsource==SDL_PHOTON_TEXTURE_BLEND)
{
PgChromaOffCx(rdata->gc);
}
PgAlphaOffCx(rdata->gc);
break;
case SDL_BLENDMODE_MOD:
/* Disable chroma key and alpha blending */
PgAlphaOffCx(rdata->gc);
break;
case SDL_BLENDMODE_NONE:
/* Do nothing */
break;
default:
return -1;
}
return 0;
}
/****************************************************************************/ /****************************************************************************/
/* SDL render interface */ /* SDL render interface */
/****************************************************************************/ /****************************************************************************/
...@@ -1069,9 +1163,30 @@ photon_setdrawcolor(SDL_Renderer * renderer) ...@@ -1069,9 +1163,30 @@ photon_setdrawcolor(SDL_Renderer * renderer)
static int static int
photon_setdrawblendmode(SDL_Renderer * renderer) photon_setdrawblendmode(SDL_Renderer * renderer)
{ {
/* TODO */ 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 (renderer->blendMode)
{
case SDL_BLENDMODE_NONE:
case SDL_BLENDMODE_MASK:
case SDL_BLENDMODE_BLEND:
case SDL_BLENDMODE_ADD:
case SDL_BLENDMODE_MOD:
return 0;
default:
SDL_Unsupported(); SDL_Unsupported();
renderer->blendMode = SDL_BLENDMODE_NONE;
return -1; return -1;
}
return 0;
} }
static int static int
...@@ -1086,6 +1201,9 @@ photon_renderpoint(SDL_Renderer * renderer, int x, int y) ...@@ -1086,6 +1201,9 @@ photon_renderpoint(SDL_Renderer * renderer, int x, int y)
return -1; return -1;
} }
/* Enable blending, if requested */
_photon_set_blending(renderer, renderer->blendMode, renderer->a, SDL_PHOTON_DRAW_BLEND);
switch (rdata->surfaces_type) switch (rdata->surfaces_type)
{ {
case SDL_PHOTON_SURFTYPE_OFFSCREEN: case SDL_PHOTON_SURFTYPE_OFFSCREEN:
...@@ -1099,6 +1217,9 @@ photon_renderpoint(SDL_Renderer * renderer, int x, int y) ...@@ -1099,6 +1217,9 @@ photon_renderpoint(SDL_Renderer * renderer, int x, int y)
break; break;
} }
/* Disable blending, if it was enabled */
_photon_reset_blending(renderer, renderer->blendMode, SDL_PHOTON_DRAW_BLEND);
return 0; return 0;
} }
...@@ -1114,6 +1235,9 @@ photon_renderline(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) ...@@ -1114,6 +1235,9 @@ photon_renderline(SDL_Renderer * renderer, int x1, int y1, int x2, int y2)
return -1; return -1;
} }
/* Enable blending, if requested */
_photon_set_blending(renderer, renderer->blendMode, renderer->a, SDL_PHOTON_DRAW_BLEND);
switch (rdata->surfaces_type) switch (rdata->surfaces_type)
{ {
case SDL_PHOTON_SURFTYPE_OFFSCREEN: case SDL_PHOTON_SURFTYPE_OFFSCREEN:
...@@ -1127,6 +1251,9 @@ photon_renderline(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) ...@@ -1127,6 +1251,9 @@ photon_renderline(SDL_Renderer * renderer, int x1, int y1, int x2, int y2)
break; break;
} }
/* Disable blending, if it was enabled */
_photon_reset_blending(renderer, renderer->blendMode, SDL_PHOTON_DRAW_BLEND);
return 0; return 0;
} }
...@@ -1142,6 +1269,9 @@ photon_renderfill(SDL_Renderer * renderer, const SDL_Rect * rect) ...@@ -1142,6 +1269,9 @@ photon_renderfill(SDL_Renderer * renderer, const SDL_Rect * rect)
return -1; return -1;
} }
/* Enable blending, if requested */
_photon_set_blending(renderer, renderer->blendMode, renderer->a, SDL_PHOTON_DRAW_BLEND);
switch (rdata->surfaces_type) switch (rdata->surfaces_type)
{ {
case SDL_PHOTON_SURFTYPE_OFFSCREEN: case SDL_PHOTON_SURFTYPE_OFFSCREEN:
...@@ -1154,6 +1284,11 @@ photon_renderfill(SDL_Renderer * renderer, const SDL_Rect * rect) ...@@ -1154,6 +1284,11 @@ photon_renderfill(SDL_Renderer * renderer, const SDL_Rect * rect)
default: default:
break; break;
} }
/* Disable blending, if it was enabled */
_photon_reset_blending(renderer, renderer->blendMode, SDL_PHOTON_DRAW_BLEND);
return 0;
} }
static int static int
...@@ -1174,38 +1309,7 @@ photon_rendercopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -1174,38 +1309,7 @@ photon_rendercopy(SDL_Renderer * renderer, SDL_Texture * texture,
return -1; return -1;
} }
/* Switch on requested graphics context modifiers */ _photon_set_blending(renderer, texture->blendMode, texture->a, SDL_PHOTON_TEXTURE_BLEND);
switch(texture->blendMode)
{
case SDL_BLENDMODE_MASK:
/* Enable and set chroma key */
PgSetChromaCx(rdata->gc, PgRGB(255, 255, 255), Pg_CHROMA_SRC_MATCH | Pg_CHROMA_NODRAW);
PgChromaOnCx(rdata->gc);
break;
case SDL_BLENDMODE_BLEND:
/* Enable and set chroma key and alpha blending */
PgSetChromaCx(rdata->gc, PgRGB(255, 255, 255), Pg_CHROMA_SRC_MATCH | Pg_CHROMA_NODRAW);
PgChromaOnCx(rdata->gc);
PgSetAlphaCx(rdata->gc, Pg_ALPHA_OP_SRC_GLOBAL | Pg_BLEND_SRC_As | Pg_BLEND_DST_1mAs, NULL, NULL, texture->a, 0);
PgAlphaOnCx(rdata->gc);
break;
case SDL_BLENDMODE_ADD:
/* Enable and set chroma key and alpha blending */
PgSetChromaCx(rdata->gc, PgRGB(255, 255, 255), Pg_CHROMA_SRC_MATCH | Pg_CHROMA_NODRAW);
PgChromaOnCx(rdata->gc);
PgSetAlphaCx(rdata->gc, Pg_ALPHA_OP_SRC_GLOBAL | Pg_BLEND_SRC_As | Pg_BLEND_DST_1, NULL, NULL, texture->a, 0);
PgAlphaOnCx(rdata->gc);
break;
case SDL_BLENDMODE_MOD:
/* Enable and set alpha blending */
PgSetAlphaCx(rdata->gc, Pg_BLEND_SRC_0 | Pg_BLEND_DST_S, NULL, NULL, 0, 0);
PgAlphaOnCx(rdata->gc);
break;
case SDL_BLENDMODE_NONE:
default:
/* Do nothing */
break;
}
/* Set source blit area */ /* Set source blit area */
src_rect.ul.x = srcrect->x; src_rect.ul.x = srcrect->x;
...@@ -1263,32 +1367,7 @@ photon_rendercopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -1263,32 +1367,7 @@ photon_rendercopy(SDL_Renderer * renderer, SDL_Texture * texture,
break; break;
} }
/* Switch off graphics context modifiers */ _photon_reset_blending(renderer, texture->blendMode, SDL_PHOTON_TEXTURE_BLEND);
switch(texture->blendMode)
{
case SDL_BLENDMODE_MASK:
/* Disable chroma key */
PgChromaOffCx(rdata->gc);
break;
case SDL_BLENDMODE_BLEND:
/* Disable chroma key and alpha blending */
PgChromaOffCx(rdata->gc);
PgAlphaOffCx(rdata->gc);
break;
case SDL_BLENDMODE_ADD:
/* Disable chroma key and alpha blending */
PgChromaOffCx(rdata->gc);
PgAlphaOffCx(rdata->gc);
break;
case SDL_BLENDMODE_MOD:
/* Disable chroma key and alpha blending */
PgAlphaOffCx(rdata->gc);
break;
case SDL_BLENDMODE_NONE:
default:
/* Do nothing */
break;
}
return 0; return 0;
} }
...@@ -1352,6 +1431,20 @@ photon_renderpresent(SDL_Renderer * renderer) ...@@ -1352,6 +1431,20 @@ photon_renderpresent(SDL_Renderer * renderer)
/* finish blit */ /* finish blit */
PgFFlush(Ph_DONE_DRAW); PgFFlush(Ph_DONE_DRAW);
PgWaitHWIdle(); PgWaitHWIdle();
/* Check if we are using double buffering */
if ((renderer->info.flags & SDL_RENDERER_PRESENTFLIP2) == SDL_RENDERER_PRESENTFLIP2)
{
rdata->surface_visible_idx=rdata->surface_render_idx;
rdata->surface_render_idx=(rdata->surface_render_idx + 1) % 2;
}
/* Check if we are using triple buffering */
if ((renderer->info.flags & SDL_RENDERER_PRESENTFLIP3) == SDL_RENDERER_PRESENTFLIP3)
{
rdata->surface_visible_idx=rdata->surface_render_idx;
rdata->surface_render_idx=(rdata->surface_render_idx + 1) % 3;
}
} }
static void static void
......
...@@ -38,6 +38,10 @@ ...@@ -38,6 +38,10 @@
#define SDL_PHOTON_SURFTYPE_OFFSCREEN 0x00000001 #define SDL_PHOTON_SURFTYPE_OFFSCREEN 0x00000001
#define SDL_PHOTON_SURFTYPE_PHIMAGE 0x00000002 #define SDL_PHOTON_SURFTYPE_PHIMAGE 0x00000002
#define SDL_PHOTON_UNKNOWN_BLEND 0x00000000
#define SDL_PHOTON_DRAW_BLEND 0x00000001
#define SDL_PHOTON_TEXTURE_BLEND 0x00000002
typedef struct SDL_RenderData typedef struct SDL_RenderData
{ {
SDL_bool enable_vsync; /* VSYNC flip synchronization enable */ SDL_bool enable_vsync; /* VSYNC flip synchronization enable */
......
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