diff --git a/src/vrend_blitter.c b/src/vrend_blitter.c index bac82d3..908a82d 100644 --- a/src/vrend_blitter.c +++ b/src/vrend_blitter.c @@ -52,6 +52,7 @@ struct vrend_blitter_ctx { virgl_gl_context gl_context; bool initialised; + bool use_gles; GLuint vaoid; @@ -94,7 +95,8 @@ static bool blit_build_vs_passthrough(struct vrend_blitter_ctx *blit_ctx) { blit_ctx->vs = glCreateShader(GL_VERTEX_SHADER); - if (!build_and_check(blit_ctx->vs, VS_PASSTHROUGH)) { + if (!build_and_check(blit_ctx->vs, + blit_ctx->use_gles ? VS_PASSTHROUGH_GLES : VS_PASSTHROUGH_GL)) { glDeleteShader(blit_ctx->vs); blit_ctx->vs = 0; return false; @@ -143,7 +145,8 @@ static GLuint blit_build_frag_tex_col(struct vrend_blitter_ctx *blit_ctx, int tg tgsi_tex_target == TGSI_TEXTURE_SHADOWCUBE_ARRAY) ext_str = "#extension GL_ARB_texture_cube_map_array : require\n"; - snprintf(shader_buf, 4096, FS_TEXFETCH_COL, ext_str, vrend_shader_samplertypeconv(tgsi_tex_target, &is_shad), twm, ""); + snprintf(shader_buf, 4096, blit_ctx->use_gles ? FS_TEXFETCH_COL_GLES : FS_TEXFETCH_COL_GL, + ext_str, vrend_shader_samplertypeconv(tgsi_tex_target, &is_shad), twm, ""); fs_id = glCreateShader(GL_FRAGMENT_SHADER); @@ -196,7 +199,8 @@ static GLuint blit_build_frag_tex_col_emu_alpha(struct vrend_blitter_ctx *blit_c tgsi_tex_target == TGSI_TEXTURE_SHADOWCUBE_ARRAY) ext_str = "#extension GL_ARB_texture_cube_map_array : require\n"; - snprintf(shader_buf, 4096, FS_TEXFETCH_COL_ALPHA_DEST, ext_str, vrend_shader_samplertypeconv(tgsi_tex_target, &is_shad), twm, ""); + snprintf(shader_buf, 4096, blit_ctx->use_gles ? FS_TEXFETCH_COL_ALPHA_DEST_GLES : FS_TEXFETCH_COL_ALPHA_DEST_GL, + ext_str, vrend_shader_samplertypeconv(tgsi_tex_target, &is_shad), twm, ""); fs_id = glCreateShader(GL_FRAGMENT_SHADER); @@ -245,7 +249,8 @@ static GLuint blit_build_frag_tex_writedepth(struct vrend_blitter_ctx *blit_ctx, break; } - snprintf(shader_buf, 4096, FS_TEXFETCH_DS, vrend_shader_samplertypeconv(tgsi_tex_target, &is_shad), twm); + snprintf(shader_buf, 4096, blit_ctx->use_gles ? FS_TEXFETCH_DS_GLES : FS_TEXFETCH_DS_GL, + vrend_shader_samplertypeconv(tgsi_tex_target, &is_shad), twm); fs_id = glCreateShader(GL_FRAGMENT_SHADER); @@ -278,7 +283,8 @@ static GLuint blit_build_frag_blit_msaa_depth(struct vrend_blitter_ctx *blit_ctx return 0; } - snprintf(shader_buf, 4096, FS_TEXFETCH_DS_MSAA, vrend_shader_samplertypeconv(tgsi_tex_target, &is_shad), ivec, twm); + snprintf(shader_buf, 4096, blit_ctx->use_gles ? FS_TEXFETCH_DS_MSAA_GLES : FS_TEXFETCH_DS_MSAA_GL, + vrend_shader_samplertypeconv(tgsi_tex_target, &is_shad), ivec, twm); fs_id = glCreateShader(GL_FRAGMENT_SHADER); @@ -362,6 +368,7 @@ static void vrend_renderer_init_blit_ctx(struct vrend_blitter_ctx *blit_ctx) } blit_ctx->initialised = true; + blit_ctx->use_gles = epoxy_is_desktop_gl() == 0; ctx_params.shared = true; for (uint32_t i = 0; i < ARRAY_SIZE(gl_versions); i++) { ctx_params.major_ver = gl_versions[i].major; diff --git a/src/vrend_blitter.h b/src/vrend_blitter.h index ad1f196..07573a7 100644 --- a/src/vrend_blitter.h +++ b/src/vrend_blitter.h @@ -26,8 +26,21 @@ /* shaders for blitting */ -#define VS_PASSTHROUGH \ +#define HEADER_GL \ + "// Blitter\n" \ "#version 130\n" \ + +#define HEADER_GLES \ + "// Blitter\n" \ + "#version 300 es\n" \ + "precision mediump float;\n" \ + +#define OUTFRAG_GLES \ + "out vec4 FragColor;\n" \ + "#define gl_FragColor FragColor\n" + + +#define VS_PASSTHROUGH_BODY \ "in vec4 arg0;\n" \ "in vec4 arg1;\n" \ "out vec4 tc;\n" \ @@ -36,8 +49,11 @@ " tc = arg1;\n" \ "}\n" -#define FS_TEXFETCH_COL \ - "#version 130\n" \ +#define VS_PASSTHROUGH_GL HEADER_GL VS_PASSTHROUGH_BODY +#define VS_PASSTHROUGH_GLES HEADER_GLES VS_PASSTHROUGH_BODY + + +#define FS_TEXFETCH_COL_BODY \ "%s" \ "uniform sampler%s samp;\n" \ "in vec4 tc;\n" \ @@ -45,31 +61,44 @@ " gl_FragColor = texture(samp, tc%s)%s;\n" \ "}\n" -#define FS_TEXFETCH_COL_ALPHA_DEST \ - "#version 130\n" \ +#define FS_TEXFETCH_COL_GL HEADER_GL FS_TEXFETCH_COL_BODY +#define FS_TEXFETCH_COL_GLES HEADER_GLES OUTFRAG_GLES FS_TEXFETCH_COL_BODY + + +#define FS_TEXFETCH_COL_ALPHA_DEST_BODY \ "%s" \ "uniform sampler%s samp;\n" \ "in vec4 tc;\n" \ "void main() {\n" \ - " vec4 temp = texture(samp, tc%s)%s;\n" \ - " gl_FragColor = temp.aaaa;\n" \ + " vec4 temp = texture(samp, tc%s)%s;\n" \ + " gl_FragColor = temp.aaaa;\n" \ "}\n" -#define FS_TEXFETCH_DS \ - "#version 130\n" \ +#define FS_TEXFETCH_COL_ALPHA_DEST_GL HEADER_GL FS_TEXFETCH_COL_ALPHA_DEST_BODY +#define FS_TEXFETCH_COL_ALPHA_DEST_GLES HEADER_GLES OUTFRAG_GLES FS_TEXFETCH_COL_ALPHA_DEST_BODY + + +#define FS_TEXFETCH_DS_BODY \ "uniform sampler%s samp;\n" \ "in vec4 tc;\n" \ "void main() {\n" \ " gl_FragDepth = float(texture(samp, tc%s).x);\n" \ "}\n" -#define FS_TEXFETCH_DS_MSAA \ - "#version 130\n" \ - "#extension GL_ARB_texture_multisample : enable\n" \ - "uniform sampler%s samp;\n" \ - "in vec4 tc;\n" \ - "void main() {\n" \ +#define FS_TEXFETCH_DS_GL HEADER_GL FS_TEXFETCH_DS_BODY +#define FS_TEXFETCH_DS_GLES HEADER_GLES FS_TEXFETCH_DS_BODY + + +#define FS_TEXFETCH_DS_MSAA_BODY \ + "#extension GL_ARB_texture_multisample : enable\n" \ + "uniform sampler%s samp;\n" \ + "in vec4 tc;\n" \ + "void main() {\n" \ " gl_FragDepth = float(texelFetch(samp, %s(tc%s), int(tc.z)).x);\n" \ "}\n" +#define FS_TEXFETCH_DS_MSAA_GL HEADER_GL FS_TEXFETCH_DS_MSAA_BODY +#define FS_TEXFETCH_DS_MSAA_GLES HEADER_GLES FS_TEXFETCH_DS_MSAA_BODY + + #endif