diff options
author | Mike Erwin <significant.bit@gmail.com> | 2016-10-20 21:17:54 +0300 |
---|---|---|
committer | Mike Erwin <significant.bit@gmail.com> | 2016-10-20 21:18:34 +0300 |
commit | a92d20a0a467ece2680d8bb7600a37be470fce66 (patch) | |
tree | 14487732840171ef21d992c9cac18e139fd37b6b | |
parent | 225edf4e667c12651d2c056b0fbf3a7b17080ff7 (diff) |
OpenGL: dirty bit for GPU matrix API
Have matrices changed since the most recent bind?
Part of T49450
-rw-r--r-- | source/blender/gpu/GPU_matrix.h | 1 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_matrix.c | 33 |
2 files changed, 31 insertions, 3 deletions
diff --git a/source/blender/gpu/GPU_matrix.h b/source/blender/gpu/GPU_matrix.h index 3c3acc08f58..f3118495239 100644 --- a/source/blender/gpu/GPU_matrix.h +++ b/source/blender/gpu/GPU_matrix.h @@ -135,6 +135,7 @@ void gpuMatrixBegin3D_legacy(void); /* set uniform values for currently bound shader */ void gpuBindMatrices(GLuint program); +bool gpuMatricesDirty(void); /* since last bind */ #ifdef __cplusplus } diff --git a/source/blender/gpu/intern/gpu_matrix.c b/source/blender/gpu/intern/gpu_matrix.c index 9abce9d6816..f55f9f01ae6 100644 --- a/source/blender/gpu/intern/gpu_matrix.c +++ b/source/blender/gpu/intern/gpu_matrix.c @@ -52,7 +52,9 @@ typedef struct { MatrixMode mode; unsigned top; /* of current stack (would have to replicate if gpuResume2D/3D are implemented) */ - + + bool dirty; + /* TODO: cache of derived matrices (Normal, MVP, inverse MVP, etc) * generate as needed for shaders, invalidate when original matrices change * @@ -95,6 +97,7 @@ void gpuMatrixBegin3D_legacy() /* copy top matrix from each legacy stack into new fresh stack */ state.mode = MATRIX_MODE_3D; state.top = 0; + state.dirty = true; glGetFloatv(GL_MODELVIEW_MATRIX, (float*)ModelView3D); glGetFloatv(GL_PROJECTION_MATRIX, (float*)Projection3D); } @@ -146,6 +149,7 @@ void gpuPopMatrix() BLI_assert(state.mode != MATRIX_MODE_INACTIVE); BLI_assert(state.top > 0); state.top--; + state.dirty = true; } void gpuLoadMatrix3D(const float m[4][4]) @@ -153,6 +157,7 @@ void gpuLoadMatrix3D(const float m[4][4]) BLI_assert(state.mode == MATRIX_MODE_3D); copy_m4_m4(ModelView3D, m); CHECKMAT(ModelView3D); + state.dirty = true; } void gpuLoadMatrix2D(const float m[3][3]) @@ -160,6 +165,7 @@ void gpuLoadMatrix2D(const float m[3][3]) BLI_assert(state.mode == MATRIX_MODE_2D); copy_m3_m3(ModelView2D, m); CHECKMAT(ModelView2D); + state.dirty = true; } void gpuLoadIdentity() @@ -174,6 +180,7 @@ void gpuLoadIdentity() default: BLI_assert(false); } + state.dirty = true; } void gpuTranslate2f(float x, float y) @@ -192,8 +199,8 @@ void gpuTranslate2fv(const float vec[2]) void gpuTranslate3f(float x, float y, float z) { -#if 1 BLI_assert(state.mode == MATRIX_MODE_3D); +#if 1 translate_m4(ModelView3D, x, y, z); CHECKMAT(ModelView3D); #else /* above works well in early testing, below is generic version */ @@ -204,6 +211,7 @@ void gpuTranslate3f(float x, float y, float z) m[3][2] = z; gpuMultMatrix3D(m); #endif + state.dirty = true; } void gpuTranslate3fv(const float vec[3]) @@ -275,6 +283,7 @@ void gpuMultMatrix3D(const float m[4][4]) BLI_assert(state.mode == MATRIX_MODE_3D); mul_m4_m4_pre(ModelView3D, m); CHECKMAT(ModelView3D); + state.dirty = true; } void gpuMultMatrix2D(const float m[3][3]) @@ -282,6 +291,7 @@ void gpuMultMatrix2D(const float m[3][3]) BLI_assert(state.mode == MATRIX_MODE_2D); mul_m3_m3_pre(ModelView2D, m); CHECKMAT(ModelView2D); + state.dirty = true; } void gpuRotate3fv(float deg, const float axis[3]) @@ -293,10 +303,11 @@ void gpuRotate3fv(float deg, const float axis[3]) void gpuRotateAxis(float deg, char axis) { -#if 1 /* rotate_m4 works in place, right? */ BLI_assert(state.mode == MATRIX_MODE_3D); +#if 1 /* rotate_m4 works in place, right? */ rotate_m4(ModelView3D, axis, DEG2RADF(deg)); CHECKMAT(ModelView3D); + state.dirty = true; #else /* rotate_m4 creates a new matrix */ Mat4 m; rotate_m4(m, axis, DEG2RADF(deg)); @@ -325,6 +336,8 @@ static void mat4_ortho_set(float m[4][4], float left, float right, float bottom, m[1][3] = 0.0f; m[2][3] = 0.0f; m[3][3] = 1.0f; + + state.dirty = true; } static void mat4_frustum_set(float m[][4], float left, float right, float bottom, float top, float near, float far) @@ -348,6 +361,8 @@ static void mat4_frustum_set(float m[][4], float left, float right, float bottom m[1][3] = 0.0f; m[2][3] = -1.0f; m[3][3] = 0.0f; + + state.dirty = true; } static void mat4_look_from_origin(float m[4][4], float lookdir[3], float camup[3]) @@ -412,6 +427,8 @@ static void mat4_look_from_origin(float m[4][4], float lookdir[3], float camup[3 m[1][3] = 0.0f; m[2][3] = 0.0f; m[3][3] = 1.0f; + + state.dirty = true; } void gpuOrtho(float left, float right, float bottom, float top, float near, float far) @@ -419,6 +436,7 @@ void gpuOrtho(float left, float right, float bottom, float top, float near, floa BLI_assert(state.mode == MATRIX_MODE_3D); mat4_ortho_set(Projection3D, left, right, bottom, top, near, far); CHECKMAT(Projection3D); + state.dirty = true; } void gpuOrtho2D(float left, float right, float bottom, float top) @@ -429,6 +447,7 @@ void gpuOrtho2D(float left, float right, float bottom, float top) mat4_ortho_set(m, left, right, bottom, top, -1.0f, 1.0f); copy_m3_m4(Projection2D, m); CHECKMAT(Projection2D); + state.dirty = true; } void gpuFrustum(float left, float right, float bottom, float top, float near, float far) @@ -436,6 +455,7 @@ void gpuFrustum(float left, float right, float bottom, float top, float near, fl BLI_assert(state.mode == MATRIX_MODE_3D); mat4_frustum_set(Projection3D, left, right, bottom, top, near, far); CHECKMAT(Projection3D); + state.dirty = true; } void gpuPerspective(float fovy, float aspect, float near, float far) @@ -634,4 +654,11 @@ void gpuBindMatrices(GLuint program) glUniformMatrix4fv(loc_MVP, 1, GL_FALSE, gpuGetModelViewProjectionMatrix3D(NULL)); } + + state.dirty = false; +} + +bool gpuMatricesDirty() +{ + return state.dirty; } |