Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Romanov <a.romanov@blend4web.com>2015-12-26 00:57:50 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2015-12-27 00:15:23 +0300
commit700c40e2f9b59b7e780429fdc10fb0d2d5d117a1 (patch)
tree8a6ed722fba1e652fe9756276c83da3467f396aa /source/blender/windowmanager/intern/wm_stereo.c
parent58cf3327e481cea3dbd2c1c0b89b02d4d2ca7be4 (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/intern/wm_stereo.c')
-rw-r--r--source/blender/windowmanager/intern/wm_stereo.c87
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)