diff options
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_draw.c | 73 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_stereo.c | 94 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_xr.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/wm.h | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_draw.h | 2 |
6 files changed, 35 insertions, 140 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 1be7a8679c4..7426d64c769 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -778,7 +778,7 @@ void WM_draw_region_viewport_unbind(struct ARegion *region); /* Region drawing */ void WM_draw_region_free(struct ARegion *region); -struct GPUViewport *WM_draw_region_get_viewport(struct ARegion *region, int view); +struct GPUViewport *WM_draw_region_get_viewport(struct ARegion *region); struct GPUViewport *WM_draw_region_get_bound_viewport(struct ARegion *region); void WM_main_playanim(int argc, const char **argv); diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 5289b747f05..38cd667c422 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -235,7 +235,7 @@ static void wm_region_test_render_do_draw(const Scene *scene, if (sa->spacetype == SPACE_VIEW3D && region->regiontype == RGN_TYPE_WINDOW) { RegionView3D *rv3d = region->regiondata; RenderEngine *engine = rv3d->render_engine; - GPUViewport *viewport = WM_draw_region_get_viewport(region, 0); + GPUViewport *viewport = WM_draw_region_get_viewport(region); if (engine && (engine->flag & RE_ENGINE_DO_DRAW)) { View3D *v3d = sa->spacedata.first; @@ -332,10 +332,8 @@ static void wm_draw_callbacks(wmWindow *win) static void wm_draw_region_buffer_free(ARegion *region) { if (region->draw_buffer) { - for (int view = 0; view < 2; view++) { - if (region->draw_buffer->viewport[view]) { - GPU_viewport_free(region->draw_buffer->viewport[view]); - } + if (region->draw_buffer->viewport) { + GPU_viewport_free(region->draw_buffer->viewport); } if (region->draw_buffer->offscreen) { GPU_offscreen_free(region->draw_buffer->offscreen); @@ -361,7 +359,6 @@ static void wm_draw_offscreen_texture_parameters(GPUOffScreen *offscreen) /* GL_TEXTURE_BASE_LEVEL = 0 by default */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glBindTexture(GL_TEXTURE_2D, 0); } @@ -387,8 +384,8 @@ static void wm_draw_region_buffer_create(ARegion *region, bool stereo, bool use_ /* Allocate viewport which includes an offscreen buffer with depth * multisample, etc. */ region->draw_buffer = MEM_callocN(sizeof(wmDrawBuffer), "wmDrawBuffer"); - region->draw_buffer->viewport[0] = GPU_viewport_create(); - region->draw_buffer->viewport[1] = (stereo) ? GPU_viewport_create() : NULL; + region->draw_buffer->viewport = stereo ? GPU_viewport_stereo_create() : + GPU_viewport_create(); } else { /* Allocate offscreen buffer if it does not exist. This one has no @@ -417,8 +414,8 @@ static void wm_draw_region_bind(ARegion *region, int view) return; } - if (region->draw_buffer->viewport[view]) { - GPU_viewport_bind(region->draw_buffer->viewport[view], ®ion->winrct); + if (region->draw_buffer->viewport) { + GPU_viewport_bind(region->draw_buffer->viewport, view, ®ion->winrct); } else { GPU_offscreen_bind(region->draw_buffer->offscreen, false); @@ -432,7 +429,7 @@ static void wm_draw_region_bind(ARegion *region, int view) region->draw_buffer->bound_view = view; } -static void wm_draw_region_unbind(ARegion *region, int view) +static void wm_draw_region_unbind(ARegion *region) { if (!region->draw_buffer) { return; @@ -440,8 +437,8 @@ static void wm_draw_region_unbind(ARegion *region, int view) region->draw_buffer->bound_view = -1; - if (region->draw_buffer->viewport[view]) { - GPU_viewport_unbind(region->draw_buffer->viewport[view]); + if (region->draw_buffer->viewport) { + GPU_viewport_unbind(region->draw_buffer->viewport); } else { glDisable(GL_SCISSOR_TEST); @@ -460,14 +457,14 @@ static void wm_draw_region_blit(ARegion *region, int view) view = 0; } else if (view > 0) { - if (region->draw_buffer->viewport[view] == NULL) { + if (region->draw_buffer->viewport == NULL) { /* Region does not need stereo or failed to allocate stereo buffers. */ view = 0; } } - if (region->draw_buffer->viewport[view]) { - GPU_viewport_draw_to_screen(region->draw_buffer->viewport[view], ®ion->winrct); + if (region->draw_buffer->viewport) { + GPU_viewport_draw_to_screen(region->draw_buffer->viewport, view, ®ion->winrct); } else { GPU_offscreen_draw_to_screen( @@ -481,8 +478,9 @@ GPUTexture *wm_draw_region_texture(ARegion *region, int view) return NULL; } - if (region->draw_buffer->viewport[view]) { - return GPU_viewport_color_texture(region->draw_buffer->viewport[view]); + GPUViewport *viewport = region->draw_buffer->viewport; + if (viewport) { + return GPU_viewport_color_texture(viewport, view); } else { return GPU_offscreen_color_texture(region->draw_buffer->offscreen); @@ -573,13 +571,14 @@ void wm_draw_region_blend(ARegion *region, int view, bool blend) } } -GPUViewport *WM_draw_region_get_viewport(ARegion *region, int view) +GPUViewport *WM_draw_region_get_viewport(ARegion *region) { if (!region->draw_buffer) { return NULL; } - return region->draw_buffer->viewport[view]; + GPUViewport *viewport = region->draw_buffer->viewport; + return viewport; } GPUViewport *WM_draw_region_get_bound_viewport(ARegion *region) @@ -588,8 +587,8 @@ GPUViewport *WM_draw_region_get_bound_viewport(ARegion *region) return NULL; } - int view = region->draw_buffer->bound_view; - return region->draw_buffer->viewport[view]; + GPUViewport *viewport = region->draw_buffer->viewport; + return viewport; } static void wm_draw_window_offscreen(bContext *C, wmWindow *win, bool stereo) @@ -650,14 +649,18 @@ static void wm_draw_window_offscreen(bContext *C, wmWindow *win, bool stereo) wm_draw_region_bind(region, view); ED_region_do_draw(C, region); - wm_draw_region_unbind(region, view); + wm_draw_region_unbind(region); + } + if (use_viewport) { + GPUViewport *viewport = region->draw_buffer->viewport; + GPU_viewport_stereo_composite(viewport, win->stereo3d_format); } } else { wm_draw_region_buffer_create(region, false, use_viewport); wm_draw_region_bind(region, 0); ED_region_do_draw(C, region); - wm_draw_region_unbind(region, 0); + wm_draw_region_unbind(region); } region->do_draw = false; @@ -686,7 +689,7 @@ static void wm_draw_window_offscreen(bContext *C, wmWindow *win, bool stereo) glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); ED_region_do_draw(C, region); - wm_draw_region_unbind(region, 0); + wm_draw_region_unbind(region); region->do_draw = false; CTX_wm_menu_set(C, NULL); @@ -715,19 +718,8 @@ static void wm_draw_window_onscreen(bContext *C, wmWindow *win, int view) { for (ARegion *region = sa->regionbase.first; region; region = region->next) { if (region->visible && region->overlap == false) { - if (view == -1 && region->draw_buffer && region->draw_buffer->stereo) { - /* Stereo drawing from textures. */ - if (win->stereo3d_format->display_mode == S3D_DISPLAY_ANAGLYPH) { - wm_stereo3d_draw_anaglyph(win, region); - } - else { - wm_stereo3d_draw_interlace(win, region); - } - } - else { - /* Blit from offscreen buffer. */ - wm_draw_region_blit(region, view); - } + /* Blit from offscreen buffer. */ + wm_draw_region_blit(region, view); } } } @@ -789,7 +781,6 @@ static void wm_draw_window(bContext *C, wmWindow *win) { bScreen *screen = WM_window_get_active_screen(win); bool stereo = WM_stereo3d_enabled(win, false); - /* Draw area regions into their own framebuffer. This way we can redraw * the areas that need it, and blit the rest from existing framebuffers. */ wm_draw_window_offscreen(C, win, stereo); @@ -1028,7 +1019,7 @@ void wm_draw_region_test(bContext *C, ScrArea *sa, ARegion *region) wm_draw_region_buffer_create(region, false, use_viewport); wm_draw_region_bind(region, 0); ED_region_do_draw(C, region); - wm_draw_region_unbind(region, 0); + wm_draw_region_unbind(region); region->do_draw = false; } @@ -1068,7 +1059,7 @@ void WM_draw_region_viewport_bind(ARegion *region) void WM_draw_region_viewport_unbind(ARegion *region) { - wm_draw_region_unbind(region, 0); + wm_draw_region_unbind(region); } /** \} */ diff --git a/source/blender/windowmanager/intern/wm_stereo.c b/source/blender/windowmanager/intern/wm_stereo.c index c5f8fb71b60..8ae343d5eb5 100644 --- a/source/blender/windowmanager/intern/wm_stereo.c +++ b/source/blender/windowmanager/intern/wm_stereo.c @@ -53,100 +53,6 @@ #include "UI_interface.h" #include "UI_resources.h" -static eGPUInterlaceShader interlace_gpu_id_from_type(eStereo3dInterlaceType interlace_type) -{ - switch (interlace_type) { - case S3D_INTERLACE_ROW: - return GPU_SHADER_INTERLACE_ROW; - case S3D_INTERLACE_COLUMN: - return GPU_SHADER_INTERLACE_COLUMN; - case S3D_INTERLACE_CHECKERBOARD: - default: - return GPU_SHADER_INTERLACE_CHECKER; - } -} - -void wm_stereo3d_draw_interlace(wmWindow *win, ARegion *region) -{ - bool swap = (win->stereo3d_format->flag & S3D_INTERLACE_SWAP) != 0; - enum eStereo3dInterlaceType interlace_type = win->stereo3d_format->interlace_type; - - /* wmOrtho for the screen has this same offset */ - float halfx = GLA_PIXEL_OFS / region->winx; - float halfy = GLA_PIXEL_OFS / region->winy; - - GPUVertFormat *format = immVertexFormat(); - uint texcoord = GPU_vertformat_attr_add(format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); - uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); - - /* leave GL_TEXTURE0 as the latest active texture */ - for (int view = 1; view >= 0; view--) { - GPUTexture *texture = wm_draw_region_texture(region, view); - glActiveTexture(GL_TEXTURE0 + view); - glBindTexture(GL_TEXTURE_2D, GPU_texture_opengl_bindcode(texture)); - } - - immBindBuiltinProgram(GPU_SHADER_2D_IMAGE_INTERLACE); - immUniform1i("image_a", (swap) ? 1 : 0); - immUniform1i("image_b", (swap) ? 0 : 1); - - immUniform1i("interlace_id", interlace_gpu_id_from_type(interlace_type)); - - immBegin(GPU_PRIM_TRI_FAN, 4); - - immAttr2f(texcoord, halfx, halfy); - immVertex2f(pos, region->winrct.xmin, region->winrct.ymin); - - immAttr2f(texcoord, 1.0f + halfx, halfy); - immVertex2f(pos, region->winrct.xmax + 1, region->winrct.ymin); - - immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy); - immVertex2f(pos, region->winrct.xmax + 1, region->winrct.ymax + 1); - - immAttr2f(texcoord, halfx, 1.0f + halfy); - immVertex2f(pos, region->winrct.xmin, region->winrct.ymax + 1); - - immEnd(); - immUnbindProgram(); - - for (int view = 1; view >= 0; view--) { - glActiveTexture(GL_TEXTURE0 + view); - glBindTexture(GL_TEXTURE_2D, 0); - } -} - -void wm_stereo3d_draw_anaglyph(wmWindow *win, ARegion *region) -{ - for (int view = 0; view < 2; view++) { - int bit = view + 1; - - switch (win->stereo3d_format->anaglyph_type) { - case S3D_ANAGLYPH_REDCYAN: - glColorMask((1 & bit) ? GL_TRUE : GL_FALSE, - (2 & bit) ? GL_TRUE : GL_FALSE, - (2 & bit) ? GL_TRUE : GL_FALSE, - GL_FALSE); - break; - case S3D_ANAGLYPH_GREENMAGENTA: - glColorMask((2 & bit) ? GL_TRUE : GL_FALSE, - (1 & bit) ? GL_TRUE : GL_FALSE, - (2 & bit) ? GL_TRUE : GL_FALSE, - GL_FALSE); - break; - case S3D_ANAGLYPH_YELLOWBLUE: - glColorMask((1 & bit) ? GL_TRUE : GL_FALSE, - (1 & bit) ? GL_TRUE : GL_FALSE, - (2 & bit) ? GL_TRUE : GL_FALSE, - GL_FALSE); - break; - } - - wm_draw_region_blend(region, view, false); - } - - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); -} - void wm_stereo3d_draw_sidebyside(wmWindow *win, int view) { bool cross_eyed = (win->stereo3d_format->flag & S3D_SIDEBYSIDE_CROSSEYED) != 0; diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c index 4c770834f14..ef6fa6d28f2 100644 --- a/source/blender/windowmanager/intern/wm_xr.c +++ b/source/blender/windowmanager/intern/wm_xr.c @@ -685,7 +685,7 @@ static void wm_xr_draw_viewport_buffers_to_active_framebuffer( if (is_upside_down) { SWAP(int, rect.ymin, rect.ymax); } - GPU_viewport_draw_to_screen_ex(surface_data->viewport, &rect, draw_view->expects_srgb_buffer); + GPU_viewport_draw_to_screen_ex(surface_data->viewport, 0, &rect, draw_view->expects_srgb_buffer); } /** diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h index 22c01df5d3b..97403a0315a 100644 --- a/source/blender/windowmanager/wm.h +++ b/source/blender/windowmanager/wm.h @@ -82,8 +82,6 @@ void wm_autosave_location(char *filepath); void WM_OT_splash(wmOperatorType *ot); /* wm_stereo.c */ -void wm_stereo3d_draw_interlace(wmWindow *win, struct ARegion *region); -void wm_stereo3d_draw_anaglyph(wmWindow *win, struct ARegion *region); void wm_stereo3d_draw_sidebyside(wmWindow *win, int view); void wm_stereo3d_draw_topbottom(wmWindow *win, int view); diff --git a/source/blender/windowmanager/wm_draw.h b/source/blender/windowmanager/wm_draw.h index 4ebf2c820cd..b19fdf97569 100644 --- a/source/blender/windowmanager/wm_draw.h +++ b/source/blender/windowmanager/wm_draw.h @@ -32,7 +32,7 @@ struct GPUViewport; typedef struct wmDrawBuffer { struct GPUOffScreen *offscreen; - struct GPUViewport *viewport[2]; + struct GPUViewport *viewport; bool stereo; int bound_view; } wmDrawBuffer; |