Cleanup: WM: Encapsulate stereo draw buffers binding
This commit is contained in:
@@ -41,6 +41,12 @@ typedef enum eGPUFrameBufferBits {
|
|||||||
GPU_STENCIL_BIT = (1 << 2),
|
GPU_STENCIL_BIT = (1 << 2),
|
||||||
} eGPUFrameBufferBits;
|
} eGPUFrameBufferBits;
|
||||||
|
|
||||||
|
typedef enum eGPUBackBuffer {
|
||||||
|
GPU_BACKBUFFER = 0,
|
||||||
|
GPU_BACKBUFFER_RIGHT,
|
||||||
|
GPU_BACKBUFFER_LEFT,
|
||||||
|
} eGPUBackBuffer;
|
||||||
|
|
||||||
typedef struct GPUFrameBuffer GPUFrameBuffer;
|
typedef struct GPUFrameBuffer GPUFrameBuffer;
|
||||||
typedef struct GPUOffScreen GPUOffScreen;
|
typedef struct GPUOffScreen GPUOffScreen;
|
||||||
|
|
||||||
@@ -224,6 +230,8 @@ void GPU_clear(eGPUFrameBufferBits flags);
|
|||||||
void GPU_frontbuffer_read_pixels(
|
void GPU_frontbuffer_read_pixels(
|
||||||
int x, int y, int w, int h, int channels, eGPUDataFormat format, void *data);
|
int x, int y, int w, int h, int channels, eGPUDataFormat format, void *data);
|
||||||
|
|
||||||
|
void GPU_backbuffer_bind(eGPUBackBuffer buffer);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1080,3 +1080,17 @@ void GPU_frontbuffer_read_pixels(
|
|||||||
glReadBuffer(GL_FRONT);
|
glReadBuffer(GL_FRONT);
|
||||||
gpu_framebuffer_read_color_ex(x, y, w, h, channels, GL_FRONT, format, data);
|
gpu_framebuffer_read_color_ex(x, y, w, h, channels, GL_FRONT, format, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* For stereo rendering. */
|
||||||
|
void GPU_backbuffer_bind(eGPUBackBuffer buffer)
|
||||||
|
{
|
||||||
|
if (buffer == GPU_BACKBUFFER) {
|
||||||
|
glDrawBuffer(GL_BACK);
|
||||||
|
}
|
||||||
|
else if (buffer == GPU_BACKBUFFER_LEFT) {
|
||||||
|
glDrawBuffer(GL_BACK_LEFT);
|
||||||
|
}
|
||||||
|
else if (buffer == GPU_BACKBUFFER_RIGHT) {
|
||||||
|
glDrawBuffer(GL_BACK_RIGHT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -831,11 +831,13 @@ static void wm_draw_window(bContext *C, wmWindow *win)
|
|||||||
}
|
}
|
||||||
else if (win->stereo3d_format->display_mode == S3D_DISPLAY_PAGEFLIP) {
|
else if (win->stereo3d_format->display_mode == S3D_DISPLAY_PAGEFLIP) {
|
||||||
/* For pageflip we simply draw to both back buffers. */
|
/* For pageflip we simply draw to both back buffers. */
|
||||||
glDrawBuffer(GL_BACK_LEFT);
|
GPU_backbuffer_bind(GPU_BACKBUFFER_LEFT);
|
||||||
wm_draw_window_onscreen(C, win, 0);
|
wm_draw_window_onscreen(C, win, 0);
|
||||||
glDrawBuffer(GL_BACK_RIGHT);
|
|
||||||
|
GPU_backbuffer_bind(GPU_BACKBUFFER_RIGHT);
|
||||||
wm_draw_window_onscreen(C, win, 1);
|
wm_draw_window_onscreen(C, win, 1);
|
||||||
glDrawBuffer(GL_BACK);
|
|
||||||
|
GPU_backbuffer_bind(GPU_BACKBUFFER);
|
||||||
}
|
}
|
||||||
else if (ELEM(win->stereo3d_format->display_mode, S3D_DISPLAY_ANAGLYPH, S3D_DISPLAY_INTERLACE)) {
|
else if (ELEM(win->stereo3d_format->display_mode, S3D_DISPLAY_ANAGLYPH, S3D_DISPLAY_INTERLACE)) {
|
||||||
/* For anaglyph and interlace, we draw individual regions with
|
/* For anaglyph and interlace, we draw individual regions with
|
||||||
|
Reference in New Issue
Block a user