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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to