[Bf-blender-cvs] [cbd78c81268] blender2.8: Immediate Mode: replacing glPushAttrib/glPopAttrib

Dalai Felinto noreply at git.blender.org
Wed Apr 5 15:05:01 CEST 2017


Commit: cbd78c81268f06e7b658ae042f3ab6a3816149b0
Author: Dalai Felinto
Date:   Tue Apr 4 20:33:23 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBcbd78c81268f06e7b658ae042f3ab6a3816149b0

Immediate Mode: replacing glPushAttrib/glPopAttrib

Reference document: http://docs.gl/gl3/glPushAttrib

This patch only tackles the bits that are set by Blender with the
following exceptions:

1) Deprecated states (e.g., GL_STIPPLE) are not saved/restored

2) The exception being GL_ALPHA_TEST, which will be removed, but it may
affect drawing too much now. To be removed once we no longer set GL_ALPHA_TEST
elsewhere.

3) paint_cursor will be tackled separated, since it was abusing
glPush/PopAttrib in the first place.

4) Despite what the glPushAttrib page above may suggest, GL_DEPTH_WRITEMASK needs glGet, not glIsEnabled

5) BGE is still a problem since it relies on GL_ALL_ATTRIB_BITS which
would lead to a way more complete/lenghty solution. Since the BGE has
other (OpenGL deprecated) problems anyways, it can be handled on its own
time.

Finally, the original design for 2.8 was to implement a proper stack
system. However we need to move to core profile sooner than later. So
this is a pragmatic temporary (that may be permanent) solution.

Reviewers: merwin, campbellbarton

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

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

M	source/blender/gpu/GPU_draw.h
M	source/blender/gpu/intern/gpu_compositing.c
M	source/blender/gpu/intern/gpu_draw.c
M	source/blender/gpu/intern/gpu_framebuffer.c
M	source/blender/gpu/intern/gpu_select_pick.c
M	source/blender/gpu/intern/gpu_select_sample_query.c
M	source/blender/gpu/intern/gpu_viewport.c

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

diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index 47ddabbed19..3704f909336 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -74,7 +74,7 @@ void GPU_disable_program_point_size(void);
  *   GPU_object_material_bind returns 0 if drawing should be skipped
  * - after drawing, the material must be disabled again */
 
