Re: [Mesa-dev] [PATCH 05/11] mesa: add double uniform support.

2014-08-24 Thread Dave Airlie
 It's hard to tell from just the patch whether this restriction is
 enforced:

 (15) Can the 64-bit uniform APIs be used to load values for uniforms of
  type bool, bvec2, bvec3, or bvec4?

   RESOLVED:  No.  OpenGL 2.0 and beyond did allow bool variable to be
   set with Uniform*i* and Uniform*f APIs, and OpenGL 3.0 extended that
   support to Uniform*ui* for orthogonality.  But it seems pointless to
   extended this capability forward to 64-bit Uniform APIs as well.

Good catch it wasn't, I've just submitted a piglit test for this.

Dave.
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 05/11] mesa: add double uniform support.

2014-08-22 Thread Ian Romanick
It's hard to tell from just the patch whether this restriction is
enforced:

(15) Can the 64-bit uniform APIs be used to load values for uniforms of
 type bool, bvec2, bvec3, or bvec4?

  RESOLVED:  No.  OpenGL 2.0 and beyond did allow bool variable to be
  set with Uniform*i* and Uniform*f APIs, and OpenGL 3.0 extended that
  support to Uniform*ui* for orthogonality.  But it seems pointless to
  extended this capability forward to 64-bit Uniform APIs as well.


