vrend: On GLES don't advertise atomic counters for any shader stage
We always want to lower the atomic counters to SSBO on GLES.
Fixes: 447c8c2bfd90ef654f440353745016b68bbcfc33
renderer: Do not expose atomic counter availability for fragment shader
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/873>
diff --git a/.gitlab-ci/expectations/host/virgl-gles-fails.txt b/.gitlab-ci/expectations/host/virgl-gles-fails.txt
index 92c7780..6c11680 100644
--- a/.gitlab-ci/expectations/host/virgl-gles-fails.txt
+++ b/.gitlab-ci/expectations/host/virgl-gles-fails.txt
@@ -258,7 +258,6 @@
spec@arb_sample_shading@samplemask 4@noms partition,Fail
spec@arb_sample_shading@samplemask 4@sample mask_in_one,Fail
spec@arb_seamless_cube_map@arb_seamless_cubemap,Fail
-spec@arb_shader_atomic_counter_ops@execution@all_touch_test,Fail
spec@arb_shader_atomic_counters@fragment-discard,Fail
spec@arb_shader_image_load_store@early-z,ExpectedFail
spec@arb_shader_image_load_store@early-z@occlusion query test/early-z pass,ExpectedFail
diff --git a/.gitlab-ci/expectations/virt/virgl-gles-fails.txt b/.gitlab-ci/expectations/virt/virgl-gles-fails.txt
index 89e4472..435619b 100644
--- a/.gitlab-ci/expectations/virt/virgl-gles-fails.txt
+++ b/.gitlab-ci/expectations/virt/virgl-gles-fails.txt
@@ -273,7 +273,6 @@
spec@arb_sample_shading@samplemask 4@noms partition,Fail
spec@arb_sample_shading@samplemask 4@sample mask_in_one,Fail
spec@arb_seamless_cube_map@arb_seamless_cubemap,Fail
-spec@arb_shader_atomic_counter_ops@execution@all_touch_test,Fail
spec@arb_shader_image_load_store@bitcast,Fail
spec@arb_shader_image_load_store@bitcast@r11f_g11f_b10f to rgba8_snorm bitcast test,Fail
spec@arb_shader_image_load_store@bitcast@r32f to rgba8_snorm bitcast test,Fail
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index d40e80b..c6c5789 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -11293,49 +11293,57 @@
}
if (has_feature(feat_atomic_counters)) {
- glGetIntegerv(GL_MAX_VERTEX_ATOMIC_COUNTERS,
- (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_VERTEX));
- glGetIntegerv(GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS,
- (GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_VERTEX));
- /* OpenGL ES doesn't have the atomicCounter*() operations, force lowering to ssbo */
- if (gles_ver > 0) {
- caps->v2.max_atomic_counters[PIPE_SHADER_FRAGMENT] = 0;
- } else {
+ /* On GLES hosts we want atomics to be lowered to SSBOs */
+ if (gl_ver > 0) {
+ glGetIntegerv(GL_MAX_VERTEX_ATOMIC_COUNTERS,
+ (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_VERTEX));
glGetIntegerv(GL_MAX_FRAGMENT_ATOMIC_COUNTERS,
(GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_FRAGMENT));
+
+ if (has_feature(feat_geometry_shader)) {
+ glGetIntegerv(GL_MAX_GEOMETRY_ATOMIC_COUNTERS,
+ (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_GEOMETRY));
+ }
+
+ if (has_feature(feat_tessellation)) {
+ glGetIntegerv(GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS,
+ (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_TESS_CTRL));
+ glGetIntegerv(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS,
+ (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_TESS_EVAL));
+ }
+
+ if (has_feature(feat_compute_shader)) {
+ glGetIntegerv(GL_MAX_COMPUTE_ATOMIC_COUNTERS,
+ (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_COMPUTE));
+ }
+
+ glGetIntegerv(GL_MAX_COMBINED_ATOMIC_COUNTERS,
+ (GLint*)&caps->v2.max_combined_atomic_counters);
}
+ glGetIntegerv(GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS,
+ (GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_VERTEX));
+
glGetIntegerv(GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS,
(GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_FRAGMENT));
- if (has_feature(feat_geometry_shader)) {
- glGetIntegerv(GL_MAX_GEOMETRY_ATOMIC_COUNTERS,
- (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_GEOMETRY));
+ if (has_feature(feat_geometry_shader))
glGetIntegerv(GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS,
(GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_GEOMETRY));
- }
if (has_feature(feat_tessellation)) {
- glGetIntegerv(GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS,
- (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_TESS_CTRL));
glGetIntegerv(GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS,
(GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_TESS_CTRL));
- glGetIntegerv(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS,
- (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_TESS_EVAL));
glGetIntegerv(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS,
(GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_TESS_EVAL));
}
if (has_feature(feat_compute_shader)) {
- glGetIntegerv(GL_MAX_COMPUTE_ATOMIC_COUNTERS,
- (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_COMPUTE));
glGetIntegerv(GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS,
(GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_COMPUTE));
}
- glGetIntegerv(GL_MAX_COMBINED_ATOMIC_COUNTERS,
- (GLint*)&caps->v2.max_combined_atomic_counters);
glGetIntegerv(GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS,
(GLint*)&caps->v2.max_combined_atomic_counter_buffers);
}