diff options
Diffstat (limited to 'source/blender/gpu/intern/gpu_viewport.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_viewport.c | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c index c604859fa94..790203d455a 100644 --- a/source/blender/gpu/intern/gpu_viewport.c +++ b/source/blender/gpu/intern/gpu_viewport.c @@ -93,6 +93,8 @@ struct GPUViewport { /* TODO(fclem): the uvimage display use the viewport but do not set any view transform for the * moment. The end goal would be to let the GPUViewport do the color management. */ bool do_color_management; + /** The default layers to use when drawing to screen. */ + eGPUViewportLayer default_layers; struct GPUViewportBatch batch; }; @@ -113,6 +115,11 @@ bool GPU_viewport_do_update(GPUViewport *viewport) return ret; } +void GPU_viewport_default_layers_set(GPUViewport *viewport, eGPUViewportLayer default_layers) +{ + viewport->default_layers = default_layers; +} + GPUViewport *GPU_viewport_create(void) { GPUViewport *viewport = MEM_callocN(sizeof(GPUViewport), "GPUViewport"); @@ -403,11 +410,23 @@ static void gpu_viewport_draw_colormanaged(GPUViewport *viewport, const rctf *rect_pos, const rctf *rect_uv, bool display_colorspace, - bool do_overlay_merge) + eGPUViewportLayer active_layers) { GPUTexture *color = viewport->color_render_tx[view]; GPUTexture *color_overlay = viewport->color_overlay_tx[view]; + /* When drawing only the overlay it needs to be drawn on top of an empty texture. Some platforms + * do not clear textures when allocating what leads to scrambled parts of the display. + * + * See T94900 for more information. */ + const bool do_overlay = ELEM( + active_layers, GPU_VIEWPORT_LAYER_COLOR_AND_OVERLAY, GPU_VIEWPORT_LAYER_OVERLAY); + const bool use_dummy_texture = viewport->default_layers == GPU_VIEWPORT_LAYER_OVERLAY; + if (use_dummy_texture) { + static float data[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + color = GPU_texture_create_2d(__func__, 1, 1, 0, GPU_RGBA16F, data); + } + bool use_ocio = false; if (viewport->do_color_management && display_colorspace) { @@ -424,7 +443,7 @@ static void gpu_viewport_draw_colormanaged(GPUViewport *viewport, NULL, viewport->dither, false, - do_overlay_merge); + do_overlay); } GPUBatch *batch = gpu_viewport_batch_get(viewport, rect_pos, rect_uv); @@ -433,7 +452,7 @@ static void gpu_viewport_draw_colormanaged(GPUViewport *viewport, } else { GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_IMAGE_OVERLAYS_MERGE); - GPU_batch_uniform_1i(batch, "overlay", do_overlay_merge); + GPU_batch_uniform_1i(batch, "overlay", do_overlay); GPU_batch_uniform_1i(batch, "display_transform", display_colorspace); GPU_batch_uniform_1i(batch, "image_texture", 0); GPU_batch_uniform_1i(batch, "overlays_texture", 1); @@ -448,13 +467,18 @@ static void gpu_viewport_draw_colormanaged(GPUViewport *viewport, if (use_ocio) { IMB_colormanagement_finish_glsl_draw(); } + + if (use_dummy_texture) { + GPU_texture_free(color); + color = NULL; + } } void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport, int view, const rcti *rect, bool display_colorspace, - bool do_overlay_merge) + eGPUViewportLayer active_layers) { GPUTexture *color = viewport->color_render_tx[view]; @@ -499,12 +523,12 @@ void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport, } gpu_viewport_draw_colormanaged( - viewport, view, &pos_rect, &uv_rect, display_colorspace, do_overlay_merge); + viewport, view, &pos_rect, &uv_rect, display_colorspace, active_layers); } void GPU_viewport_draw_to_screen(GPUViewport *viewport, int view, const rcti *rect) { - GPU_viewport_draw_to_screen_ex(viewport, view, rect, true, true); + GPU_viewport_draw_to_screen_ex(viewport, view, rect, true, viewport->default_layers); } void GPU_viewport_unbind_from_offscreen(GPUViewport *viewport, @@ -533,8 +557,13 @@ void GPU_viewport_unbind_from_offscreen(GPUViewport *viewport, .ymax = 1.0f, }; - gpu_viewport_draw_colormanaged( - viewport, 0, &pos_rect, &uv_rect, display_colorspace, do_overlay_merge); + gpu_viewport_draw_colormanaged(viewport, + 0, + &pos_rect, + &uv_rect, + display_colorspace, + do_overlay_merge ? GPU_VIEWPORT_LAYER_COLOR_AND_OVERLAY : + GPU_VIEWPORT_LAYER_COLOR); /* This one is from the offscreen. Don't free it with the viewport. */ viewport->depth_tx = NULL; |