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:
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c1
-rw-r--r--source/blender/gpu/GPU_viewport.h9
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c45
-rw-r--r--source/blender/windowmanager/wm_draw.h4
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr_draw.c6
5 files changed, 52 insertions, 13 deletions
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 6dffc0bc2a4..64cf45b5c81 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -2700,6 +2700,7 @@ void draw_timeline_seq(const bContext *C, ARegion *region)
seq_prefetch_wm_notify(C, scene);
GPUViewport *viewport = WM_draw_region_get_viewport(region);
+ GPU_viewport_default_layers_set(viewport, GPU_VIEWPORT_LAYER_OVERLAY);
GPUFrameBuffer *framebuffer_overlay = GPU_viewport_framebuffer_overlay_get(viewport);
GPU_framebuffer_bind_no_srgb(framebuffer_overlay);
GPU_depth_test(GPU_DEPTH_NONE);
diff --git a/source/blender/gpu/GPU_viewport.h b/source/blender/gpu/GPU_viewport.h
index 917b87efeaa..6e520b5ec20 100644
--- a/source/blender/gpu/GPU_viewport.h
+++ b/source/blender/gpu/GPU_viewport.h
@@ -40,6 +40,12 @@ extern "C" {
typedef struct GHash GHash;
typedef struct GPUViewport GPUViewport;
+typedef enum eGPUViewportLayer {
+ GPU_VIEWPORT_LAYER_COLOR_AND_OVERLAY = 0,
+ GPU_VIEWPORT_LAYER_COLOR = 1,
+ GPU_VIEWPORT_LAYER_OVERLAY = 2
+} eGPUViewportLayer;
+
struct DRWData;
struct DefaultFramebufferList;
struct DefaultTextureList;
@@ -49,6 +55,7 @@ GPUViewport *GPU_viewport_create(void);
GPUViewport *GPU_viewport_stereo_create(void);
void GPU_viewport_bind(GPUViewport *viewport, int view, const rcti *rect);
void GPU_viewport_unbind(GPUViewport *viewport);
+void GPU_viewport_default_layers_set(GPUViewport *viewport, eGPUViewportLayer active_layer);
/**
* Merge and draw the buffers of \a viewport into the currently active framebuffer, performing
* color transform to display space.
@@ -65,7 +72,7 @@ void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport,
int view,
const rcti *rect,
bool display_colorspace,
- bool do_overlay_merge);
+ eGPUViewportLayer active_layers);
/**
* Must be executed inside Draw-manager OpenGL Context.
*/
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;
diff --git a/source/blender/windowmanager/wm_draw.h b/source/blender/windowmanager/wm_draw.h
index 4997361b485..a16852c9247 100644
--- a/source/blender/windowmanager/wm_draw.h
+++ b/source/blender/windowmanager/wm_draw.h
@@ -23,9 +23,7 @@
#pragma once
-struct GPUOffScreen;
-struct GPUTexture;
-struct GPUViewport;
+#include "GPU_viewport.h"
#ifdef __cplusplus
extern "C" {
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_draw.c b/source/blender/windowmanager/xr/intern/wm_xr_draw.c
index 5d0163af5e1..a4b12d83c02 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_draw.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_draw.c
@@ -136,7 +136,11 @@ 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(vp->viewport, 0, &rect, draw_view->expects_srgb_buffer, true);
+ GPU_viewport_draw_to_screen_ex(vp->viewport,
+ 0,
+ &rect,
+ draw_view->expects_srgb_buffer,
+ GPU_VIEWPORT_LAYER_COLOR_AND_OVERLAY);
}
void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata)