opengl: pixelart fragment shader uses GLSL version 1.30

This commit is contained in:
Anonymous Maarten
2025-03-16 01:06:03 +01:00
committed by Sam Lantinga
parent 05531c5f4b
commit b9504f247c

View File

@@ -237,9 +237,13 @@ struct GL_ShaderContext
* NOTE: Always use sampler2D, etc here. We'll #define them to the * NOTE: Always use sampler2D, etc here. We'll #define them to the
* texture_rectangle versions if we choose to use that extension. * texture_rectangle versions if we choose to use that extension.
*/ */
static const char *shader_source[NUM_SHADERS][2] = { static struct {
const char *vertex_shader;
const char *fragment_shader;
const char *fragment_version;
} shader_source[NUM_SHADERS] = {
// SHADER_NONE // SHADER_NONE
{ NULL, NULL }, { NULL, NULL, NULL },
// SHADER_SOLID // SHADER_SOLID
{ {
@@ -251,7 +255,9 @@ static const char *shader_source[NUM_SHADERS][2] = {
"void main()\n" "void main()\n"
"{\n" "{\n"
" gl_FragColor = v_color;\n" " gl_FragColor = v_color;\n"
"}" "}",
// fragment version
NULL
}, },
// SHADER_RGB // SHADER_RGB
@@ -269,7 +275,9 @@ static const char *shader_source[NUM_SHADERS][2] = {
" gl_FragColor = texture2D(tex0, v_texCoord);\n" " gl_FragColor = texture2D(tex0, v_texCoord);\n"
" gl_FragColor.a = 1.0;\n" " gl_FragColor.a = 1.0;\n"
" gl_FragColor *= v_color;\n" " gl_FragColor *= v_color;\n"
"}" "}",
// fragment version
NULL
}, },
// SHADER_RGBA // SHADER_RGBA
@@ -284,7 +292,9 @@ static const char *shader_source[NUM_SHADERS][2] = {
"void main()\n" "void main()\n"
"{\n" "{\n"
" gl_FragColor = texture2D(tex0, v_texCoord) * v_color;\n" " gl_FragColor = texture2D(tex0, v_texCoord) * v_color;\n"
"}" "}",
// fragment version
NULL
}, },
// SHADER_RGB_PIXELART // SHADER_RGB_PIXELART
@@ -306,7 +316,9 @@ static const char *shader_source[NUM_SHADERS][2] = {
" gl_FragColor = textureGrad(tex0, uv, dFdx(v_texCoord), dFdy(v_texCoord));\n" " gl_FragColor = textureGrad(tex0, uv, dFdx(v_texCoord), dFdy(v_texCoord));\n"
" gl_FragColor.a = 1.0;\n" " gl_FragColor.a = 1.0;\n"
" gl_FragColor *= v_color;\n" " gl_FragColor *= v_color;\n"
"}" "}",
// fragment version
"#version 130\n"
}, },
// SHADER_RGBA_PIXELART // SHADER_RGBA_PIXELART
@@ -327,7 +339,9 @@ static const char *shader_source[NUM_SHADERS][2] = {
" vec2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;\n" " vec2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;\n"
" gl_FragColor = textureGrad(tex0, uv, dFdx(v_texCoord), dFdy(v_texCoord));\n" " gl_FragColor = textureGrad(tex0, uv, dFdx(v_texCoord), dFdy(v_texCoord));\n"
" gl_FragColor *= v_color;\n" " gl_FragColor *= v_color;\n"
"}" "}",
// fragment version
"#version 130\n"
}, },
#ifdef SDL_HAVE_YUV #ifdef SDL_HAVE_YUV
@@ -337,7 +351,9 @@ static const char *shader_source[NUM_SHADERS][2] = {
TEXTURE_VERTEX_SHADER, TEXTURE_VERTEX_SHADER,
// fragment shader // fragment shader
YUV_SHADER_PROLOGUE YUV_SHADER_PROLOGUE
YUV_SHADER_BODY YUV_SHADER_BODY,
// fragment version
NULL
}, },
// SHADER_NV12_RA // SHADER_NV12_RA
{ {
@@ -345,7 +361,9 @@ static const char *shader_source[NUM_SHADERS][2] = {
TEXTURE_VERTEX_SHADER, TEXTURE_VERTEX_SHADER,
// fragment shader // fragment shader
NV12_SHADER_PROLOGUE NV12_SHADER_PROLOGUE
NV12_RA_SHADER_BODY NV12_RA_SHADER_BODY,
// fragment version
NULL
}, },
// SHADER_NV12_RG // SHADER_NV12_RG
{ {
@@ -353,7 +371,9 @@ static const char *shader_source[NUM_SHADERS][2] = {
TEXTURE_VERTEX_SHADER, TEXTURE_VERTEX_SHADER,
// fragment shader // fragment shader
NV12_SHADER_PROLOGUE NV12_SHADER_PROLOGUE
NV12_RG_SHADER_BODY NV12_RG_SHADER_BODY,
// fragment version
NULL
}, },
// SHADER_NV21_RA // SHADER_NV21_RA
{ {
@@ -361,7 +381,9 @@ static const char *shader_source[NUM_SHADERS][2] = {
TEXTURE_VERTEX_SHADER, TEXTURE_VERTEX_SHADER,
// fragment shader // fragment shader
NV12_SHADER_PROLOGUE NV12_SHADER_PROLOGUE
NV21_RA_SHADER_BODY NV21_RA_SHADER_BODY,
// fragment version
NULL
}, },
// SHADER_NV21_RG // SHADER_NV21_RG
{ {
@@ -369,20 +391,23 @@ static const char *shader_source[NUM_SHADERS][2] = {
TEXTURE_VERTEX_SHADER, TEXTURE_VERTEX_SHADER,
// fragment shader // fragment shader
NV12_SHADER_PROLOGUE NV12_SHADER_PROLOGUE
NV21_RG_SHADER_BODY NV21_RG_SHADER_BODY,
// fragment version
NULL
}, },
#endif // SDL_HAVE_YUV #endif // SDL_HAVE_YUV
}; };
/* *INDENT-ON* */ // clang-format on /* *INDENT-ON* */ // clang-format on
static bool CompileShader(GL_ShaderContext *ctx, GLhandleARB shader, const char *defines, const char *source) static bool CompileShader(GL_ShaderContext *ctx, GLhandleARB shader, const char *version, const char *defines, const char *source)
{ {
GLint status; GLint status;
const char *sources[2]; const char *sources[3];
sources[0] = defines; sources[0] = version;
sources[1] = source; sources[1] = defines;
sources[2] = source;
ctx->glShaderSourceARB(shader, SDL_arraysize(sources), sources, NULL); ctx->glShaderSourceARB(shader, SDL_arraysize(sources), sources, NULL);
ctx->glCompileShaderARB(shader); ctx->glCompileShaderARB(shader);
@@ -413,6 +438,7 @@ static bool CompileShaderProgram(GL_ShaderContext *ctx, int index, GL_ShaderData
const int num_tmus_bound = 4; const int num_tmus_bound = 4;
const char *vert_defines = ""; const char *vert_defines = "";
const char *frag_defines = ""; const char *frag_defines = "";
const char *frag_version = "";
int i; int i;
GLint location; GLint location;
@@ -432,19 +458,22 @@ static bool CompileShaderProgram(GL_ShaderContext *ctx, int index, GL_ShaderData
frag_defines = frag_defines =
"#define UVCoordScale 1.0\n"; "#define UVCoordScale 1.0\n";
} }
if (shader_source[index].fragment_version) {
frag_version = shader_source[index].fragment_version;
}
// Create one program object to rule them all // Create one program object to rule them all
data->program = ctx->glCreateProgramObjectARB(); data->program = ctx->glCreateProgramObjectARB();
// Create the vertex shader // Create the vertex shader
data->vert_shader = ctx->glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); data->vert_shader = ctx->glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
if (!CompileShader(ctx, data->vert_shader, vert_defines, shader_source[index][0])) { if (!CompileShader(ctx, data->vert_shader, "", vert_defines, shader_source[index].vertex_shader)) {
return false; return false;
} }
// Create the fragment shader // Create the fragment shader
data->frag_shader = ctx->glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); data->frag_shader = ctx->glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
if (!CompileShader(ctx, data->frag_shader, frag_defines, shader_source[index][1])) { if (!CompileShader(ctx, data->frag_shader, frag_version, frag_defines, shader_source[index].fragment_shader)) {
return false; return false;
} }