[Bf-blender-cvs] [a92d20a] blender2.8: OpenGL: dirty bit for GPU matrix API

Mike Erwin noreply at git.blender.org
Thu Oct 20 20:50:54 CEST 2016


Commit: a92d20a0a467ece2680d8bb7600a37be470fce66
Author: Mike Erwin
Date:   Thu Oct 20 14:17:54 2016 -0400
Branches: blender2.8
https://developer.blender.org/rBa92d20a0a467ece2680d8bb7600a37be470fce66

OpenGL: dirty bit for GPU matrix API

Have matrices changed since the most recent bind?

Part of T49450

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

M	source/blender/gpu/GPU_matrix.h
M	source/blender/gpu/intern/gpu_matrix.c

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

diff --git a/source/blender/gpu/GPU_matrix.h b/source/blender/gpu/GPU_matrix.h
index 3c3acc0..f311849 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 9abce9d..f55f9f0 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;
 }




More information about the Bf-blender-cvs mailing list