Commit 08aadfdc authored by Sam Lantinga's avatar Sam Lantinga

Hmm, this isn't going to work, is it?

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404171
parent df2499a3
...@@ -93,9 +93,9 @@ SDL_PROC_UNUSED(void, glDrawBuffer, (GLenum mode)) ...@@ -93,9 +93,9 @@ SDL_PROC_UNUSED(void, glDrawBuffer, (GLenum mode))
SDL_PROC_UNUSED(void, glDrawElements, SDL_PROC_UNUSED(void, glDrawElements,
(GLenum mode, GLsizei count, GLenum type, (GLenum mode, GLsizei count, GLenum type,
const GLvoid * indices)) const GLvoid * indices))
SDL_PROC_UNUSED(void, glDrawPixels, SDL_PROC(void, glDrawPixels,
(GLsizei width, GLsizei height, GLenum format, GLenum type, (GLsizei width, GLsizei height, GLenum format, GLenum type,
const GLvoid * pixels)) const GLvoid * pixels))
SDL_PROC_UNUSED(void, glEdgeFlag, (GLboolean flag)) SDL_PROC_UNUSED(void, glEdgeFlag, (GLboolean flag))
SDL_PROC_UNUSED(void, glEdgeFlagPointer, SDL_PROC_UNUSED(void, glEdgeFlagPointer,
(GLsizei stride, const GLvoid * pointer)) (GLsizei stride, const GLvoid * pointer))
...@@ -315,9 +315,9 @@ SDL_PROC_UNUSED(void, glRasterPos4s, ...@@ -315,9 +315,9 @@ SDL_PROC_UNUSED(void, glRasterPos4s,
(GLshort x, GLshort y, GLshort z, GLshort w)) (GLshort x, GLshort y, GLshort z, GLshort w))
SDL_PROC_UNUSED(void, glRasterPos4sv, (const GLshort * v)) SDL_PROC_UNUSED(void, glRasterPos4sv, (const GLshort * v))
SDL_PROC_UNUSED(void, glReadBuffer, (GLenum mode)) SDL_PROC_UNUSED(void, glReadBuffer, (GLenum mode))
SDL_PROC_UNUSED(void, glReadPixels, SDL_PROC(void, glReadPixels,
(GLint x, GLint y, GLsizei width, GLsizei height, (GLint x, GLint y, GLsizei width, GLsizei height,
GLenum format, GLenum type, GLvoid * pixels)) GLenum format, GLenum type, GLvoid * pixels))
SDL_PROC_UNUSED(void, glRectd, SDL_PROC_UNUSED(void, glRectd,
(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)) (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2))
SDL_PROC_UNUSED(void, glRectdv, (const GLdouble * v1, const GLdouble * v2)) SDL_PROC_UNUSED(void, glRectdv, (const GLdouble * v1, const GLdouble * v2))
......
...@@ -583,168 +583,180 @@ static const char *fragment_program_UYVY_source_code = "!!ARBfp1.0\n" ...@@ -583,168 +583,180 @@ static const char *fragment_program_UYVY_source_code = "!!ARBfp1.0\n"
/* ...and we're done! */ /* ...and we're done! */
"END\n"; "END\n";
static __inline__ SDL_bool
static int convert_format(GL_RenderData *renderdata, Uint32 pixel_format,
GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) GLint* internalFormat, GLenum* format, GLenum* type)
{ {
GL_RenderData *renderdata = (GL_RenderData *) renderer->driverdata; switch (pixel_format) {
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
GL_TextureData *data;
GLint internalFormat;
GLenum format, type;
int texture_w, texture_h;
GLuint shader = 0;
GLenum result;
switch (texture->format) {
case SDL_PIXELFORMAT_INDEX1LSB: case SDL_PIXELFORMAT_INDEX1LSB:
case SDL_PIXELFORMAT_INDEX1MSB: case SDL_PIXELFORMAT_INDEX1MSB:
internalFormat = GL_RGB; *internalFormat = GL_RGB;
format = GL_COLOR_INDEX; *format = GL_COLOR_INDEX;
type = GL_BITMAP; *type = GL_BITMAP;
break; break;
case SDL_PIXELFORMAT_INDEX8: case SDL_PIXELFORMAT_INDEX8:
if (!renderdata->GL_EXT_paletted_texture_supported) { if (!renderdata->GL_EXT_paletted_texture_supported) {
SDL_SetError("Unsupported texture format"); return SDL_FALSE;
return -1;
} }
internalFormat = GL_COLOR_INDEX8_EXT; *internalFormat = GL_COLOR_INDEX8_EXT;
format = GL_COLOR_INDEX; *format = GL_COLOR_INDEX;
type = GL_UNSIGNED_BYTE; *type = GL_UNSIGNED_BYTE;
break; break;
case SDL_PIXELFORMAT_RGB332: case SDL_PIXELFORMAT_RGB332:
internalFormat = GL_R3_G3_B2; *internalFormat = GL_R3_G3_B2;
format = GL_RGB; *format = GL_RGB;
type = GL_UNSIGNED_BYTE_3_3_2; *type = GL_UNSIGNED_BYTE_3_3_2;
break; break;
case SDL_PIXELFORMAT_RGB444: case SDL_PIXELFORMAT_RGB444:
internalFormat = GL_RGB4; *internalFormat = GL_RGB4;
format = GL_RGB; *format = GL_RGB;
type = GL_UNSIGNED_SHORT_4_4_4_4; *type = GL_UNSIGNED_SHORT_4_4_4_4;
break; break;
case SDL_PIXELFORMAT_RGB555: case SDL_PIXELFORMAT_RGB555:
internalFormat = GL_RGB5; *internalFormat = GL_RGB5;
format = GL_RGB; *format = GL_RGB;
type = GL_UNSIGNED_SHORT_5_5_5_1; *type = GL_UNSIGNED_SHORT_5_5_5_1;
break; break;
case SDL_PIXELFORMAT_ARGB4444: case SDL_PIXELFORMAT_ARGB4444:
internalFormat = GL_RGBA4; *internalFormat = GL_RGBA4;
format = GL_BGRA; *format = GL_BGRA;
type = GL_UNSIGNED_SHORT_4_4_4_4_REV; *type = GL_UNSIGNED_SHORT_4_4_4_4_REV;
break; break;
case SDL_PIXELFORMAT_ARGB1555: case SDL_PIXELFORMAT_ARGB1555:
internalFormat = GL_RGB5_A1; *internalFormat = GL_RGB5_A1;
format = GL_BGRA; *format = GL_BGRA;
type = GL_UNSIGNED_SHORT_1_5_5_5_REV; *type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
break; break;
case SDL_PIXELFORMAT_RGB565: case SDL_PIXELFORMAT_RGB565:
internalFormat = GL_RGB8; *internalFormat = GL_RGB8;
format = GL_RGB; *format = GL_RGB;
type = GL_UNSIGNED_SHORT_5_6_5; *type = GL_UNSIGNED_SHORT_5_6_5;
break; break;
case SDL_PIXELFORMAT_RGB24: case SDL_PIXELFORMAT_RGB24:
internalFormat = GL_RGB8; *internalFormat = GL_RGB8;
format = GL_RGB; *format = GL_RGB;
type = GL_UNSIGNED_BYTE; *type = GL_UNSIGNED_BYTE;
break; break;
case SDL_PIXELFORMAT_RGB888: case SDL_PIXELFORMAT_RGB888:
internalFormat = GL_RGB8; *internalFormat = GL_RGB8;
format = GL_BGRA; *format = GL_BGRA;
type = GL_UNSIGNED_BYTE; *type = GL_UNSIGNED_BYTE;
break; break;
case SDL_PIXELFORMAT_BGR24: case SDL_PIXELFORMAT_BGR24:
internalFormat = GL_RGB8; *internalFormat = GL_RGB8;
format = GL_BGR; *format = GL_BGR;
type = GL_UNSIGNED_BYTE; *type = GL_UNSIGNED_BYTE;
break; break;
case SDL_PIXELFORMAT_BGR888: case SDL_PIXELFORMAT_BGR888:
internalFormat = GL_RGB8; *internalFormat = GL_RGB8;
format = GL_RGBA; *format = GL_RGBA;
type = GL_UNSIGNED_BYTE; *type = GL_UNSIGNED_BYTE;
break; break;
case SDL_PIXELFORMAT_ARGB8888: case SDL_PIXELFORMAT_ARGB8888:
#ifdef __MACOSX__ #ifdef __MACOSX__
internalFormat = GL_RGBA; *internalFormat = GL_RGBA;
format = GL_BGRA; *format = GL_BGRA;
type = GL_UNSIGNED_INT_8_8_8_8_REV; *type = GL_UNSIGNED_INT_8_8_8_8_REV;
#else #else
internalFormat = GL_RGBA8; *internalFormat = GL_RGBA8;
format = GL_BGRA; *format = GL_BGRA;
type = GL_UNSIGNED_BYTE; *type = GL_UNSIGNED_BYTE;
#endif #endif
break; break;
case SDL_PIXELFORMAT_ABGR8888: case SDL_PIXELFORMAT_ABGR8888:
internalFormat = GL_RGBA8; *internalFormat = GL_RGBA8;
format = GL_RGBA; *format = GL_RGBA;
type = GL_UNSIGNED_BYTE; *type = GL_UNSIGNED_BYTE;
break; break;
case SDL_PIXELFORMAT_ARGB2101010: case SDL_PIXELFORMAT_ARGB2101010:
internalFormat = GL_RGB10_A2; *internalFormat = GL_RGB10_A2;
format = GL_BGRA; *format = GL_BGRA;
type = GL_UNSIGNED_INT_2_10_10_10_REV; *type = GL_UNSIGNED_INT_2_10_10_10_REV;
break; break;
case SDL_PIXELFORMAT_UYVY: case SDL_PIXELFORMAT_UYVY:
if (renderdata->GL_APPLE_ycbcr_422_supported) { if (renderdata->GL_APPLE_ycbcr_422_supported) {
internalFormat = GL_RGB; *internalFormat = GL_RGB;
format = GL_YCBCR_422_APPLE; *format = GL_YCBCR_422_APPLE;
#if SDL_BYTEORDER == SDL_LIL_ENDIAN #if SDL_BYTEORDER == SDL_LIL_ENDIAN
type = GL_UNSIGNED_SHORT_8_8_APPLE; *type = GL_UNSIGNED_SHORT_8_8_APPLE;
#else #else
type = GL_UNSIGNED_SHORT_8_8_REV_APPLE; *type = GL_UNSIGNED_SHORT_8_8_REV_APPLE;
#endif #endif
} else if (renderdata->GL_MESA_ycbcr_texture_supported) { } else if (renderdata->GL_MESA_ycbcr_texture_supported) {
internalFormat = GL_RGB; *internalFormat = GL_RGB;
format = GL_YCBCR_MESA; *format = GL_YCBCR_MESA;
#if SDL_BYTEORDER == SDL_LIL_ENDIAN #if SDL_BYTEORDER == SDL_LIL_ENDIAN
type = GL_UNSIGNED_SHORT_8_8_MESA; *type = GL_UNSIGNED_SHORT_8_8_MESA;
#else #else
type = GL_UNSIGNED_SHORT_8_8_REV_MESA; *type = GL_UNSIGNED_SHORT_8_8_REV_MESA;
#endif #endif
} else if (renderdata->GL_ARB_fragment_program_supported) { } else if (renderdata->GL_ARB_fragment_program_supported) {
if (renderdata->fragment_program_UYVY == 0) { *internalFormat = GL_RGBA;
renderdata->fragment_program_UYVY = *format = GL_RGBA;
compile_shader(renderdata, GL_FRAGMENT_PROGRAM_ARB, *type = GL_UNSIGNED_BYTE;
fragment_program_UYVY_source_code);
if (renderdata->fragment_program_UYVY == 0) {
SDL_SetError("Fragment program compile error");
return -1;
}
}
shader = renderdata->fragment_program_UYVY;
internalFormat = GL_RGBA;
format = GL_RGBA;
type = GL_UNSIGNED_BYTE;
} else { } else {
SDL_SetError("Unsupported texture format"); return SDL_FALSE;
return -1;
} }
break; break;
case SDL_PIXELFORMAT_YUY2: case SDL_PIXELFORMAT_YUY2:
if (renderdata->GL_APPLE_ycbcr_422_supported) { if (renderdata->GL_APPLE_ycbcr_422_supported) {
internalFormat = GL_RGB; *internalFormat = GL_RGB;
format = GL_YCBCR_422_APPLE; *format = GL_YCBCR_422_APPLE;
#if SDL_BYTEORDER == SDL_LIL_ENDIAN #if SDL_BYTEORDER == SDL_LIL_ENDIAN
type = GL_UNSIGNED_SHORT_8_8_REV_APPLE; *type = GL_UNSIGNED_SHORT_8_8_REV_APPLE;
#else #else
type = GL_UNSIGNED_SHORT_8_8_APPLE; *type = GL_UNSIGNED_SHORT_8_8_APPLE;
#endif #endif
} else if (renderdata->GL_MESA_ycbcr_texture_supported) { } else if (renderdata->GL_MESA_ycbcr_texture_supported) {
internalFormat = GL_RGB; *internalFormat = GL_RGB;
format = GL_YCBCR_MESA; *format = GL_YCBCR_MESA;
#if SDL_BYTEORDER == SDL_LIL_ENDIAN #if SDL_BYTEORDER == SDL_LIL_ENDIAN
type = GL_UNSIGNED_SHORT_8_8_REV_MESA; *type = GL_UNSIGNED_SHORT_8_8_REV_MESA;
#else #else
type = GL_UNSIGNED_SHORT_8_8_MESA; *type = GL_UNSIGNED_SHORT_8_8_MESA;
#endif #endif
} else { } else {
SDL_SetError("Unsupported texture format"); return SDL_FALSE;
return -1;
} }
break; break;
default: default:
return SDL_FALSE;
}
return SDL_TRUE;
}
static int
GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
{
GL_RenderData *renderdata = (GL_RenderData *) renderer->driverdata;
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
GL_TextureData *data;
GLint internalFormat;
GLenum format, type;
int texture_w, texture_h;
GLuint shader = 0;
GLenum result;
if (!convert_format(renderdata, texture->format, &internalFormat,
&format, &type)) {
SDL_SetError("Unsupported texture format"); SDL_SetError("Unsupported texture format");
return -1; return -1;
} }
if (texture->format == SDL_PIXELFORMAT_UYVY &&
!renderdata->GL_APPLE_ycbcr_422_supported &&
!renderdata->GL_MESA_ycbcr_texture_supported &&
renderdata->GL_ARB_fragment_program_supported) {
if (renderdata->fragment_program_UYVY == 0) {
renderdata->fragment_program_UYVY =
compile_shader(renderdata, GL_FRAGMENT_PROGRAM_ARB,
fragment_program_UYVY_source_code);
if (renderdata->fragment_program_UYVY == 0) {
SDL_SetError("Fragment program compile error");
return -1;
}
}
shader = renderdata->fragment_program_UYVY;
}
data = (GL_TextureData *) SDL_calloc(1, sizeof(*data)); data = (GL_TextureData *) SDL_calloc(1, sizeof(*data));
if (!data) { if (!data) {
...@@ -1244,7 +1256,29 @@ static int ...@@ -1244,7 +1256,29 @@ static int
GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
void * pixels, int pitch) void * pixels, int pitch)
{ {
//glReadPixels(rect->x, rect->y+rect->h-1, rect->w, rect->h, GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
Uint32 pixel_format = display->current_mode.format;
GLint internalFormat;
GLenum format, type;
if (!convert_format(data, pixel_format, &internalFormat, &format, &type)) {
SDL_SetError("Unsupported pixel format");
return -1;
}
if (pixel_format == SDL_PIXELFORMAT_INDEX1LSB) {
data->glPixelStorei(GL_PACK_LSB_FIRST, 1);
} else if (pixel_format == SDL_PIXELFORMAT_INDEX1MSB) {
data->glPixelStorei(GL_PACK_LSB_FIRST, 0);
}
data->glPixelStorei(GL_PACK_ALIGNMENT, 1);
data->glPixelStorei(GL_PACK_ROW_LENGTH,
-2 * (pitch / bytes_per_pixel(pixel_format)));
data->glReadPixels(rect->x, rect->y+rect->h-1, rect->w, rect->h,
format, type, pixels + (rect->h-1)*pitch);
} }
static int static int
......
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