Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorMike Erwin <significant.bit@gmail.com>2017-04-13 00:56:26 +0300
committerMike Erwin <significant.bit@gmail.com>2017-04-13 08:07:49 +0300
commit02fd9a1aaf14469b7ea1c4a78fdd966319038369 (patch)
treed0fc696926d44d9cd1bb67774417cec80c2ea8c9 /intern
parentc0a9e388b34298daa6c9f1e9c8f68fde85e319a8 (diff)
Gawain: improve ShaderInterface
- builtin uniforms match what Blender needs - set input counts in struct (stupid mistake) - look up uniforms by name - look up builtin uniforms by enum - check attrib/uniform locations for error
Diffstat (limited to 'intern')
-rw-r--r--intern/gawain/gawain/shader_interface.h7
-rw-r--r--intern/gawain/src/shader_interface.c48
2 files changed, 45 insertions, 10 deletions
diff --git a/intern/gawain/gawain/shader_interface.h b/intern/gawain/gawain/shader_interface.h
index bdb0bbf4a8c..9864759015f 100644
--- a/intern/gawain/gawain/shader_interface.h
+++ b/intern/gawain/gawain/shader_interface.h
@@ -20,7 +20,9 @@ typedef enum {
UNIFORM_PROJECTION_3D, // mat4 ProjectionMatrix
UNIFORM_MVP_3D, // mat4 ModelViewProjectionMatrix
UNIFORM_NORMAL_3D, // mat3 NormalMatrix
- UNIFORM_INV_NORMAL_3D, // mat3 InverseNormalMatrix
+
+ UNIFORM_MODELVIEW_INV_3D, // mat4 ModelViewInverseMatrix
+ UNIFORM_PROJECTION_INV_3D, // mat4 ProjectionInverseMatrix
UNIFORM_MODELVIEW_2D, // mat3 ModelViewMatrix
UNIFORM_PROJECTION_2D, // mat3 ProjectionMatrix
@@ -47,3 +49,6 @@ typedef struct {
ShaderInterface* ShaderInterface_create(GLint program_id);
void ShaderInterface_discard(ShaderInterface*);
+
+const ShaderInput* ShaderInterface_uniform(const ShaderInterface*, const char* name);
+const ShaderInput* ShaderInterface_builtin_uniform(const ShaderInterface*, BuiltinUniform);
diff --git a/intern/gawain/src/shader_interface.c b/intern/gawain/src/shader_interface.c
index 93a1283d895..85fa1d0b676 100644
--- a/intern/gawain/src/shader_interface.c
+++ b/intern/gawain/src/shader_interface.c
@@ -12,6 +12,7 @@
#include "shader_interface.h"
#include <stdlib.h>
#include <stddef.h>
+#include <string.h>
#define DEBUG_SHADER_INTERFACE 0
@@ -19,8 +20,6 @@
#include <stdio.h>
#endif
-#if 0
-
static const char* BuiltinUniform_name(BuiltinUniform u)
{
static const char* names[] =
@@ -31,7 +30,9 @@ static const char* BuiltinUniform_name(BuiltinUniform u)
[UNIFORM_PROJECTION_3D] = "ProjectionMatrix",
[UNIFORM_MVP_3D] = "ModelViewProjectionMatrix",
[UNIFORM_NORMAL_3D] = "NormalMatrix",
- [UNIFORM_INV_NORMAL_3D] = "InverseNormalMatrix",
+
+ [UNIFORM_MODELVIEW_INV_3D] = "ModelViewInverseMatrix",
+ [UNIFORM_PROJECTION_INV_3D] = "ProjectionInverseMatrix",
[UNIFORM_MODELVIEW_2D] = "ModelViewMatrix",
[UNIFORM_PROJECTION_2D] = "ProjectionMatrix",
@@ -45,8 +46,6 @@ static const char* BuiltinUniform_name(BuiltinUniform u)
return names[u];
}
-#endif
-
static bool setup_builtin_uniform(ShaderInput* input, const char* name)
{
// TODO: reject DOUBLE, IMAGE, ATOMIC_COUNTER gl_types
@@ -76,6 +75,8 @@ ShaderInterface* ShaderInterface_create(GLint program)
// allocate enough space for input counts, details for each input, and a buffer for name strings
ShaderInterface* shaderface = calloc(1, offsetof(ShaderInterface, inputs) + input_ct * sizeof(ShaderInput) + name_buffer_len);
+ shaderface->uniform_ct = uniform_ct;
+ shaderface->attrib_ct = attrib_ct;
char* name_buffer = (char*)shaderface + offsetof(ShaderInterface, inputs) + input_ct * sizeof(ShaderInput);
uint32_t name_buffer_offset = 0;
@@ -89,12 +90,19 @@ ShaderInterface* ShaderInterface_create(GLint program)
glGetActiveUniform(program, i, remaining_buffer, &name_len, &input->size, &input->gl_type, name);
+ input->location = glGetUniformLocation(program, name);
+
+#if TRUST_NO_ONE
+ assert(input->location != -1);
+#endif
+
if (setup_builtin_uniform(input, name))
; // reclaim space from name buffer (don't advance offset)
else
+ {
+ input->name = name;
name_buffer_offset += name_len + 1; // include NULL terminator
-
- input->location = glGetUniformLocation(program, name);
+ }
#if DEBUG_SHADER_INTERFACE
printf("uniform[%u] '%s' at location %d\n", i, name, input->location);
@@ -112,11 +120,15 @@ ShaderInterface* ShaderInterface_create(GLint program)
// TODO: reject DOUBLE gl_types
+ input->location = glGetAttribLocation(program, name);
+
+#if TRUST_NO_ONE
+ assert(input->location != -1);
+#endif
+
input->name = name;
name_buffer_offset += name_len + 1; // include NULL terminator
- input->location = glGetAttribLocation(program, name);
-
#if DEBUG_SHADER_INTERFACE
printf("attrib[%u] '%s' at location %d\n", i, name, input->location);
#endif
@@ -138,3 +150,21 @@ void ShaderInterface_discard(ShaderInterface* shaderface)
// allocated as one chunk, so discard is simple
free(shaderface);
}
+
+const ShaderInput* ShaderInterface_uniform(const ShaderInterface* shaderface, const char* name)
+ {
+ for (uint32_t i = 0; i < shaderface->uniform_ct; ++i)
+ {
+ const ShaderInput* uniform = shaderface->inputs + i;
+
+ if (strcmp(uniform->name, name) == 0)
+ return uniform;
+ }
+ return NULL; // not found
+ }
+
+const ShaderInput* ShaderInterface_builtin_uniform(const ShaderInterface* shaderface, BuiltinUniform builtin)
+ {
+ // TODO: look up by enum, not name (fix setup_builtin_uniform first)
+ return ShaderInterface_uniform(shaderface, BuiltinUniform_name(builtin));
+ }