Fixed bug 1750 - Directfb renderer does not support SDL_RENDERER_TARGETTEXTURE
tomaszewski.p DirectFB renderer does not support SDL_RENDERER_TARGETTEXTURE what makes it incompatible with GL or GLES(2) renderers. Attached patched: - adds support for SDL_RENDERER_TARGETTEXTURE, - DirectFB RenderCopy converts destination rectangle from floats to ints, - fixes whitespaces to be the same in whole file.
This commit is contained in:
parent
2422c520ac
commit
203b9839d2
1 changed files with 93 additions and 72 deletions
|
@ -116,6 +116,7 @@ static int DirectFB_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * r
|
||||||
static int DirectFB_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect,
|
static int DirectFB_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect,
|
||||||
Uint32 format, const void * pixels, int pitch);
|
Uint32 format, const void * pixels, int pitch);
|
||||||
static int DirectFB_UpdateViewport(SDL_Renderer * renderer);
|
static int DirectFB_UpdateViewport(SDL_Renderer * renderer);
|
||||||
|
static int DirectFB_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||||
|
|
||||||
static int PrepareDraw(SDL_Renderer * renderer);
|
static int PrepareDraw(SDL_Renderer * renderer);
|
||||||
|
|
||||||
|
@ -149,6 +150,7 @@ typedef struct
|
||||||
int lastBlendMode;
|
int lastBlendMode;
|
||||||
DFBSurfaceBlittingFlags blitFlags;
|
DFBSurfaceBlittingFlags blitFlags;
|
||||||
DFBSurfaceDrawingFlags drawFlags;
|
DFBSurfaceDrawingFlags drawFlags;
|
||||||
|
IDirectFBSurface* target;
|
||||||
} DirectFB_RenderData;
|
} DirectFB_RenderData;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -237,7 +239,7 @@ static void
|
||||||
SetBlendMode(DirectFB_RenderData * data, int blendMode,
|
SetBlendMode(DirectFB_RenderData * data, int blendMode,
|
||||||
DirectFB_TextureData * source)
|
DirectFB_TextureData * source)
|
||||||
{
|
{
|
||||||
IDirectFBSurface *destsurf = get_dfb_surface(data->window);
|
IDirectFBSurface *destsurf = data->target;
|
||||||
|
|
||||||
//FIXME: check for format change
|
//FIXME: check for format change
|
||||||
if (1 || data->lastBlendMode != blendMode) {
|
if (1 || data->lastBlendMode != blendMode) {
|
||||||
|
@ -339,7 +341,7 @@ int
|
||||||
DirectFB_RenderClear(SDL_Renderer * renderer)
|
DirectFB_RenderClear(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
IDirectFBSurface *destsurf = get_dfb_surface(data->window);
|
IDirectFBSurface *destsurf = data->target;
|
||||||
|
|
||||||
DirectFB_ActivateRenderer(renderer);
|
DirectFB_ActivateRenderer(renderer);
|
||||||
|
|
||||||
|
@ -390,6 +392,7 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
renderer->DestroyTexture = DirectFB_DestroyTexture;
|
renderer->DestroyTexture = DirectFB_DestroyTexture;
|
||||||
renderer->DestroyRenderer = DirectFB_DestroyRenderer;
|
renderer->DestroyRenderer = DirectFB_DestroyRenderer;
|
||||||
renderer->UpdateViewport = DirectFB_UpdateViewport;
|
renderer->UpdateViewport = DirectFB_UpdateViewport;
|
||||||
|
renderer->SetRenderTarget = DirectFB_SetRenderTarget;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
renderer->QueryTexturePixels = DirectFB_QueryTexturePixels;
|
renderer->QueryTexturePixels = DirectFB_QueryTexturePixels;
|
||||||
|
@ -406,9 +409,10 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
renderer->driverdata = data;
|
renderer->driverdata = data;
|
||||||
|
|
||||||
renderer->info.flags =
|
renderer->info.flags =
|
||||||
SDL_RENDERER_ACCELERATED;
|
SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE;
|
||||||
|
|
||||||
data->window = window;
|
data->window = window;
|
||||||
|
data->target = winsurf;
|
||||||
|
|
||||||
data->flipflags = DSFLIP_PIPELINE | DSFLIP_BLIT;
|
data->flipflags = DSFLIP_PIPELINE | DSFLIP_BLIT;
|
||||||
|
|
||||||
|
@ -449,7 +453,6 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
static void
|
static void
|
||||||
DirectFB_ActivateRenderer(SDL_Renderer * renderer)
|
DirectFB_ActivateRenderer(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
|
|
||||||
SDL_DFB_RENDERERDATA(renderer);
|
SDL_DFB_RENDERERDATA(renderer);
|
||||||
SDL_Window *window = renderer->window;
|
SDL_Window *window = renderer->window;
|
||||||
SDL_DFB_WINDOWDATA(window);
|
SDL_DFB_WINDOWDATA(window);
|
||||||
|
@ -892,11 +895,28 @@ DirectFB_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int DirectFB_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
|
{
|
||||||
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
|
DirectFB_TextureData *tex_data = NULL;
|
||||||
|
|
||||||
|
DirectFB_ActivateRenderer(renderer);
|
||||||
|
if (texture) {
|
||||||
|
tex_data = (DirectFB_TextureData *) texture->driverdata;
|
||||||
|
data->target = tex_data->surface;
|
||||||
|
} else {
|
||||||
|
data->target = get_dfb_surface(data->window);
|
||||||
|
}
|
||||||
|
data->lastBlendMode = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
PrepareDraw(SDL_Renderer * renderer)
|
PrepareDraw(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
IDirectFBSurface *destsurf = get_dfb_surface(data->window);
|
IDirectFBSurface *destsurf = data->target;
|
||||||
|
|
||||||
Uint8 r, g, b, a;
|
Uint8 r, g, b, a;
|
||||||
|
|
||||||
|
@ -932,7 +952,7 @@ static int DirectFB_RenderDrawPoints(SDL_Renderer * renderer,
|
||||||
const SDL_FPoint * points, int count)
|
const SDL_FPoint * points, int count)
|
||||||
{
|
{
|
||||||
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
IDirectFBSurface *destsurf = get_dfb_surface(data->window);
|
IDirectFBSurface *destsurf = data->target;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
DirectFB_ActivateRenderer(renderer);
|
DirectFB_ActivateRenderer(renderer);
|
||||||
|
@ -949,7 +969,7 @@ static int DirectFB_RenderDrawLines(SDL_Renderer * renderer,
|
||||||
const SDL_FPoint * points, int count)
|
const SDL_FPoint * points, int count)
|
||||||
{
|
{
|
||||||
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
IDirectFBSurface *destsurf = get_dfb_surface(data->window);
|
IDirectFBSurface *destsurf = data->target;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
DirectFB_ActivateRenderer(renderer);
|
DirectFB_ActivateRenderer(renderer);
|
||||||
|
@ -972,7 +992,7 @@ static int
|
||||||
DirectFB_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count)
|
DirectFB_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count)
|
||||||
{
|
{
|
||||||
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
IDirectFBSurface *destsurf = get_dfb_surface(data->window);
|
IDirectFBSurface *destsurf = data->target;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
DirectFB_ActivateRenderer(renderer);
|
DirectFB_ActivateRenderer(renderer);
|
||||||
|
@ -992,7 +1012,7 @@ static int
|
||||||
DirectFB_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects, int count)
|
DirectFB_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects, int count)
|
||||||
{
|
{
|
||||||
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
IDirectFBSurface *destsurf = get_dfb_surface(data->window);
|
IDirectFBSurface *destsurf = data->target;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
DirectFB_ActivateRenderer(renderer);
|
DirectFB_ActivateRenderer(renderer);
|
||||||
|
@ -1013,7 +1033,7 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||||
const SDL_Rect * srcrect, const SDL_FRect * dstrect)
|
const SDL_Rect * srcrect, const SDL_FRect * dstrect)
|
||||||
{
|
{
|
||||||
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
IDirectFBSurface *destsurf = get_dfb_surface(data->window);
|
IDirectFBSurface *destsurf = data->target;
|
||||||
DirectFB_TextureData *texturedata =
|
DirectFB_TextureData *texturedata =
|
||||||
(DirectFB_TextureData *) texture->driverdata;
|
(DirectFB_TextureData *) texture->driverdata;
|
||||||
Uint8 alpha, r, g, b;
|
Uint8 alpha, r, g, b;
|
||||||
|
@ -1079,7 +1099,7 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||||
}
|
}
|
||||||
|
|
||||||
SDLtoDFBRect(srcrect, &sr);
|
SDLtoDFBRect(srcrect, &sr);
|
||||||
SDLtoDFBRect(dstrect, &dr);
|
SDLtoDFBRect_Float(dstrect, &dr);
|
||||||
|
|
||||||
alpha = r = g = b = 0xff;
|
alpha = r = g = b = 0xff;
|
||||||
if (texture->modMode & SDL_TEXTUREMODULATE_ALPHA){
|
if (texture->modMode & SDL_TEXTUREMODULATE_ALPHA){
|
||||||
|
@ -1189,7 +1209,6 @@ DirectFB_DestroyRenderer(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(data->window);
|
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(data->window);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (display->palette) {
|
if (display->palette) {
|
||||||
SDL_DelPaletteWatch(display->palette, DisplayPaletteChanged, data);
|
SDL_DelPaletteWatch(display->palette, DisplayPaletteChanged, data);
|
||||||
|
@ -1205,7 +1224,8 @@ DirectFB_DestroyRenderer(SDL_Renderer * renderer)
|
||||||
static int
|
static int
|
||||||
DirectFB_UpdateViewport(SDL_Renderer * renderer)
|
DirectFB_UpdateViewport(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
IDirectFBSurface *winsurf = get_dfb_surface(renderer->window);
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
|
IDirectFBSurface *winsurf = data->target;
|
||||||
DFBRegion dreg;
|
DFBRegion dreg;
|
||||||
|
|
||||||
dreg.x1 = renderer->viewport.x;
|
dreg.x1 = renderer->viewport.x;
|
||||||
|
@ -1225,7 +1245,8 @@ DirectFB_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
|
||||||
void * laypixels;
|
void * laypixels;
|
||||||
int laypitch;
|
int laypitch;
|
||||||
DFBSurfacePixelFormat dfb_format;
|
DFBSurfacePixelFormat dfb_format;
|
||||||
IDirectFBSurface *winsurf = get_dfb_surface(renderer->window);
|
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
|
||||||
|
IDirectFBSurface *winsurf = data->target;
|
||||||
|
|
||||||
DirectFB_ActivateRenderer(renderer);
|
DirectFB_ActivateRenderer(renderer);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue