[Bf-blender-cvs] [cb2c4bfb74c] blender2.8: GPU Matrix API refactor: Stick to a single 4x4 stack for 2D and 3D

Dalai Felinto noreply at git.blender.org
Fri Apr 14 18:07:34 CEST 2017


Commit: cb2c4bfb74ca7f385bbd8d7c3445a49a2d1b7b8d
Author: Dalai Felinto
Date:   Fri Apr 14 14:13:38 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBcb2c4bfb74ca7f385bbd8d7c3445a49a2d1b7b8d

GPU Matrix API refactor: Stick to a single 4x4 stack for 2D and 3D

* Brings us closer to core profile, all matrices are working, and apart
from a problem with text drawing, Blender is working fine.

* Reduce the coding overhead of having to setup/teardown when
alternating between 2D and 3D drawing sessions.

* Gives us fewer modes and states we need to keep track of.

Unfortunatelly this also "rejects a fundamental change" the original
design was trying to make - that 2D is different from 3D and
deserves its own best implementation.

That said, it is still aligned with the function API design as
originally implemented (i.e., it still uses gpuTranslate2D, ...).

Finally, if you build with core profile and this patch you get:
https://developer.blender.org/F545352

[The text glitch is an unrelated issue].

Reviewers: merwin, sergey, brecht

Differential Revision: https://developer.blender.org/D2626

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

M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/intern/draw_view.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/gpu/GPU_matrix.h
M	source/blender/gpu/intern/gpu_framebuffer.c
M	source/blender/gpu/intern/gpu_matrix.c

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

diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index bdc57140e05..2f8bc59a781 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1856,8 +1856,6 @@ void DRW_draw_view(const bContext *C)
 	/* Start Drawing */
 	DRW_engines_draw_background();
 
-	gpuMatrixBegin3D();
-
 	DRW_draw_callbacks_pre_scene();
 	// DRW_draw_grid();
 	DRW_engines_draw_scene();
@@ -1865,8 +1863,6 @@ void DRW_draw_view(const bContext *C)
 
 	DRW_draw_manipulator();
 