-void GPU_begin_object_materials(struct View3D *v3d, struct RegionView3D *rv3d, 
+void GPU_begin_object_materials(struct View3D *v3d, struct RegionView3D *rv3d,
                                 struct Scene *scene, struct SceneLayer *sl,
                                 struct Object *ob, bool glsl, bool *do_alpha_after);
 void GPU_end_object_materials(void);
@@ -175,6 +175,58 @@ void	GPU_select_index_get(int index, int *r_col);
 int		GPU_select_to_index(unsigned int col);
 void	GPU_select_to_index_array(unsigned int *col, const unsigned int size);
 
+typedef enum eGPUStateMask {
+	GPU_DEPTH_BUFFER_BIT = (1 << 0),
+	GPU_ENABLE_BIT = (1 << 1),
+	GPU_SCISSOR_BIT = (1 << 2),
+	GPU_VIEWPORT_BIT = (1 << 3),
+	GPU_BLEND_BIT = (1 << 4),
+} eGPUStateMask;
+
+typedef struct GPUStateValues
+{
+	eGPUStateMask mask;
+
+	/* GL_ENABLE_BIT */
+	unsigned int is_alpha_test : 1;
+	unsigned int is_blend : 1;
+	bool is_clip_plane[6];
+	unsigned int is_cull_face : 1;
+	unsigned int is_depth_test : 1;
+	unsigned int is_dither : 1;
+	bool is_light[8];
+	unsigned int is_lighting : 1;
+	unsigned int is_line_smooth : 1;
+	unsigned int is_color_logic_op : 1;
+	unsigned int is_map1_vertex3 : 1;
+	unsigned int is_multisample : 1;
+	unsigned int is_normalize : 1;
+	unsigned int is_polygon_offset_line : 1;
+	unsigned int is_polygon_offset_fill : 1;
+	unsigned int is_polygon_smooth : 1;
+	unsigned int is_sample_alpha_to_coverage : 1;
+	unsigned int is_scissor_test : 1;
+	unsigned int is_stencil_test : 1;
+	unsigned int is_texture_2d : 1;
+
+	/* GL_DEPTH_BUFFER_BIT */
+	/* unsigned int is_depth_test : 1; */
+	int depth_func;
+	double depth_clear_value;
+	bool depth_write_mask;
+
+	/* GL_SCISSOR_BIT */
+	int scissor_box[4];
+	/* unsigned int is_scissor_test : 1; */
+
+	/* GL_VIEWPORT_BIT */
+	int viewport[4];
+	double near_far[2];
+} GPUStateValues;
+
+void gpuSaveState(GPUStateValues *attribs, eGPUStateMask mask);
+void gpuRestoreState(GPUStateValues *attribs);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/gpu/intern/gpu_compositing.c b/source/blender/gpu/intern/gpu_compositing.c
index 5214b6b1ab7..8ae100a7d95 100644
--- a/source/blender/gpu/intern/gpu_compositing.c
+++ b/source/blender/gpu/intern/gpu_compositing.c
@@ -42,6 +42,7 @@
 #include "DNA_gpu_types.h"
 
 #include "GPU_compositing.h"
+#include "GPU_draw.h"
 #include "GPU_extensions.h"
 #include "GPU_framebuffer.h"
 #include "GPU_glew.h"
@@ -196,6 +197,8 @@ struct GPUFX {
 
 	Batch *quad_batch;
 	Batch *point_batch;
+
+	struct GPUStateValues attribs;
 };
 
 #if 0
@@ -642,7 +645,7 @@ bool GPU_fx_compositor_initialize_passes(
 	if (scissor_rect) {
 		int w_sc = BLI_rcti_size_x(scissor_rect) + 1;
 		int h_sc = BLI_rcti_size_y(scissor_rect) + 1;
-		glPushAttrib(GL_SCISSOR_BIT);
+		gpuSaveState(&fx->attribs, GPU_SCISSOR_BIT);
 		glEnable(GL_SCISSOR_TEST);
 		glScissor(scissor_rect->xmin - rect->xmin, scissor_rect->ymin - rect->ymin,
 		          w_sc, h_sc);
@@ -718,7 +721,7 @@ void GPU_fx_compositor_XRay_resolve(GPUFX *fx)
 	GPU_framebuffer_texture_attach(fx->gbuffer, fx->depth_buffer, 0);
 
 	/* full screen quad where we will always write to depth buffer */
-	glPushAttrib(GL_DEPTH_BUFFER_BIT | GL_SCISSOR_BIT);
+	gpuSaveState(&fx->attribs, GPU_DEPTH_BUFFER_BIT | GPU_SCISSOR_BIT);
 	glDepthFunc(GL_ALWAYS);
 	/* disable scissor from sculpt if any */
 	glDisable(GL_SCISSOR_TEST);
@@ -751,7 +754,7 @@ void GPU_fx_compositor_XRay_resolve(GPUFX *fx)
 
 	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 
-	glPopAttrib();
+	gpuRestoreState(&fx->attribs);
 }
 
 
@@ -781,8 +784,9 @@ bool GPU_fx_do_composite_pass(
 	GPU_framebuffer_texture_detach(fx->color_buffer);
 	GPU_framebuffer_texture_detach(fx->depth_buffer);
 
-	if (fx->restore_stencil)
-		glPopAttrib();
+	if (fx->restore_stencil) {
+		gpuRestoreState(&fx->attribs);
+	}
 
 	src = fx->color_buffer;
 	target = fx->color_buffer_sec;
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index fb246aa802e..9c8a4254b7d 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -120,10 +120,10 @@ void GPU_render_text(
 		Image *ima = (Image *)mtexpoly->tpage;
 		const size_t textlen_st = textlen;
 		float centerx, centery, sizex, sizey, transx, transy, movex, movey, advance;
-		
+
 		/* multiline */
 		float line_start = 0.0f, line_height;
-		
+
 		if (v4)
 			line_height = max_ffff(v1[1], v2[1], v3[1], v4[2]) - min_ffff(v1[1], v2[1], v3[1], v4[2]);
 		else
@@ -131,7 +131,7 @@ void GPU_render_text(
 		line_height *= 1.2f; /* could be an option? */
 		/* end multiline */
 
-		
+
 		/* color has been set */
 		if (mtexpoly->mode & TF_OBCOL)
 			col = NULL;
@@ -139,22 +139,22 @@ void GPU_render_text(
 			glColor3f(1.0f, 1.0f, 1.0f);
 
 		gpuPushMatrix();
-		
+
 		/* get the tab width */
 		ImBuf *first_ibuf = BKE_image_get_first_ibuf(ima);
 		matrixGlyph(first_ibuf, ' ', &centerx, &centery,
-			&sizex, &sizey, &transx, &transy, &movex, &movey, &advance);
-		
+		    &sizex, &sizey, &transx, &transy, &movex, &movey, &advance);
+
 		float advance_tab = advance * 4; /* tab width could also be an option */
-		
-		
+
+
 		for (size_t index = 0; index < textlen_st; ) {
 			unsigned int character;
 			float uv[4][2];
 
 			/* lets calculate offset stuff */
 			character = BLI_str_utf8_as_unicode_and_size_safe(textstr + index, &index);
-			
+
 			if (character == '\n') {
 				gpuTranslate2f(line_start, -line_height);
 				line_start = 0.0f;
@@ -164,17 +164,17 @@ void GPU_render_text(
 				gpuTranslate2f(advance_tab, 0.0f);
 				line_start -= advance_tab; /* so we can go back to the start of the line */
 				continue;
-				
+
 			}
 			else if (character > USHRT_MAX) {
 				/* not much we can do here bmfonts take ushort */
 				character = '?';
 			}
-			
+
 			/* space starts at offset 1 */
 			/* character = character - ' ' + 1; */
 			matrixGlyph(first_ibuf, character, & centerx, &centery,
-				&sizex, &sizey, &transx, &transy, &movex, &movey, &advance);
+			    &sizex, &sizey, &transx, &transy, &movex, &movey, &advance);
 
 			uv[0][0] = (uv_quad[0][0] - centerx) * sizex + transx;
 			uv[0][1] = (uv_quad[0][1] - centery) * sizey + transy;
@@ -182,13 +182,13 @@ void GPU_render_text(
 			uv[1][1] = (uv_quad[1][1] - centery) * sizey + transy;
 			uv[2][0] = (uv_quad[2][0] - centerx) * sizex + transx;
 			uv[2][1] = (uv_quad[2][1] - centery) * sizey + transy;
-			
+
 			glBegin(GL_POLYGON);
 			if (glattrib >= 0) glVertexAttrib2fv(glattrib, uv[0]);
 			else glTexCoord2fv(uv[0]);
 			if (col) gpu_mcol(col[0]);
 			glVertex3f(sizex * v1[0] + movex, sizey * v1[1] + movey, v1[2]);
-			
+
 			if (glattrib >= 0) glVertexAttrib2fv(glattrib, uv[1]);
 			else glTexCoord2fv(uv[1]);
 			if (col) gpu_mcol(col[1]);
@@ -232,7 +232,7 @@ static bool is_over_resolution_limit(GLenum textarget, int w, int h)
 	int size = (textarget == GL_TEXTURE_2D) ?
 	        GPU_max_texture_size() : GPU_max_cube_map_size();
 	int reslimit = (U.glreslimit != 0) ?
-		min_ii(U.glreslimit, size) : size;
+	    min_ii(U.glreslimit, size) : size;
 
 	return (w > reslimit || h > reslimit);
 }
@@ -414,7 +414,7 @@ void GPU_clear_tpage(bool force)
 {
 	if (GTS.lasttface == NULL && !force)
 		return;
-	
+
 	GTS.lasttface = NULL;
 	GTS.curtile = 0;
 	GTS.curima = NULL;
@@ -427,7 +427,7 @@ void GPU_clear_tpage(bool force)
 	GTS.curtileXRep = 0;
 	GTS.curtileYRep = 0;
 	GTS.alphablend = -1;
-	
+
 	glDisable(GL_BLEND);
 	glDisable(GL_TEXTURE_2D);
 	glDisable(GL_TEXTURE_GEN_S);
@@ -455,7 +455,7 @@ static void gpu_set_alpha_blend(GPUBlendMode alphablend)
 
 		/* for OpenGL render we use the alpha channel, this makes alpha blend correct */
 		glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
-		
+
 		/* if U.glalphaclip == 1.0, some cards go bonkers...
 		 * turn off alpha test in this case */
 
@@ -647,29 +647,29 @@ int GPU_verify_image(
 		GPU_free_image(ima);
 		ima->tpageflag &= ~IMA_TPAGE_REFRESH;
 	}
-	
+
 	if (GTS.tilemode) {
 		/* tiled mode */
 		if (ima->repbind == NULL) gpu_make_repbind(ima);
 		if (GTS.tile >= ima->totbind) GTS.tile = 0;
-		
+
 		/* this happens when you change repeat buttons */
 		if (ima->repbind && textarget == GL_TEXTURE_2D) bind = &ima->repbind[GTS.tile];
 		else bind = gpu_get_image_bindcode(ima, textarget);
-		
+
 		if (*bind == 0) {
 			short texwindx = ibuf->x / ima->xrep;
 			short texwindy = ibuf->y / ima->yrep;
-			
+
 			if (GTS.tile >= ima->xrep * ima->yrep)
 				GTS.tile = ima->xrep * ima->yrep - 1;
-	
+
 			short texwinsy = GTS.tile / ima->xrep;
 			short texwinsx = GTS.tile - texwinsy * ima->xrep;
-	
+
 			texwinsx *= texwindx;
 			texwinsy *= texwindy;
-	
+
 			tpx = texwindx;
 			tpy = texwindy;
 
@@ -743,7 +743,7 @@ int GPU_verify_image(
 
 				memcpy(tilerectrow, rectrow, tpx * sizeof(*rectrow));
 			}
-			
+
 			rect = tilerect;
 		}
 	}
@@ -754,13 +754,13 @@ int GPU_verify_image(
 	else
 #endif
 		GPU_create_gl_tex(bind, rect, frect, rectw, recth, textarget, mipmap, use_high_bit_depth, ima);
-	
+
 	/* mark as non-color data texture */
 	if (*bind) {
 		if (is_data)
-			ima->tpageflag |= IMA_GLBIND_IS_DATA;	
+			ima->tpageflag |= IMA_GLBIND_IS_DATA;
 		else
-			ima->tpageflag &= ~IMA_GLBIND_IS_DATA;	
+			ima->tpageflag &= ~IMA_GLBIND_IS_DATA;
 	}
 
 	/* clean up */
@@ -946,7 +946,7 @@ void GPU_create_gl_tex(
 						if (mip_cube_map) {
 							for (int j = 0; j < 6; j++) {
 								glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + j, i,
-									informat, mipw, miph, 0, GL_RGBA, type, mip_cube_map[j]);
+								    informat, mipw, miph, 0, GL_RGBA, type, mip_cube_map[j]);
 							}
 						}
 						gpu_del_cube_map(mip_cube_map);
@@ -1027,7 +1027,7 @@ bool GPU_upload_dxt_texture(ImBuf *ibuf)
 		size = ((width + 3) / 4) * ((height + 3) / 4) * blocksize;
 
 		glCompressedTexImage2D(GL_TEXTURE_2D, i, format, w

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list