Re: [Mesa-dev] [PATCH 05/20] mesa: add double uniform support. (v2)

2014-09-04 Thread Brian Paul

On 09/03/2014 10:15 PM, Dave Airlie wrote:

From: Dave Airlie 

This adds support for the new uniform interfaces
from ARB_gpu_shader_fp64.

v2:
support ARB_separate_shader_objects ProgramUniform*d* (Ian)
don't allow boolean uniforms to be updated (issue 15) (Ian)

Signed-off-by: Dave Airlie 
---
  src/mesa/main/uniform_query.cpp   |  52 +--
  src/mesa/main/uniforms.c  | 185 ++
  src/mesa/main/uniforms.h  |   3 +-
  src/mesa/program/ir_to_mesa.cpp   |  17 +++-
  src/mesa/program/prog_parameter.c |  16 ++--
  5 files changed, 238 insertions(+), 35 deletions(-)

diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index 4cd2bca..aa392d7 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;


If the "4" there really denotes sizeof(float) maybe dmul should be set 
to sizeof(float) or sizeof(double) and get rid of the 4.





 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;
@@ -697,7 +730,7 @@ _mesa_uniform(struct gl_context *ctx, struct 
gl_shader_program *shProg,
 bool match;
 switch (uni->type->base_type) {
 case GLSL_TYPE_BOOL:
-  match = true;
+  match = (basicType != GLSL_TYPE_DOUBLE);
break;
 case GLSL_TYPE_SAMPLER:
 case GLSL_TYPE_IMAGE:
@@ -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_uni

[Mesa-dev] [PATCH 05/20] mesa: add double uniform support. (v2)

2014-09-03 Thread Dave Airlie
From: Dave Airlie 

This adds support for the new uniform interfaces
from ARB_gpu_shader_fp64.

v2:
support ARB_separate_shader_objects ProgramUniform*d* (Ian)
don't allow boolean uniforms to be updated (issue 15) (Ian)

Signed-off-by: Dave Airlie 
---
 src/mesa/main/uniform_query.cpp   |  52 +--
 src/mesa/main/uniforms.c  | 185 ++
 src/mesa/main/uniforms.h  |   3 +-
 src/mesa/program/ir_to_mesa.cpp   |  17 +++-
 src/mesa/program/prog_parameter.c |  16 ++--
 5 files changed, 238 insertions(+), 35 deletions(-)

diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index 4cd2bca..aa392d7 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;
@@ -697,7 +730,7 @@ _mesa_uniform(struct gl_context *ctx, struct 
gl_shader_program *shProg,
bool match;
switch (uni->type->base_type) {
case GLSL_TYPE_BOOL:
-  match = true;
+  match = (basicType != GLSL_TYPE_DOUBLE);
   break;
case GLSL_TYPE_SAMPLER:
case GLSL_TYPE_IMAGE:
@@ -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->ty