diff options
author | Alexander Romanov <a.romanov@blend4web.com> | 2015-12-26 00:57:50 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2015-12-27 00:15:23 +0300 |
commit | 700c40e2f9b59b7e780429fdc10fb0d2d5d117a1 (patch) | |
tree | 8a6ed722fba1e652fe9756276c83da3467f396aa /source/blender/windowmanager | |
parent | 58cf3327e481cea3dbd2c1c0b89b02d4d2ca7be4 (diff) |
OpenGL: stipple support added to basic GLSL shader
The is intended to replace the deprecated glPolygonStipple() calls with a shader
based alternative, once we switch over to GLSL shaders.
Reviewers: brecht
Differential Revision: https://developer.blender.org/D1688
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/intern/wm_stereo.c | 87 |
1 files changed, 30 insertions, 57 deletions
diff --git a/source/blender/windowmanager/intern/wm_stereo.c b/source/blender/windowmanager/intern/wm_stereo.c index 21fc7f2b5b2..5576a104123 100644 --- a/source/blender/windowmanager/intern/wm_stereo.c +++ b/source/blender/windowmanager/intern/wm_stereo.c @@ -53,6 +53,7 @@ #include "ED_screen.h" #include "GPU_glew.h" +#include "GPU_basic_shader.h" #include "WM_api.h" #include "WM_types.h" @@ -82,76 +83,48 @@ static void wm_method_draw_stereo3d_pageflip(wmWindow *win) glDrawBuffer(GL_BACK); } -static GLuint left_interlace_mask[32]; -static GLuint right_interlace_mask[32]; static enum eStereo3dInterlaceType interlace_prev_type = -1; static char interlace_prev_swap = -1; -static void wm_interlace_masks_create(wmWindow *win) -{ - GLuint pattern; - char i; - bool swap = (win->stereo3d_format->flag & S3D_INTERLACE_SWAP) != 0; - enum eStereo3dInterlaceType interlace_type = win->stereo3d_format->interlace_type; - - if (interlace_prev_type == interlace_type && interlace_prev_swap == swap) - return; - - switch (interlace_type) { - case S3D_INTERLACE_ROW: - pattern = 0x00000000; - pattern = swap ? ~pattern : pattern; - for (i = 0; i < 32; i += 2) { - left_interlace_mask[i] = pattern; - right_interlace_mask[i] = ~pattern; - } - for (i = 1; i < 32; i += 2) { - left_interlace_mask[i] = ~pattern; - right_interlace_mask[i] = pattern; - } - break; - case S3D_INTERLACE_COLUMN: - pattern = 0x55555555; - pattern = swap ? ~pattern : pattern; - for (i = 0; i < 32; i++) { - left_interlace_mask[i] = pattern; - right_interlace_mask[i] = ~pattern; - } - break; - case S3D_INTERLACE_CHECKERBOARD: - default: - pattern = 0x55555555; - pattern = swap ? ~pattern : pattern; - for (i = 0; i < 32; i += 2) { - left_interlace_mask[i] = pattern; - right_interlace_mask[i] = ~pattern; - } - for (i = 1; i < 32; i += 2) { - left_interlace_mask[i] = ~pattern; - right_interlace_mask[i] = pattern; - } - break; - } - interlace_prev_type = interlace_type; - interlace_prev_swap = swap; -} - static void wm_method_draw_stereo3d_interlace(wmWindow *win) { wmDrawData *drawdata; int view; - - wm_interlace_masks_create(win); + bool flag; + bool swap = (win->stereo3d_format->flag & S3D_INTERLACE_SWAP) != 0; + enum eStereo3dInterlaceType interlace_type = win->stereo3d_format->interlace_type; for (view = 0; view < 2; view ++) { + flag = swap ? !view : view; drawdata = BLI_findlink(&win->drawdata, (view * 2) + 1); - - glEnable(GL_POLYGON_STIPPLE); - glPolygonStipple(view ? (GLubyte *) right_interlace_mask : (GLubyte *) left_interlace_mask); + GPU_basic_shader_bind(GPU_SHADER_STIPPLE); + switch (interlace_type) { + case S3D_INTERLACE_ROW: + if (flag) + GPU_basic_shader_stipple(GPU_SHADER_STIPPLE_S3D_INTERLACE_ROW_SWAP); + else + GPU_basic_shader_stipple(GPU_SHADER_STIPPLE_S3D_INTERLACE_ROW); + break; + case S3D_INTERLACE_COLUMN: + if (flag) + GPU_basic_shader_stipple(GPU_SHADER_STIPPLE_S3D_INTERLACE_COLUMN_SWAP); + else + GPU_basic_shader_stipple(GPU_SHADER_STIPPLE_S3D_INTERLACE_COLUMN); + break; + case S3D_INTERLACE_CHECKERBOARD: + default: + if (flag) + GPU_basic_shader_stipple(GPU_SHADER_STIPPLE_S3D_INTERLACE_CHECKER_SWAP); + else + GPU_basic_shader_stipple(GPU_SHADER_STIPPLE_S3D_INTERLACE_CHECKER); + break; + } wm_triple_draw_textures(win, drawdata->triple, 1.0f); - glDisable(GL_POLYGON_STIPPLE); + GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); } + interlace_prev_type = interlace_type; + interlace_prev_swap = swap; } static void wm_method_draw_stereo3d_anaglyph(wmWindow *win) |