|
@@ -416,20 +416,19 @@ static bool gl_write_texture_code(struct gl_shader_parser *glsp,
|
|
|
|
|
|
const char *function_end = ")";
|
|
|
|
|
|
- if (cf_token_is(cfp, "Sample"))
|
|
|
+ if (cf_token_is(cfp, "Sample")) {
|
|
|
written = gl_write_texture_call(glsp, var, "texture", true);
|
|
|
- else if (cf_token_is(cfp, "SampleBias"))
|
|
|
+ } else if (cf_token_is(cfp, "SampleBias")) {
|
|
|
written = gl_write_texture_call(glsp, var, "texture", true);
|
|
|
- else if (cf_token_is(cfp, "SampleGrad"))
|
|
|
+ } else if (cf_token_is(cfp, "SampleGrad")) {
|
|
|
written = gl_write_texture_call(glsp, var, "textureGrad", true);
|
|
|
- else if (cf_token_is(cfp, "SampleLevel"))
|
|
|
+ } else if (cf_token_is(cfp, "SampleLevel")) {
|
|
|
written = gl_write_texture_call(glsp, var, "textureLod", true);
|
|
|
- else if (cf_token_is(cfp, "Load")) {
|
|
|
- written = gl_write_texture_call(glsp, var, "texelFetch", false);
|
|
|
- dstr_cat(&glsp->gl_string, "(");
|
|
|
- function_end = (strcmp(var->type, "texture3d") == 0)
|
|
|
- ? ").xyz, 0)"
|
|
|
- : ").xy, 0)";
|
|
|
+ } else if (cf_token_is(cfp, "Load")) {
|
|
|
+ const char *const func = (strcmp(var->type, "texture3d") == 0)
|
|
|
+ ? "obs_load_3d"
|
|
|
+ : "obs_load_2d";
|
|
|
+ written = gl_write_texture_call(glsp, var, func, false);
|
|
|
}
|
|
|
|
|
|
if (!written)
|
|
@@ -744,6 +743,26 @@ static bool gl_shader_buildstring(struct gl_shader_parser *glsp)
|
|
|
|
|
|
dstr_copy(&glsp->gl_string, "#version 330\n\n");
|
|
|
dstr_cat(&glsp->gl_string, "const bool obs_glsl_compile = true;\n\n");
|
|
|
+ dstr_cat(&glsp->gl_string,
|
|
|
+ "vec4 obs_load_2d(sampler2D s, ivec3 p_lod)\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "{\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "\tint lod = p_lod.z;\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "\tvec2 size = textureSize(s, lod);\n");
|
|
|
+ dstr_cat(&glsp->gl_string,
|
|
|
+ "\tvec2 p = (vec2(p_lod.xy) + 0.5) / size;\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "\tvec4 color = textureLod(s, p, lod);\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "\treturn color;\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "}\n\n");
|
|
|
+ dstr_cat(&glsp->gl_string,
|
|
|
+ "vec4 obs_load_3d(sampler3D s, ivec4 p_lod)\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "{\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "\tint lod = p_lod.w;\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "\tvec3 size = textureSize(s, lod);\n");
|
|
|
+ dstr_cat(&glsp->gl_string,
|
|
|
+ "\tvec3 p = (vec3(p_lod.xyz) + 0.5) / size;\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "\tvec4 color = textureLod(s, p, lod);\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "\treturn color;\n");
|
|
|
+ dstr_cat(&glsp->gl_string, "}\n\n");
|
|
|
gl_write_params(glsp);
|
|
|
gl_write_inputs(glsp, main_func);
|
|
|
gl_write_outputs(glsp, main_func);
|