mesa: implement glGetActiveUniform for FP16 uniforms
authorMarek Olšák <marek.olsak@amd.com>
Sun, 14 Feb 2021 12:21:31 +0000 (07:21 -0500)
committerMarge Bot <eric+marge@anholt.net>
Tue, 13 Apr 2021 05:07:42 +0000 (05:07 +0000)
We must return the types before lowering to 16 bits.

Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9050>

src/mesa/main/shader_query.cpp

index bd782b2..cb86fdd 100644 (file)
@@ -61,6 +61,41 @@ DECL_RESOURCE_FUNC(XFV, gl_transform_feedback_varying_info);
 DECL_RESOURCE_FUNC(XFB, gl_transform_feedback_buffer);
 DECL_RESOURCE_FUNC(SUB, gl_subroutine_function);
 
+static GLenum
+mediump_to_highp_type(GLenum type)
+{
+   switch (type) {
+   case GL_FLOAT16_NV:
+      return GL_FLOAT;
+   case GL_FLOAT16_VEC2_NV:
+      return GL_FLOAT_VEC2;
+   case GL_FLOAT16_VEC3_NV:
+      return GL_FLOAT_VEC3;
+   case GL_FLOAT16_VEC4_NV:
+      return GL_FLOAT_VEC4;
+   case GL_FLOAT16_MAT2_AMD:
+      return GL_FLOAT_MAT2;
+   case GL_FLOAT16_MAT3_AMD:
+      return GL_FLOAT_MAT3;
+   case GL_FLOAT16_MAT4_AMD:
+      return GL_FLOAT_MAT4;
+   case GL_FLOAT16_MAT2x3_AMD:
+      return GL_FLOAT_MAT2x3;
+   case GL_FLOAT16_MAT2x4_AMD:
+      return GL_FLOAT_MAT2x4;
+   case GL_FLOAT16_MAT3x2_AMD:
+      return GL_FLOAT_MAT3x2;
+   case GL_FLOAT16_MAT3x4_AMD:
+      return GL_FLOAT_MAT3x4;
+   case GL_FLOAT16_MAT4x2_AMD:
+      return GL_FLOAT_MAT4x2;
+   case GL_FLOAT16_MAT4x3_AMD:
+      return GL_FLOAT_MAT4x3;
+   default:
+      return type;
+   }
+}
+
 static void
 bind_attrib_location(struct gl_context *ctx,
                      struct gl_shader_program *const shProg, GLuint index,
@@ -1372,13 +1407,16 @@ _mesa_program_resource_prop(struct gl_shader_program *shProg,
       case GL_UNIFORM:
       case GL_BUFFER_VARIABLE:
          *val = RESOURCE_UNI(res)->type->gl_type;
+         *val = mediump_to_highp_type(*val);
          return 1;
       case GL_PROGRAM_INPUT:
       case GL_PROGRAM_OUTPUT:
          *val = RESOURCE_VAR(res)->type->gl_type;
+         *val = mediump_to_highp_type(*val);
          return 1;
       case GL_TRANSFORM_FEEDBACK_VARYING:
          *val = RESOURCE_XFV(res)->Type;
+         *val = mediump_to_highp_type(*val);
          return 1;
       default:
          goto invalid_operation;