On 08/14/2014 03:52 AM, Dave Airlie wrote:
 From: Dave Airlie airl...@redhat.com
 
 This adds support for the new uniform interfaces
 from ARB_gpu_shader_fp64.
 
 Signed-off-by: Dave Airlie airl...@redhat.com
 ---
  src/mesa/main/uniform_query.cpp   | 50 +
  src/mesa/main/uniforms.c  | 91 
 +++
  src/mesa/main/uniforms.h  |  3 +-
  src/mesa/program/ir_to_mesa.cpp   | 17 +++-
  src/mesa/program/prog_parameter.c | 16 ---
  5 files changed, 143 insertions(+), 34 deletions(-)
 
 diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
 index 7e630e6..d7024cb 100644
 --- a/src/mesa/main/uniform_query.cpp
 +++ b/src/mesa/main/uniform_query.cpp
 @@ -449,6 +449,9 @@ log_uniform(const void *values, enum glsl_base_type 
 basicType,
case GLSL_TYPE_FLOAT:
printf(%g , v[i].f);
break;
 +  case GLSL_TYPE_DOUBLE:
 +  printf(%g , *(double* )v[i * 2].f);
 +  break;
default:
assert(!Should not get here.);
break;
 @@ -509,11 +512,11 @@ _mesa_propagate_uniforms_to_driver_storage(struct 
 gl_uniform_storage *uni,
  */
 const unsigned components = MAX2(1, uni-type-vector_elements);
 const unsigned vectors = MAX2(1, uni-type-matrix_columns);
 -
 +   const int dmul = uni-type-base_type == GLSL_TYPE_DOUBLE ? 2 : 1;
 /* Store the data in the driver's requested type in the driver's storage
  * areas.
  */
 -   unsigned src_vector_byte_stride = components * 4;
 +   unsigned src_vector_byte_stride = components * 4 * dmul;
  
 for (i = 0; i  uni-num_driver_storage; i++) {
struct gl_uniform_driver_storage *const store = 
 uni-driver_storage[i];
 @@ -612,6 +615,7 @@ _mesa_uniform(struct gl_context *ctx, struct 
 gl_shader_program *shProg,
 unsigned components;
 unsigned src_components;
 enum glsl_base_type basicType;
 +   int size_mul = 1;
  
 struct gl_uniform_storage *const uni =
validate_uniform_parameters(ctx, shProg, location, count,
 @@ -670,6 +674,26 @@ _mesa_uniform(struct gl_context *ctx, struct 
 gl_shader_program *shProg,
basicType = GLSL_TYPE_INT;
src_components = 4;
break;
 +   case GL_DOUBLE:
 +  basicType = GLSL_TYPE_DOUBLE;
 +  src_components = 1;
 +  size_mul = 2;
 +  break;
 +   case GL_DOUBLE_VEC2:
 +  basicType = GLSL_TYPE_DOUBLE;
 +  src_components = 2;
 +  size_mul = 2;
 +  break;
 +   case GL_DOUBLE_VEC3:
 +  basicType = GLSL_TYPE_DOUBLE;
 +  src_components = 3;
 +  size_mul = 2;
 +  break;
 +   case GL_DOUBLE_VEC4:
 +  basicType = GLSL_TYPE_DOUBLE;
 +  src_components = 4;
 +  size_mul = 2;
 +  break;
 case GL_BOOL:
 case GL_BOOL_VEC2:
 case GL_BOOL_VEC3:
 @@ -683,6 +707,15 @@ _mesa_uniform(struct gl_context *ctx, struct 
 gl_shader_program *shProg,
 case GL_FLOAT_MAT4x2:
 case GL_FLOAT_MAT4x3:
 case GL_FLOAT_MAT4:
 +   case GL_DOUBLE_MAT2:
 +   case GL_DOUBLE_MAT2x3:
 +   case GL_DOUBLE_MAT2x4:
 +   case GL_DOUBLE_MAT3x2:
 +   case GL_DOUBLE_MAT3:
 +   case GL_DOUBLE_MAT3x4:
 +   case GL_DOUBLE_MAT4x2:
 +   case GL_DOUBLE_MAT4x3:
 +   case GL_DOUBLE_MAT4:
 default:
_mesa_problem(NULL, Invalid type in %s, __func__);
return;
 @@ -789,7 +822,7 @@ _mesa_uniform(struct gl_context *ctx, struct 
 gl_shader_program *shProg,
  */
 if (!uni-type-is_boolean()) {
memcpy(uni-storage[components * offset], values,
 -  sizeof(uni-storage[0]) * components * count);
 +  sizeof(uni-storage[0]) * components * count * size_mul);
 } else {
const union gl_constant_value *src =
(const union gl_constant_value *) values;
 @@ -892,13 +925,14 @@ extern C void
  _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program 
 *shProg,
GLuint cols, GLuint rows,
   GLint location, GLsizei count,
 - GLboolean transpose, const GLfloat *values)
 + GLboolean transpose,
 + const GLvoid *values, GLenum type)
  {
 unsigned offset;
 unsigned vectors;
 unsigned components;
 unsigned elements;
 -
 +   int size_mul = mesa_type_is_double(type) ? 2 : 1;
 struct gl_uniform_storage *const uni =
validate_uniform_parameters(ctx, shProg, location, count,
offset, glUniformMatrix, false);
 @@ -936,7 +970,7 @@ 

[Mesa-dev] [PATCH 05/11] mesa: add double uniform support.

2014-08-14 Thread Dave Airlie
From: Dave Airlie airl...@redhat.com

This adds support for the new uniform interfaces
from ARB_gpu_shader_fp64.

Signed-off-by: Dave Airlie airl...@redhat.com
---
 src/mesa/main/uniform_query.cpp   | 50 +
 src/mesa/main/uniforms.c  | 91 +++
 src/mesa/main/uniforms.h  |  3 +-
 src/mesa/program/ir_to_mesa.cpp   | 17 +++-
 src/mesa/program/prog_parameter.c | 16 ---
 5 files changed, 143 insertions(+), 34 deletions(-)

diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index 7e630e6..d7024cb 100644
--- a/src/mesa/main/uniform_query.cpp
+++ b/src/mesa/main/uniform_query.cpp
@@ -449,6 +449,9 @@ log_uniform(const void *values, enum glsl_base_type 
basicType,
   case GLSL_TYPE_FLOAT:
 printf(%g , v[i].f);
 break;
+  case GLSL_TYPE_DOUBLE:
+printf(%g , *(double* )v[i * 2].f);
+break;
   default:
 assert(!Should not get here.);
 break;
@@ -509,11 +512,11 @@ _mesa_propagate_uniforms_to_driver_storage(struct 
gl_uniform_storage *uni,
 */
const unsigned components = MAX2(1, uni-type-vector_elements);
const unsigned vectors = MAX2(1, uni-type-matrix_columns);
-
+   const int dmul = uni-type-base_type == GLSL_TYPE_DOUBLE ? 2 : 1;
/* Store the data in the driver's requested type in the driver's storage
 * areas.
 */
-   unsigned src_vector_byte_stride = components * 4;
+   unsigned src_vector_byte_stride = components * 4 * dmul;
 
for (i = 0; i  uni-num_driver_storage; i++) {
   struct gl_uniform_driver_storage *const store = uni-driver_storage[i];
@@ -612,6 +615,7 @@ _mesa_uniform(struct gl_context *ctx, struct 
gl_shader_program *shProg,
unsigned components;
unsigned src_components;
enum glsl_base_type basicType;
+   int size_mul = 1;
 
struct gl_uniform_storage *const uni =
   validate_uniform_parameters(ctx, shProg, location, count,
@@ -670,6 +674,26 @@ _mesa_uniform(struct gl_context *ctx, struct 
gl_shader_program *shProg,
   basicType = GLSL_TYPE_INT;
   src_components = 4;
   break;
+   case GL_DOUBLE:
+  basicType = GLSL_TYPE_DOUBLE;
+  src_components = 1;
+  size_mul = 2;
+  break;
+   case GL_DOUBLE_VEC2:
+  basicType = GLSL_TYPE_DOUBLE;
+  src_components = 2;
+  size_mul = 2;
+  break;
+   case GL_DOUBLE_VEC3:
+  basicType = GLSL_TYPE_DOUBLE;
+  src_components = 3;
+  size_mul = 2;
+  break;
+   case GL_DOUBLE_VEC4:
+  basicType = GLSL_TYPE_DOUBLE;
+  src_components = 4;
+  size_mul = 2;
+  break;
case GL_BOOL:
case GL_BOOL_VEC2:
case GL_BOOL_VEC3:
@@ -683,6 +707,15 @@ _mesa_uniform(struct gl_context *ctx, struct 
gl_shader_program *shProg,
case GL_FLOAT_MAT4x2:
case GL_FLOAT_MAT4x3:
case GL_FLOAT_MAT4:
+   case GL_DOUBLE_MAT2:
+   case GL_DOUBLE_MAT2x3:
+   case GL_DOUBLE_MAT2x4:
+   case GL_DOUBLE_MAT3x2:
+   case GL_DOUBLE_MAT3:
+   case GL_DOUBLE_MAT3x4:
+   case GL_DOUBLE_MAT4x2:
+   case GL_DOUBLE_MAT4x3:
+   case GL_DOUBLE_MAT4:
default:
   _mesa_problem(NULL, Invalid type in %s, __func__);
   return;
@@ -789,7 +822,7 @@ _mesa_uniform(struct gl_context *ctx, struct 
gl_shader_program *shProg,
 */
if (!uni-type-is_boolean()) {
   memcpy(uni-storage[components * offset], values,
-sizeof(uni-storage[0]) * components * count);
+sizeof(uni-storage[0]) * components * count * size_mul);
} else {
   const union gl_constant_value *src =
 (const union gl_constant_value *) values;
@@ -892,13 +925,14 @@ extern C void
 _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
 GLuint cols, GLuint rows,
  GLint location, GLsizei count,
- GLboolean transpose, const GLfloat *values)
+ GLboolean transpose,
+ const GLvoid *values, GLenum type)
 {
unsigned offset;
unsigned vectors;
unsigned components;
unsigned elements;
-
+   int size_mul = mesa_type_is_double(type) ? 2 : 1;
struct gl_uniform_storage *const uni =
   validate_uniform_parameters(ctx, shProg, location, count,
   offset, glUniformMatrix, false);
@@ -936,7 +970,7 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct 
gl_shader_program *shProg,
}
 
if (ctx-_Shader-Flags  GLSL_UNIFORMS) {
-  log_uniform(values, GLSL_TYPE_FLOAT, components, vectors, count,
+  log_uniform(values, uni-type-base_type, components, vectors, count,
  bool(transpose), shProg, location, uni);
}
 
@@ -963,11 +997,11 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct 
gl_shader_program *shProg,
 
if (!transpose) {
   memcpy(uni-storage[elements * offset], values,
-sizeof(uni-storage[0]) * elements * count);
+sizeof(uni-storage[0]) * elements * count * size_mul);