mesa: implement missing glGet(GL_RGBA_SIGNED_COMPONENTS_EXT) query
authorBrian Paul <brianp@vmware.com>
Mon, 6 Jan 2014 19:50:43 +0000 (12:50 -0700)
committerBrian Paul <brianp@vmware.com>
Mon, 6 Jan 2014 20:37:00 +0000 (13:37 -0700)
This is part of the GL_EXT_packed_float extension.

Bugzilla: http://bugs.freedesktop.org/show_bug.cgi?id=73096
Cc: 10.0 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
src/mesa/main/formats.c
src/mesa/main/formats.h
src/mesa/main/get.c
src/mesa/main/get_hash_params.py

index 07d2a72406b022579772b21fbc41bff233757bec..eb2a07ea5f6c88b4f8ddfa5f358c17b3e88ac2bf 100644 (file)
@@ -1966,6 +1966,25 @@ _mesa_is_format_unsigned(gl_format format)
 }
 
 
+/**
+ * Does the given format store signed values?
+ */
+GLboolean
+_mesa_is_format_signed(gl_format format)
+{
+   if (format == MESA_FORMAT_R11_G11_B10_FLOAT) {
+      /* this packed float format only stores unsigned values */
+      return GL_FALSE;
+   }
+   else {
+      const struct gl_format_info *info = _mesa_get_format_info(format);
+      return (info->DataType == GL_SIGNED_NORMALIZED ||
+              info->DataType == GL_INT ||
+              info->DataType == GL_FLOAT);
+   }
+}
+
+
 /**
  * Return color encoding for given format.
  * \return GL_LINEAR or GL_SRGB
index 64b4b9a015ffe920a8e18640a81f6b4c6020cb39..0c91aeaac86915588b89afa458b440a20af0ac93 100644 (file)
@@ -341,6 +341,9 @@ _mesa_is_format_integer_color(gl_format format);
 extern GLboolean
 _mesa_is_format_unsigned(gl_format format);
 
+extern GLboolean
+_mesa_is_format_signed(gl_format format);
+
 extern GLenum
 _mesa_get_format_color_encoding(gl_format format);
 
index 691380898b81c918c60e45aa9d8aa71a6cd1f361..c45a8d156c32ce73abb2a323ce2a651fafae3e41 100644 (file)
@@ -327,6 +327,12 @@ static const int extra_EXT_framebuffer_sRGB_and_new_buffers[] = {
    EXTRA_END
 };
 
+static const int extra_EXT_packed_float[] = {
+   EXT(EXT_packed_float),
+   EXTRA_NEW_BUFFERS,
+   EXTRA_END
+};
+
 static const int extra_EXT_texture_array_es3[] = {
    EXT(EXT_texture_array),
    EXTRA_API_ES3,
@@ -757,6 +763,22 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
         ctx->Texture.Unit[unit].CurrentTex[d->offset]->Name;
       break;
 
+   /* GL_EXT_packed_float */
+   case GL_RGBA_SIGNED_COMPONENTS_EXT:
+      {
+         /* Note: we only check the 0th color attachment. */
+         const struct gl_renderbuffer *rb =
+            ctx->DrawBuffer->_ColorDrawBuffers[0];
+         const GLboolean is_signed =
+            rb ? _mesa_is_format_signed(rb->Format) : GL_FALSE;
+         /* At this time, all color channels have same signedness */
+         v->value_int_4[0] =
+         v->value_int_4[1] =
+         v->value_int_4[2] =
+         v->value_int_4[3] = is_signed;
+      }
+      break;
+
    /* GL_ARB_vertex_buffer_object */
    case GL_VERTEX_ARRAY_BUFFER_BINDING_ARB:
    case GL_NORMAL_ARRAY_BUFFER_BINDING_ARB:
index 653bf62568ba973b7cb3945979f26e48da8d7554..e84be748589bbc227af1d3e5081f9168118c94d4 100644 (file)
@@ -611,6 +611,9 @@ descriptor=[
 # GL_ARB_fragment_program
   [ "FRAGMENT_PROGRAM_ARB", "CONTEXT_BOOL(FragmentProgram.Enabled), extra_ARB_fragment_program" ],
 
+# GL_EXT_packed_float
+  [ "RGBA_SIGNED_COMPONENTS_EXT", "LOC_CUSTOM, TYPE_INT_4, 0, extra_EXT_packed_float" ],
+
 # GL_EXT_depth_bounds_test
   [ "DEPTH_BOUNDS_TEST_EXT", "CONTEXT_BOOL(Depth.BoundsTest), extra_EXT_depth_bounds_test" ],
   [ "DEPTH_BOUNDS_EXT", "CONTEXT_FLOAT2(Depth.BoundsMin), extra_EXT_depth_bounds_test" ],