From f7db1a4366e8391aea87cc39a5e7bfd6141dd283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 8 Oct 2017 15:49:25 +0200 Subject: [PATCH] Gawain: Make common uniforms become builtins This improves eevee's cache performance by 13% in my test. --- intern/gawain/gawain/gwn_shader_interface.h | 17 +++++++++-- intern/gawain/src/gwn_shader_interface.c | 21 ++++++++----- source/blender/draw/intern/draw_manager.c | 34 ++++++++++----------- source/blender/gpu/GPU_shader.h | 1 + source/blender/gpu/intern/gpu_shader.c | 7 +++++ 5 files changed, 53 insertions(+), 27 deletions(-) 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);