-	gpuMatrixEnd();
-
 	DRW_draw_region_info();
 
 	if (G.debug_value > 20) {
diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c
index 5fc7fe1d8f4..f5ddd05e915 100644
--- a/source/blender/draw/intern/draw_view.c
+++ b/source/blender/draw/intern/draw_view.c
@@ -554,8 +554,6 @@ void DRW_draw_background(void)
 
 	if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
 		/* Gradient background Color */
-		gpuMatrixBegin3D(); /* TODO: finish 2D API */
-
 		glDisable(GL_DEPTH_TEST);
 
 		VertexFormat *format = immVertexFormat();
@@ -580,8 +578,6 @@ void DRW_draw_background(void)
 
 		immUnbindProgram();
 
-		gpuMatrixEnd();
-
 		glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 	}
 	else {
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 0d5e6440355..c9f70945866 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2294,8 +2294,6 @@ static void view3d_draw_view(const bContext *C, ARegion *ar, DrawData *draw_data
 	glClear(GL_DEPTH_BUFFER_BIT);
 //	glDisable(GL_DEPTH_TEST); /* should be set by default */
 
-	gpuMatrixBegin3D();
-
 	view3d_draw_background(C); /* clears/overwrites entire color buffer */
 
 	view3d_draw_setup_view(C, ar);
@@ -2318,8 +2316,6 @@ static void view3d_draw_view(const bContext *C, ARegion *ar, DrawData *draw_data
 	view3d_draw_reference_images(C);
 	view3d_draw_manipulators(C, ar);
 
-	gpuMatrixEnd();
-
 	glDisable(GL_DEPTH_TEST);
 
 	view3d_draw_region_info(C, ar);
diff --git a/source/blender/gpu/GPU_matrix.h b/source/blender/gpu/GPU_matrix.h
index 62b5b7f8ba5..4a47f55a6c6 100644
--- a/source/blender/gpu/GPU_matrix.h
+++ b/source/blender/gpu/GPU_matrix.h
@@ -69,12 +69,6 @@ typedef enum {
 
 MatrixMode gpuMatrixMode(void);
 
-void gpuMatrixBegin2D(void);
-void gpuMatrixBegin3D(void);
-void gpuMatrixEnd(void);
-/* TODO: gpuMatrixResume2D & gpuMatrixResume3D to switch modes but not reset stack */
-
-
 /* ModelView Matrix (2D or 3D) */
 
 void gpuPushMatrix(void); /* TODO: PushCopy vs PushIdentity? */
@@ -105,12 +99,7 @@ void gpuLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY,
 
 /* 2D ModelView Matrix */
 
-#if MATRIX_2D_4x4
 void gpuMultMatrix2D(const float m[4][4]);
-#else
-void gpuLoadMatrix2D(const float m[3][3]);
-void gpuMultMatrix2D(const float m[3][3]);
-#endif
 
 void gpuTranslate2f(float x, float y);
 void gpuTranslate2fv(const float vec[2]);
@@ -187,12 +176,7 @@ bool gpuMatricesDirty(void); /* since last bind */
 
 #  define gpuLoadProjectionMatrix3D(x)  gpuLoadProjectionMatrix3D((const float (*)[4])(x))
 
-# if MATRIX_2D_4x4
 #  define gpuMultMatrix2D(x)  gpuMultMatrix2D((const float (*)[4])(x))
-# else
-#  define gpuMultMatrix2D(x)  gpuMultMatrix2D((const float (*)[3])(x))
-#  define gpuLoadMatrix2D(x)  gpuLoadMatrix2D((const float (*)[3])(x))
-# endif
 
 #  define gpuGetModelViewMatrix3D(x)  gpuGetModelViewMatrix3D((float (*)[4])(x))
 #  define gpuGetProjectionMatrix3D(x)  gpuGetProjectionMatrix3D((float (*)[4])(x))
diff --git a/source/blender/gpu/intern/gpu_framebuffer.c b/source/blender/gpu/intern/gpu_framebuffer.c
index 5e66c691f37..fc6eb6baf51 100644
--- a/source/blender/gpu/intern/gpu_framebuffer.c
+++ b/source/blender/gpu/intern/gpu_framebuffer.c
@@ -415,9 +415,6 @@ void GPU_framebuffer_blur(
 		
 	glDisable(GL_DEPTH_TEST);
 	
-	/* Load fresh matrices */
-	gpuMatrixBegin3D(); /* TODO: finish 2D API */
-
 	/* Blurring horizontally */
 	/* We do the bind ourselves rather than using GPU_framebuffer_texture_bind() to avoid
 	 * pushing unnecessary matrices onto the OpenGL stack. */
@@ -451,8 +448,6 @@ void GPU_framebuffer_blur(
 	Batch_Uniform2f(&batch, "ScaleU", scalev[0], scalev[1]);
 	Batch_Uniform1i(&batch, "textureSource", GL_TEXTURE0);
 	Batch_draw(&batch);
-
-	gpuMatrixEnd();
 }
 
 void GPU_framebuffer_blit(GPUFrameBuffer *fb_read, int read_slot, GPUFrameBuffer *fb_write, int write_slot, bool use_depth)
diff --git a/source/blender/gpu/intern/gpu_matrix.c b/source/blender/gpu/intern/gpu_matrix.c
index 186e14e825f..8b58a981a65 100644
--- a/source/blender/gpu/intern/gpu_matrix.c
+++ b/source/blender/gpu/intern/gpu_matrix.c
@@ -48,15 +48,6 @@ typedef struct {
 	Mat4 ModelViewStack3D[MATRIX_STACK_DEPTH];
 	Mat4 ProjectionMatrix3D;
 
-#if MATRIX_2D_4x4
-	Mat4 ModelViewStack2D[MATRIX_STACK_DEPTH];
-	Mat4 ProjectionMatrix2D;
-#else
-	Mat3 ModelViewStack2D[MATRIX_STACK_DEPTH];
-	Mat3 ProjectionMatrix2D;
-#endif
-
-	MatrixMode mode;
 	unsigned top; /* of current stack (would have to replicate if gpuResume2D/3D are implemented) */
 
 	bool dirty;
@@ -69,55 +60,33 @@ typedef struct {
 	 */
 } MatrixState;
 
-static MatrixState state; /* TODO(merwin): make part of GPUContext, alongside immediate mode & state tracker */
+#define MATRIX_4X4_IDENTITY {{1.0f, 0.0f, 0.0f, 0.0f}, \
+                             {0.0f, 1.0f, 0.0f, 0.0f}, \
+                             {0.0f, 0.0f, 1.0f, 0.0f}, \
+                             {0.0f, 0.0f, 0.0f, 1.0f}}
+
+/* TODO(merwin): make part of GPUContext, alongside immediate mode & state tracker */
+static MatrixState state = {
+	.ModelViewStack3D = {MATRIX_4X4_IDENTITY},
+	.ProjectionMatrix3D = MATRIX_4X4_IDENTITY,
+};
+
+#undef MATRIX_4X4_IDENTITY
 
 #define ModelView3D state.ModelViewStack3D[state.top]
-#define ModelView2D state.ModelViewStack2D[state.top]
 #define Projection3D state.ProjectionMatrix3D
-#define Projection2D state.ProjectionMatrix2D
 
 void gpuMatrixInit(void)
 {
 	memset(&state, 0, sizeof(MatrixState));
 }
 
-void gpuMatrixBegin2D(void)
-{
-	state.mode = MATRIX_MODE_2D;
-	state.top = 0;
-#if MATRIX_2D_4x4
-	unit_m4(ModelView2D);
-	unit_m4(Projection2D);
-#else
-	unit_m3(ModelView2D);
-	unit_m3(Projection2D);
-#endif
-}
-
-void gpuMatrixBegin3D(void)
-{
-	state.mode = MATRIX_MODE_3D;
-	state.top = 0;
-	unit_m4(ModelView3D);
-	unit_m4(Projection3D);
-}
-
-void gpuMatrixEnd(void)
-{
-	state.mode = MATRIX_MODE_INACTIVE;
-}
-
-
 #ifdef WITH_GPU_SAFETY
 
 /* Check if matrix is numerically good */
 static void checkmat(cosnt float *m)
 {
-#if MATRIX_2D_4x4
 	const int n = 16;
-#else
-	const int n = state.mode == MATRIX_MODE_3D ? 16 : 9;
-#endif
 	for (int i = 0; i < n; i++) {
 #if _MSC_VER
 		BLI_assert(_finite(m[i]));
@@ -139,37 +108,28 @@ static void checkmat(cosnt float *m)
 void gpuPushMatrix(void)
 {
 #if SUPPORT_LEGACY_MATRIX
-	if (state.mode == MATRIX_MODE_INACTIVE) {
+	{
 		glPushMatrix();
 		state.dirty = true;
 		return;
 	}
 #endif
 
-	BLI_assert(state.mode != MATRIX_MODE_INACTIVE);
 	BLI_assert(state.top < MATRIX_STACK_DEPTH);
 	state.top++;
-	if (state.mode == MATRIX_MODE_3D)
-		copy_m4_m4(ModelView3D, state.ModelViewStack3D[state.top - 1]);
-	else
-#if MATRIX_2D_4x4
-		copy_m4_m4(ModelView2D, state.ModelViewStack2D[state.top - 1]);
-#else
-		copy_m3_m3(ModelView2D, state.ModelViewStack2D[state.top - 1]);
-#endif
+	copy_m4_m4(ModelView3D, state.ModelViewStack3D[state.top - 1]);
 }
 
 void gpuPopMatrix(void)
 {
 #if SUPPORT_LEGACY_MATRIX
-	if (state.mode == MATRIX_MODE_INACTIVE) {
+	{
 		glPopMatrix();
 		state.dirty = true;
 		return;
 	}
 #endif
 
-	BLI_assert(state.mode != MATRIX_MODE_INACTIVE);
 	BLI_assert(state.top > 0);
 	state.top--;
 	state.dirty = true;
@@ -178,14 +138,13 @@ void gpuPopMatrix(void)
 void gpuLoadMatrix3D(const float m[4][4])
 {
 #if SUPPORT_LEGACY_MATRIX
-	if (state.mode == MATRIX_MODE_INACTIVE) {
+	{
 		glLoadMatrixf((const float*) m);
 		state.dirty = true;
 		return;
 	}
 #endif
 
-	BLI_assert(state.mode == MATRIX_MODE_3D);
 	copy_m4_m4(ModelView3D, m);
 	CHECKMAT(ModelView3D);
 	state.dirty = true;
@@ -194,7 +153,7 @@ void gpuLoadMatrix3D(const float m[4][4])
 void gpuLoadProjectionMatrix3D(const float m[4][4])
 {
 #if SUPPORT_LEGACY_MATRIX
-	if (state.mode == MATRIX_MODE_INACTIVE) {
+	{
 		GLenum mode;
 		glGetIntegerv(GL_MATRIX_MODE, (GLint*)&mode);
 		if (mode != GL_PROJECTION) {
@@ -212,7 +171,6 @@ void gpuLoadProjectionMatrix3D(const float m[4][4])
 	}
 #endif
 
-	BLI_assert(state.mode == MATRIX_MODE_3D);
 	copy_m4_m4(Projection3D, m);
 	CHECKMAT(Projection3D);
 	state.dirty = true;
@@ -221,7 +179,6 @@ void gpuLoadProjectionMatrix3D(const float m[4][4])
 #if 0 /* unused at the moment */
 void gpuLoadMatrix2D(const float m[3][3])
 {
-	BLI_assert(state.mode == MATRIX_MODE_2D);
 	copy_m3_m3(ModelView2D, m);
 	CHECKMAT(ModelView2D);
 	state.dirty = true;
@@ -230,49 +187,27 @@ void gpuLoadMatrix2D(const float m[3][3])
 
 void gpuLoadIdentity(void)
 {
-	switch (state.mode) {
-		case MATRIX_MODE_3D:
-			unit_m4(ModelView3D);
-			break;
-		case MATRIX_MODE_2D:
-#if MATRIX_2D_4x4
-			unit_m4(ModelView2D);
-#else
-			unit_m3(ModelView2D);
-#endif
-			break;
+	unit_m4(ModelView3D);
 #if SUPPORT_LEGACY_MATRIX
-		case MATRIX_MODE_INACTIVE:
-			glLoadIdentity();
-			break;
+	glLoadIdentity();
 #endif
-		default:
-			BLI_assert(false);
-	}
 	state.dirty = true;
 }
 
 void gpuTranslate2f(float x, float y)
 {
 #if SUPPORT_LEGACY_MATRIX
-	if (state.mode == MATRIX_MODE_INACTIVE) {
+	{
 		glTranslatef(x, y, 0.0f);
 		state.dirty = true;
 		return;
 	}
 #endif
 
-#if MATRIX_2D_4x4
 	Mat4 m;
 	unit_m4(m);
 	m[3][0] = x;
 	m[3][1] = y;
-#else
-	Mat3 m;
-	unit_m3(m);
-	m[2][0] = x;
-	m[2][1] = y;
-#endif
 	gpuMultMatrix2D(m);
 }
 
@@ -284,14 +219,13 @@ void gpuTranslate2fv(const float vec[2])
 void gpuTranslate3f(float x, float y, float z)
 {
 #if SUPPORT_LEGACY_MATRIX
-	if (state.mode == MATRIX_MODE_INACTIVE) {
+	{
 		glTranslatef(x, y, z);
 		state.dirty = true;
 		return;
 	}
 #endif
 
-	BLI_assert(state.mode == MATRIX_MODE_3D);
 #if 1
 	translate_m4(ModelView3D, x, y, z);
 	CHECKMAT(ModelView3D);
@@ -313,64 +247,31 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list