Commit d6279390 authored by Sam Lantinga's avatar Sam Lantinga

Making the API simpler, the renderer present semantics are always having a...

Making the API simpler, the renderer present semantics are always having a backbuffer and then discarding it.  This is best for hardware accelerated rendering.

--HG--
extra : rebase_source : bbe6641fce097c79ccd47f4e1ea6b27683fd0acb
parent 4c06e581
......@@ -151,33 +151,12 @@ typedef enum
*/
typedef enum
{
SDL_RENDERER_SINGLEBUFFER = 0x00000001, /**< Render directly to the
window, if possible */
SDL_RENDERER_PRESENTCOPY = 0x00000002, /**< Present uses a copy from
back buffer to the front
buffer */
SDL_RENDERER_PRESENTFLIP2 = 0x00000004, /**< Present uses a flip,
swapping back buffer and
front buffer */
SDL_RENDERER_PRESENTFLIP3 = 0x00000008, /**< Present uses a flip,
rotating between two back
buffers and a front buffer
*/
SDL_RENDERER_PRESENTDISCARD = 0x00000010, /**< Present leaves the contents
of the backbuffer undefined
*/
SDL_RENDERER_PRESENTVSYNC = 0x00000020, /**< Present is synchronized
with the refresh rate */
SDL_RENDERER_ACCELERATED = 0x00000040 /**< The renderer uses hardware
acceleration */
} SDL_RendererFlags;
} SDL_RendererFlags;
/**
* \brief Information on the capabilities of a render driver or context.
......
......@@ -667,9 +667,7 @@ SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags)
}
/* Create a renderer for the window */
if (SDL_CreateRenderer
(SDL_VideoWindow, -1,
SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTDISCARD) < 0) {
if (SDL_CreateRenderer(SDL_VideoWindow, -1, 0) < 0) {
return NULL;
}
SDL_GetRendererInfo(&SDL_VideoRendererInfo);
......@@ -861,6 +859,7 @@ void
SDL_UpdateRects(SDL_Surface * screen, int numrects, SDL_Rect * rects)
{
int i;
SDL_Rect rect;
if (screen == SDL_ShadowSurface) {
for (i = 0; i < numrects; ++i) {
......@@ -887,18 +886,11 @@ SDL_UpdateRects(SDL_Surface * screen, int numrects, SDL_Rect * rects)
SDL_UpdateTexture(SDL_VideoTexture, rect, pixels, pitch);
}
}
if (SDL_VideoRendererInfo.flags & SDL_RENDERER_PRESENTCOPY) {
for (i = 0; i < numrects; ++i) {
SDL_RenderCopy(SDL_VideoTexture, &rects[i], &rects[i]);
}
} else {
SDL_Rect rect;
rect.x = 0;
rect.y = 0;
rect.w = screen->w;
rect.h = screen->h;
SDL_RenderCopy(SDL_VideoTexture, &rect, &rect);
}
rect.x = 0;
rect.y = 0;
rect.w = screen->w;
rect.h = screen->h;
SDL_RenderCopy(SDL_VideoTexture, &rect, &rect);
SDL_RenderPresent();
}
}
......
......@@ -112,8 +112,7 @@ SDL_RenderDriver GL_RenderDriver = {
GL_CreateRenderer,
{
"opengl",
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTDISCARD |
SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED),
(SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED),
15,
{
SDL_PIXELFORMAT_INDEX1LSB,
......@@ -252,7 +251,6 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
SDL_Renderer *renderer;
GL_RenderData *data;
GLint value;
int doublebuffer;
/* Render directly to the window, unless we're compositing */
#ifndef __MACOSX__
......@@ -304,8 +302,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->window = window;
renderer->driverdata = data;
renderer->info.flags =
(SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED);
renderer->info.flags = SDL_RENDERER_ACCELERATED;
if (GL_LoadFunctions(data) < 0) {
GL_DestroyRenderer(renderer);
......@@ -337,12 +334,6 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
}
if (SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &doublebuffer) == 0) {
if (!doublebuffer) {
renderer->info.flags |= SDL_RENDERER_SINGLEBUFFER;
}
}
data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);
renderer->info.max_texture_width = value;
data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);
......
......@@ -98,8 +98,7 @@ SDL_RenderDriver GL_ES_RenderDriver = {
GLES_CreateRenderer,
{
"opengl_es",
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTDISCARD |
SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED),
(SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED),
{
/* OpenGL ES 1.x supported formats list */
SDL_PIXELFORMAT_RGBA4444,
......@@ -241,8 +240,7 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->window = window;
renderer->driverdata = data;
renderer->info.flags =
(SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED);
renderer->info.flags = SDL_RENDERER_ACCELERATED;
#if defined(__QNXNTO__)
#if _NTO_VERSION<=641
......
This diff is collapsed.
......@@ -87,10 +87,7 @@ SDL_RenderDriver DirectFB_RenderDriver = {
DirectFB_CreateRenderer,
{
"directfb",
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_PRESENTDISCARD |
SDL_RENDERER_ACCELERATED),
(SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED),
14,
{
SDL_PIXELFORMAT_INDEX4LSB,
......@@ -256,7 +253,6 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
SDL_VideoDisplay *display = window->display;
SDL_Renderer *renderer = NULL;
DirectFB_RenderData *data = NULL;
DFBSurfaceCapabilities scaps;
char *p;
SDL_DFB_CALLOC(renderer, 1, sizeof(*renderer));
......@@ -288,8 +284,7 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->window = window; /* SDL window */
renderer->driverdata = data;
renderer->info.flags =
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTDISCARD;
renderer->info.flags = SDL_RENDERER_ACCELERATED;
data->window = window;
......@@ -301,15 +296,6 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
} else
data->flipflags |= DSFLIP_ONSYNC;
SDL_DFB_CHECKERR(windata->surface->
GetCapabilities(windata->surface, &scaps));
if (scaps & DSCAPS_DOUBLE)
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2;
else if (scaps & DSCAPS_TRIPLE)
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP3;
else
renderer->info.flags |= SDL_RENDERER_SINGLEBUFFER;
data->isyuvdirect = 0; /* default is off! */
p = SDL_getenv(DFBENV_USE_YUV_DIRECT);
if (p)
......
......@@ -59,16 +59,13 @@ SDL_RenderDriver SDL_DUMMY_RenderDriver = {
SDL_DUMMY_CreateRenderer,
{
"dummy",
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
SDL_RENDERER_PRESENTDISCARD),
(0),
}
};
typedef struct
{
int current_screen;
SDL_Surface *screens[3];
SDL_Surface *screen;
} SDL_DUMMY_RenderData;
SDL_Renderer *
......@@ -78,7 +75,6 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags)
SDL_DisplayMode *displayMode = &display->current_mode;
SDL_Renderer *renderer;
SDL_DUMMY_RenderData *data;
int i, n;
int bpp;
Uint32 Rmask, Gmask, Bmask, Amask;
......@@ -117,27 +113,14 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->driverdata = data;
Setup_SoftwareRenderer(renderer);
if (flags & SDL_RENDERER_PRESENTFLIP2) {
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2;
n = 2;
} else if (flags & SDL_RENDERER_PRESENTFLIP3) {
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP3;
n = 3;
} else {
renderer->info.flags |= SDL_RENDERER_PRESENTCOPY;
n = 1;
}
for (i = 0; i < n; ++i) {
data->screens[i] =
SDL_CreateRGBSurface(0, window->w, window->h, bpp, Rmask, Gmask,
Bmask, Amask);
if (!data->screens[i]) {
SDL_DUMMY_DestroyRenderer(renderer);
return NULL;
}
SDL_SetSurfacePalette(data->screens[i], display->palette);
data->screen =
SDL_CreateRGBSurface(0, window->w, window->h, bpp, Rmask, Gmask,
Bmask, Amask);
if (!data->screen) {
SDL_DUMMY_DestroyRenderer(renderer);
return NULL;
}
data->current_screen = 0;
SDL_SetSurfacePalette(data->screen, display->palette);
return renderer;
}
......@@ -148,7 +131,7 @@ SDL_DUMMY_RenderDrawPoints(SDL_Renderer * renderer,
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Surface *target = data->screens[data->current_screen];
SDL_Surface *target = data->screen;
if (renderer->blendMode == SDL_BLENDMODE_NONE) {
Uint32 color = SDL_MapRGBA(target->format,
......@@ -169,7 +152,7 @@ SDL_DUMMY_RenderDrawLines(SDL_Renderer * renderer,
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Surface *target = data->screens[data->current_screen];
SDL_Surface *target = data->screen;
if (renderer->blendMode == SDL_BLENDMODE_NONE) {
Uint32 color = SDL_MapRGBA(target->format,
......@@ -190,7 +173,7 @@ SDL_DUMMY_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects,
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Surface *target = data->screens[data->current_screen];
SDL_Surface *target = data->screen;
if (renderer->blendMode == SDL_BLENDMODE_NONE) {
Uint32 color = SDL_MapRGBA(target->format,
......@@ -212,7 +195,7 @@ SDL_DUMMY_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects,
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Surface *target = data->screens[data->current_screen];
SDL_Surface *target = data->screen;
if (renderer->blendMode == SDL_BLENDMODE_NONE) {
Uint32 color = SDL_MapRGBA(target->format,
......@@ -238,7 +221,7 @@ SDL_DUMMY_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
SDL_VideoDisplay *display = window->display;
if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
SDL_Surface *target = data->screens[data->current_screen];
SDL_Surface *target = data->screen;
void *pixels =
(Uint8 *) target->pixels + dstrect->y * target->pitch +
dstrect->x * target->format->BytesPerPixel;
......@@ -248,7 +231,7 @@ SDL_DUMMY_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
target->pitch);
} else {
SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
SDL_Surface *target = data->screens[data->current_screen];
SDL_Surface *target = data->screen;
SDL_Rect real_srcrect = *srcrect;
SDL_Rect real_dstrect = *dstrect;
......@@ -264,7 +247,7 @@ SDL_DUMMY_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Window *window = renderer->window;
SDL_VideoDisplay *display = window->display;
SDL_Surface *screen = data->screens[data->current_screen];
SDL_Surface *screen = data->screen;
Uint32 screen_format = display->current_mode.format;
Uint8 *screen_pixels = (Uint8 *) screen->pixels +
rect->y * screen->pitch +
......@@ -284,7 +267,7 @@ SDL_DUMMY_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect,
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Window *window = renderer->window;
SDL_VideoDisplay *display = window->display;
SDL_Surface *screen = data->screens[data->current_screen];
SDL_Surface *screen = data->screen;
Uint32 screen_format = display->current_mode.format;
Uint8 *screen_pixels = (Uint8 *) screen->pixels +
rect->y * screen->pitch +
......@@ -308,14 +291,7 @@ SDL_DUMMY_RenderPresent(SDL_Renderer * renderer)
char file[128];
SDL_snprintf(file, sizeof(file), "SDL_window%d-%8.8d.bmp",
renderer->window->id, ++frame_number);
SDL_SaveBMP(data->screens[data->current_screen], file);
}
/* Update the flipping chain, if any */
if (renderer->info.flags & SDL_RENDERER_PRESENTFLIP2) {
data->current_screen = (data->current_screen + 1) % 2;
} else if (renderer->info.flags & SDL_RENDERER_PRESENTFLIP3) {
data->current_screen = (data->current_screen + 1) % 3;
SDL_SaveBMP(data->screen, file);
}
}
......@@ -327,10 +303,8 @@ SDL_DUMMY_DestroyRenderer(SDL_Renderer * renderer)
int i;
if (data) {
for (i = 0; i < SDL_arraysize(data->screens); ++i) {
if (data->screens[i]) {
SDL_FreeSurface(data->screens[i]);
}
if (data->screen) {
SDL_FreeSurface(data->screen);
}
SDL_free(data);
}
......
......@@ -71,7 +71,7 @@ static void NDS_DestroyRenderer(SDL_Renderer * renderer);
SDL_RenderDriver NDS_RenderDriver = {
NDS_CreateRenderer,
{"nds", /* char* name */
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC), /* u32 flags */
(SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC), /* u32 flags */
3, /* u32 num_texture_formats */
{
SDL_PIXELFORMAT_INDEX8,
......
......@@ -134,10 +134,7 @@ SDL_RenderDriver D3D_RenderDriver = {
D3D_CreateRenderer,
{
"d3d",
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC |
SDL_RENDERER_ACCELERATED),
(SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED),
0,
{0},
0,
......@@ -472,19 +469,9 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
} else {
pparams.BackBufferFormat = D3DFMT_UNKNOWN;
}
if (flags & SDL_RENDERER_PRESENTFLIP2) {
pparams.BackBufferCount = 2;
pparams.SwapEffect = D3DSWAPEFFECT_FLIP;
} else if (flags & SDL_RENDERER_PRESENTFLIP3) {
pparams.BackBufferCount = 3;
pparams.SwapEffect = D3DSWAPEFFECT_FLIP;
} else if (flags & SDL_RENDERER_PRESENTCOPY) {
pparams.BackBufferCount = 1;
pparams.SwapEffect = D3DSWAPEFFECT_COPY;
} else {
pparams.BackBufferCount = 1;
pparams.SwapEffect = D3DSWAPEFFECT_DISCARD;
}
pparams.BackBufferCount = 1;
pparams.SwapEffect = D3DSWAPEFFECT_DISCARD;
if (window->flags & SDL_WINDOW_FULLSCREEN) {
pparams.Windowed = FALSE;
pparams.FullScreen_RefreshRateInHz =
......@@ -534,24 +521,6 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
return NULL;
}
IDirect3DSwapChain9_Release(chain);
switch (pparams.SwapEffect) {
case D3DSWAPEFFECT_COPY:
renderer->info.flags |= SDL_RENDERER_PRESENTCOPY;
break;
case D3DSWAPEFFECT_FLIP:
switch (pparams.BackBufferCount) {
case 2:
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2;
break;
case 3:
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP3;
break;
}
break;
case D3DSWAPEFFECT_DISCARD:
renderer->info.flags |= SDL_RENDERER_PRESENTDISCARD;
break;
}
if (pparams.PresentationInterval == D3DPRESENT_INTERVAL_ONE) {
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
}
......
......@@ -6,7 +6,7 @@
#include "common.h"
#define VIDEO_USAGE \
"[--video driver] [--renderer driver] [--info all|video|modes|render|event] [--display N] [--fullscreen | --windows N] [--title title] [--icon icon.bmp] [--center | --position X,Y] [--geometry WxH] [--depth N] [--refresh R] [--vsync] [--noframe] [--resize] [--minimize] [--maximize] [--grab] [--double] [--triple]"
"[--video driver] [--renderer driver] [--info all|video|modes|render|event] [--display N] [--fullscreen | --windows N] [--title title] [--icon icon.bmp] [--center | --position X,Y] [--geometry WxH] [--depth N] [--refresh R] [--vsync] [--noframe] [--resize] [--minimize] [--maximize] [--grab]"
#define AUDIO_USAGE \
"[--rate N] [--format U8|S8|U16|U16LE|U16BE|S16|S16LE|S16BE] [--channels N] [--samples N]"
......@@ -211,14 +211,6 @@ CommonArg(CommonState * state, int index)
state->render_flags |= SDL_RENDERER_PRESENTVSYNC;
return 1;
}
if (SDL_strcasecmp(argv[index], "--double") == 0) {
state->render_flags |= SDL_RENDERER_PRESENTFLIP2;
return 1;
}
if (SDL_strcasecmp(argv[index], "--triple") == 0) {
state->render_flags |= SDL_RENDERER_PRESENTFLIP3;
return 1;
}
if (SDL_strcasecmp(argv[index], "--noframe") == 0) {
state->window_flags |= SDL_WINDOW_BORDERLESS;
return 1;
......@@ -329,21 +321,6 @@ static void
PrintRendererFlag(Uint32 flag)
{
switch (flag) {
case SDL_RENDERER_SINGLEBUFFER:
fprintf(stderr, "SingleBuffer");
break;
case SDL_RENDERER_PRESENTCOPY:
fprintf(stderr, "PresentCopy");
break;
case SDL_RENDERER_PRESENTFLIP2:
fprintf(stderr, "PresentFlip2");
break;
case SDL_RENDERER_PRESENTFLIP3:
fprintf(stderr, "PresentFlip3");
break;
case SDL_RENDERER_PRESENTDISCARD:
fprintf(stderr, "PresentDiscard");
break;
case SDL_RENDERER_PRESENTVSYNC:
fprintf(stderr, "PresentVSync");
break;
......
......@@ -102,7 +102,7 @@ int main(int argc,char** argv) {
printf("Could not create shaped window for SDL_Shape.\n");
exit(-4);
}
if(SDL_CreateRenderer(window,-1,SDL_RENDERER_PRESENTFLIP2) == -1) {
if(SDL_CreateRenderer(window,-1,0) == -1) {
SDL_DestroyWindow(window);
for(i=0;i<num_pictures;i++)
SDL_FreeSurface(pictures[i].surface);
......
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