Commit: f7db1a4366e8391aea87cc39a5e7bfd6141dd283
Author: Clément Foucault
Date:   Sun Oct 8 15:49:25 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBf7db1a4366e8391aea87cc39a5e7bfd6141dd283

Gawain: Make common uniforms become builtins

This improves eevee's cache performance by 13% in my test.

===================================================================

M       intern/gawain/gawain/gwn_shader_interface.h
M       intern/gawain/src/gwn_shader_interface.c
M       source/blender/draw/intern/draw_manager.c
M       source/blender/gpu/GPU_shader.h
M       source/blender/gpu/intern/gpu_shader.c

===================================================================

diff --git a/intern/gawain/gawain/gwn_shader_interface.h 
b/intern/gawain/gawain/gwn_shader_interface.h
index 720cde40b93..345ad8d389b 100644
--- a/intern/gawain/gawain/gwn_shader_interface.h
+++ b/intern/gawain/gawain/gwn_shader_interface.h
@@ -16,16 +16,27 @@
 typedef enum {
        GWN_UNIFORM_NONE = 0, // uninitialized/unknown
 
+       GWN_UNIFORM_MODEL,      // mat4 ModelMatrix
+       GWN_UNIFORM_VIEW,       // mat4 ViewMatrix
        GWN_UNIFORM_MODELVIEW,  // mat4 ModelViewMatrix
        GWN_UNIFORM_PROJECTION, // mat4 ProjectionMatrix
+       GWN_UNIFORM_VIEWPROJECTION, // mat4 ViewProjectionMatrix
        GWN_UNIFORM_MVP,        // mat4 ModelViewProjectionMatrix
 
-       GWN_UNIFORM_MODELVIEW_INV,  // mat4 ModelViewInverseMatrix
-       GWN_UNIFORM_PROJECTION_INV, // mat4 ProjectionInverseMatrix
+       GWN_UNIFORM_MODEL_INV,           // mat4 ModelMatrixInverse
+       GWN_UNIFORM_VIEW_INV,            // mat4 ViewMatrixInverse
+       GWN_UNIFORM_MODELVIEW_INV,       // mat4 ModelViewMatrixInverse
+       GWN_UNIFORM_PROJECTION_INV,      // mat4 ProjectionMatrixInverse
+       GWN_UNIFORM_VIEWPROJECTION_INV,  // mat4 ViewProjectionMatrixInverse
 
-       GWN_UNIFORM_NORMAL,     // mat3 NormalMatrix
+       GWN_UNIFORM_NORMAL,      // mat3 NormalMatrix
+       GWN_UNIFORM_WORLDNORMAL, // mat3 WorldNormalMatrix
+       GWN_UNIFORM_CAMERATEXCO, // vec4 CameraTexCoFactors
+       GWN_UNIFORM_ORCO,        // vec3 OrcoTexCoFactors[]
+       GWN_UNIFORM_CLIPPLANES,  // vec4 ClipPlanes[]
 
        GWN_UNIFORM_COLOR, // vec4 color
+       GWN_UNIFORM_EYE, // vec3 eye
 
        GWN_UNIFORM_CUSTOM, // custom uniform, not one of the above built-ins
 
diff --git a/intern/gawain/src/gwn_shader_interface.c 
b/intern/gawain/src/gwn_shader_interface.c
index f4877c17087..1fb941f9225 100644
--- a/intern/gawain/src/gwn_shader_interface.c
+++ b/intern/gawain/src/gwn_shader_interface.c
@@ -26,16 +26,27 @@ static const char* BuiltinUniform_name(Gwn_UniformBuiltin u)
                {
                [GWN_UNIFORM_NONE] = NULL,
 
+               [GWN_UNIFORM_MODEL] = "ModelMatrix",
+               [GWN_UNIFORM_VIEW] = "ViewMatrix",
                [GWN_UNIFORM_MODELVIEW] = "ModelViewMatrix",
                [GWN_UNIFORM_PROJECTION] = "ProjectionMatrix",
+               [GWN_UNIFORM_VIEWPROJECTION] = "ViewProjectionMatrix",
                [GWN_UNIFORM_MVP] = "ModelViewProjectionMatrix",
 
-               [GWN_UNIFORM_MODELVIEW_INV] = "ModelViewInverseMatrix",
-               [GWN_UNIFORM_PROJECTION_INV] = "ProjectionInverseMatrix",
+               [GWN_UNIFORM_MODEL_INV] = "ModelMatrixInverse",
+               [GWN_UNIFORM_VIEW_INV] = "ViewMatrixInverse",
+               [GWN_UNIFORM_MODELVIEW_INV] = "ModelViewMatrixInverse",
+               [GWN_UNIFORM_PROJECTION_INV] = "ProjectionMatrixInverse",
+               [GWN_UNIFORM_VIEWPROJECTION_INV] = 
"ViewProjectionMatrixInverse",
 
                [GWN_UNIFORM_NORMAL] = "NormalMatrix",
+               [GWN_UNIFORM_WORLDNORMAL] = "WorldNormalMatrix",
+               [GWN_UNIFORM_CAMERATEXCO] = "CameraTexCoFactors",
+               [GWN_UNIFORM_ORCO] = "OrcoTexCoFactors",
+               [GWN_UNIFORM_CLIPPLANES] = "ClipPlanes",
 
                [GWN_UNIFORM_COLOR] = "color",
+               [GWN_UNIFORM_EYE] = "eye",
 
                [GWN_UNIFORM_CUSTOM] = NULL,
                [GWN_NUM_UNIFORMS] = NULL,
@@ -135,16 +146,12 @@ GWN_INLINE void buckets_free(Gwn_ShaderInput* 
buckets[GWN_NUM_SHADERINTERFACE_BU
                }
        }
 
-// keep these in sync with Gwn_UniformBuiltin order
-#define FIRST_UNIFORM GWN_UNIFORM_MODELVIEW
-#define LAST_UNIFORM GWN_UNIFORM_COLOR
-
 static bool setup_builtin_uniform(Gwn_ShaderInput* input, const char* name)
        {
        // TODO: reject DOUBLE, IMAGE, ATOMIC_COUNTER gl_types
 
        // detect built-in uniforms (name must match)
-       for (Gwn_UniformBuiltin u = FIRST_UNIFORM; u <= LAST_UNIFORM; ++u)
+       for (Gwn_UniformBuiltin u = GWN_UNIFORM_NONE + 1; u < 
GWN_UNIFORM_CUSTOM; ++u)
                {
                const char* builtin_name = BuiltinUniform_name(u);
                if (match(name, builtin_name))
diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index 1c83b813355..38a767b7e34 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -641,23 +641,23 @@ static DRWInterface *DRW_interface_create(GPUShader 
*shader)
 {
        DRWInterface *interface = MEM_mallocN(sizeof(DRWInterface), 
"DRWInterface");
 
-       interface->model = GPU_shader_get_uniform(shader, "ModelMatrix");
-       interface->modelinverse = GPU_shader_get_uniform(shader, 
"ModelMatrixInverse");
-       interface->modelview = GPU_shader_get_uniform(shader, 
"ModelViewMatrix");
-       interface->modelviewinverse = GPU_shader_get_uniform(shader, 
"ModelViewMatrixInverse");
-       interface->projection = GPU_shader_get_uniform(shader, 
"ProjectionMatrix");
-       interface->projectioninverse = GPU_shader_get_uniform(shader, 
"ProjectionMatrixInverse");
-       interface->view = GPU_shader_get_uniform(shader, "ViewMatrix");
-       interface->viewinverse = GPU_shader_get_uniform(shader, 
"ViewMatrixInverse");
-       interface->viewprojection = GPU_shader_get_uniform(shader, 
"ViewProjectionMatrix");
-       interface->viewprojectioninverse = GPU_shader_get_uniform(shader, 
"ViewProjectionMatrixInverse");
-       interface->modelviewprojection = GPU_shader_get_uniform(shader, 
"ModelViewProjectionMatrix");
-       interface->normal = GPU_shader_get_uniform(shader, "NormalMatrix");
-       interface->worldnormal = GPU_shader_get_uniform(shader, 
"WorldNormalMatrix");
-       interface->camtexfac = GPU_shader_get_uniform(shader, 
"CameraTexCoFactors");
-       interface->orcotexfac = GPU_shader_get_uniform(shader, 
"OrcoTexCoFactors[0]");
-       interface->eye = GPU_shader_get_uniform(shader, "eye");
-       interface->clipplanes = GPU_shader_get_uniform(shader, "ClipPlanes[0]");
+       interface->model = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_MODEL);
+       interface->modelinverse = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_MODEL_INV);
+       interface->modelview = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_MODELVIEW);
+       interface->modelviewinverse = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_MODELVIEW_INV);
+       interface->projection = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_PROJECTION);
+       interface->projectioninverse = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_PROJECTION_INV);
+       interface->view = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_VIEW);
+       interface->viewinverse = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_VIEW_INV);
+       interface->viewprojection = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_VIEWPROJECTION);
+       interface->viewprojectioninverse = 
GPU_shader_get_builtin_uniform(shader, GWN_UNIFORM_VIEWPROJECTION_INV);
+       interface->modelviewprojection = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_MVP);
+       interface->normal = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_NORMAL);
+       interface->worldnormal = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_WORLDNORMAL);
+       interface->camtexfac = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_CAMERATEXCO);
+       interface->orcotexfac = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_ORCO);
+       interface->clipplanes = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_CLIPPLANES);
+       interface->eye = GPU_shader_get_builtin_uniform(shader, 
GWN_UNIFORM_EYE);
        interface->instance_count = 0;
        interface->attribs_count = 0;
        interface->attribs_stride = 0;
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 5b62bafd402..f3de3240c26 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -76,6 +76,7 @@ void *GPU_fx_shader_get_interface(GPUShader *shader);
 void GPU_fx_shader_set_interface(GPUShader *shader, void *interface);
 
 int GPU_shader_get_uniform(GPUShader *shader, const char *name);
+int GPU_shader_get_builtin_uniform(GPUShader *shader, int builtin);
 int GPU_shader_get_uniform_block(GPUShader *shader, const char *name);
 void GPU_shader_uniform_vector(GPUShader *shader, int location, int length,
        int arraysize, const float *value);
diff --git a/source/blender/gpu/intern/gpu_shader.c 
b/source/blender/gpu/intern/gpu_shader.c
index 66049b1d2a1..cc1e1e8bb14 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -557,6 +557,13 @@ int GPU_shader_get_uniform(GPUShader *shader, const char 
*name)
        return uniform ? uniform->location : -1;
 }
 
+int GPU_shader_get_builtin_uniform(GPUShader *shader, int builtin)
+{
+       BLI_assert(shader && shader->program);
+       const Gwn_ShaderInput *uniform = 
GWN_shaderinterface_uniform_builtin(shader->interface, builtin);
+       return uniform ? uniform->location : -1;
+}
+
 int GPU_shader_get_uniform_block(GPUShader *shader, const char *name)
 {
        BLI_assert(shader && shader->program);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to