23 #if SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED
25 #include "SDL_stdinc.h"
60 SDL_bool GL_ARB_texture_rectangle_supported;
77 "varying vec4 v_color;\n"
81 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
82 " v_color = gl_Color;\n"
85 "varying vec4 v_color;\n"
89 " gl_FragColor = v_color;\n"
96 "varying vec4 v_color;\n"
97 "varying vec2 v_texCoord;\n"
101 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
102 " v_color = gl_Color;\n"
103 " v_texCoord = vec2(gl_MultiTexCoord0);\n"
106 "varying vec4 v_color;\n"
107 "varying vec2 v_texCoord;\n"
108 "uniform sampler2D tex0;\n"
112 " gl_FragColor = texture2D(tex0, v_texCoord) * v_color;\n"
119 "varying vec4 v_color;\n"
120 "varying vec2 v_texCoord;\n"
124 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
125 " v_color = gl_Color;\n"
126 " v_texCoord = vec2(gl_MultiTexCoord0);\n"
129 "varying vec4 v_color;\n"
130 "varying vec2 v_texCoord;\n"
131 "uniform sampler2D tex0; // Y \n"
132 "uniform sampler2D tex1; // U \n"
133 "uniform sampler2D tex2; // V \n"
136 "const vec3 offset = vec3(-0.0625, -0.5, -0.5);\n"
138 "// RGB coefficients \n"
139 "const vec3 Rcoeff = vec3(1.164, 0.000, 1.596);\n"
140 "const vec3 Gcoeff = vec3(1.164, -0.391, -0.813);\n"
141 "const vec3 Bcoeff = vec3(1.164, 2.018, 0.000);\n"
148 " // Get the Y value \n"
149 " tcoord = v_texCoord;\n"
150 " yuv.x = texture2D(tex0, tcoord).r;\n"
152 " // Get the U and V values \n"
154 " yuv.y = texture2D(tex1, tcoord).r;\n"
155 " yuv.z = texture2D(tex2, tcoord).r;\n"
157 " // Do the color transform \n"
159 " rgb.r = dot(yuv, Rcoeff);\n"
160 " rgb.g = dot(yuv, Gcoeff);\n"
161 " rgb.b = dot(yuv, Bcoeff);\n"
163 " // That was easy. :) \n"
164 " gl_FragColor = vec4(rgb, 1.0) * v_color;\n"
175 sources[0] = defines;
179 ctx->glCompileShaderARB(shader);
187 ctx->glGetInfoLogARB(shader, length,
NULL, info);
189 "Failed to compile shader:\n%s%s\n%s", defines, source, info);
192 "Failed to compile shader:\n%s%s\n%s", defines, source, info);
205 const int num_tmus_bound = 4;
206 const char *vert_defines =
"";
207 const char *frag_defines =
"";
218 if (ctx->GL_ARB_texture_rectangle_supported) {
220 "#define sampler2D sampler2DRect\n"
221 "#define texture2D texture2DRect\n";
225 data->program = ctx->glCreateProgramObjectARB();
229 if (!CompileShader(ctx, data->vert_shader, vert_defines, shader_source[index][0])) {
235 if (!CompileShader(ctx, data->frag_shader, frag_defines, shader_source[index][1])) {
240 ctx->glAttachObjectARB(data->program, data->vert_shader);
241 ctx->glAttachObjectARB(data->program, data->frag_shader);
242 ctx->glLinkProgramARB(data->program);
245 ctx->glUseProgramObjectARB(data->program);
246 for (i = 0; i < num_tmus_bound; ++
i) {
249 location = ctx->glGetUniformLocationARB(data->program, tex_name);
251 ctx->glUniform1iARB(location, i);
254 ctx->glUseProgramObjectARB(0);
262 ctx->glDeleteObjectARB(data->vert_shader);
263 ctx->glDeleteObjectARB(data->frag_shader);
264 ctx->glDeleteObjectARB(data->program);
281 ctx->GL_ARB_texture_rectangle_supported =
SDL_TRUE;
293 ctx->glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateProgramObjectARB");
294 ctx->glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateShaderObjectARB");
297 ctx->glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)
SDL_GL_GetProcAddress(
"glGetObjectParameterivARB");
298 ctx->glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)
SDL_GL_GetProcAddress(
"glGetUniformLocationARB");
303 ctx->glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glUseProgramObjectARB");
304 if (ctx->glGetError &&
305 ctx->glAttachObjectARB &&
306 ctx->glCompileShaderARB &&
307 ctx->glCreateProgramObjectARB &&
308 ctx->glCreateShaderObjectARB &&
309 ctx->glDeleteObjectARB &&
310 ctx->glGetInfoLogARB &&
311 ctx->glGetObjectParameterivARB &&
312 ctx->glGetUniformLocationARB &&
313 ctx->glLinkProgramARB &&
314 ctx->glShaderSourceARB &&
315 ctx->glUniform1iARB &&
316 ctx->glUniform1fARB &&
317 ctx->glUseProgramObjectARB) {
322 if (!shaders_supported) {
329 if (!CompileShaderProgram(ctx, i, &ctx->shaders[i])) {
342 ctx->glUseProgramObjectARB(ctx->shaders[shader].program);
351 DestroyShaderProgram(ctx, &ctx->shaders[i]);
#define GL_OBJECT_INFO_LOG_LENGTH_ARB
DECLSPEC void *SDLCALL SDL_GL_GetProcAddress(const char *proc)
Get the address of an OpenGL function.
GLvoid **typedef void(GLAPIENTRY *PFNGLGETVERTEXATTRIBDVPROC)(GLuint
#define glCreateShaderObjectARB
GLsizei GLsizei GLuint * shaders
DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size)
DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt,...)
#define SDL_stack_free(data)
DECLSPEC void SDLCALL SDL_free(void *mem)
#define glCreateProgramObjectARB
#define GL_OBJECT_COMPILE_STATUS_ARB
struct GL_ShaderContext GL_ShaderContext
#define glAttachObjectARB
#define glCompileShaderARB
void GL_DestroyShaderContext(GL_ShaderContext *ctx)
#define glDeleteObjectARB
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GL_ShaderContext * GL_CreateShaderContext()
#define glGetObjectParameterivARB
#define glUseProgramObjectARB
GLbitfield GLuint program
#define glShaderSourceARB
#define SDL_arraysize(array)
DECLSPEC void SDLCALL SDL_LogError(int category, const char *fmt,...)
Log a message with SDL_LOG_PRIORITY_ERROR.
#define SDL_stack_alloc(type, count)
#define GL_FRAGMENT_SHADER_ARB
#define glGetUniformLocationARB
DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char *extension)
Return true if an OpenGL extension is supported for the current context.
GLsizei GLsizei GLchar * source
void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader)
#define GL_VERTEX_SHADER_ARB