From 29cc37cf225f12efbd4da053b66bfcc1cc1e91bf Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 13 Apr 2023 12:33:50 +0200 Subject: [PATCH 1/4] GPU: Add texture usage parameter to GPUOffscreen. Currently the Textures used for offscreen rendering don't have the `GPU_TEXTURE_USAGE_HOST_READ` flag. But some cases it is needed. This PR adds a parameter when creating an offscreen buffer. Other solution could be to add this flag to all textures, but we chose not to do this as that reduces the amount of fine-tuning options for Metal/Vulkan backends. GPU can store textures differently based on its actual usage. This option isn't available in the python API as we don't expect add-on developers to fine-tune texture usages to this extent. --- source/blender/editors/gpencil/gpencil_fill.c | 9 +++++-- .../blender/editors/render/render_opengl.cc | 8 +++++- source/blender/editors/screen/screen_draw.c | 8 +++++- .../editors/space_view3d/view3d_draw.cc | 8 +++++- source/blender/gpu/GPU_framebuffer.h | 8 ++++-- source/blender/gpu/intern/gpu_framebuffer.cc | 9 ++++--- source/blender/python/gpu/gpu_py_offscreen.c | 8 +++++- source/blender/windowmanager/intern/wm_draw.c | 25 ++++++++++++++++--- .../windowmanager/xr/intern/wm_xr_session.c | 9 +++++-- 9 files changed, 75 insertions(+), 17 deletions(-) diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index 397f4d7c924..7db1a4e1686 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -1234,8 +1234,13 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) tgpf->sizey = (int)tgpf->region->winy; char err_out[256] = "unknown"; - GPUOffScreen *offscreen = GPU_offscreen_create( - tgpf->sizex, tgpf->sizey, true, GPU_RGBA8, err_out); + GPUOffScreen *offscreen = GPU_offscreen_create(tgpf->sizex, + tgpf->sizey, + true, + GPU_RGBA8, + GPU_TEXTURE_USAGE_ATTACHMENT | + GPU_TEXTURE_USAGE_HOST_READ, + err_out); if (offscreen == NULL) { printf("GPencil - Fill - Unable to create fill buffer\n"); return false; diff --git a/source/blender/editors/render/render_opengl.cc b/source/blender/editors/render/render_opengl.cc index 1dcbfd26535..702e660dfbf 100644 --- a/source/blender/editors/render/render_opengl.cc +++ b/source/blender/editors/render/render_opengl.cc @@ -757,7 +757,13 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) /* corrects render size with actual size, not every card supports non-power-of-two dimensions */ DRW_opengl_context_enable(); /* Off-screen creation needs to be done in DRW context. */ - ofs = GPU_offscreen_create(sizex, sizey, true, GPU_RGBA16F, err_out); + ofs = GPU_offscreen_create(sizex, + sizey, + true, + GPU_RGBA16F, + GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT | + GPU_TEXTURE_USAGE_HOST_READ, + err_out); DRW_opengl_context_disable(); if (!ofs) { diff --git a/source/blender/editors/screen/screen_draw.c b/source/blender/editors/screen/screen_draw.c index 384aeccfc4c..c1ea6a74e35 100644 --- a/source/blender/editors/screen/screen_draw.c +++ b/source/blender/editors/screen/screen_draw.c @@ -425,7 +425,13 @@ static void screen_preview_draw(const bScreen *screen, int size_x, int size_y) void ED_screen_preview_render(const bScreen *screen, int size_x, int size_y, uint *r_rect) { char err_out[256] = "unknown"; - GPUOffScreen *offscreen = GPU_offscreen_create(size_x, size_y, true, GPU_RGBA8, err_out); + GPUOffScreen *offscreen = GPU_offscreen_create( + size_x, + size_y, + true, + GPU_RGBA8, + GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT | GPU_TEXTURE_USAGE_HOST_READ, + err_out); GPU_offscreen_bind(offscreen, true); GPU_clear_color(0.0f, 0.0f, 0.0f, 0.0f); diff --git a/source/blender/editors/space_view3d/view3d_draw.cc b/source/blender/editors/space_view3d/view3d_draw.cc index 9755599e989..9aeffe097c1 100644 --- a/source/blender/editors/space_view3d/view3d_draw.cc +++ b/source/blender/editors/space_view3d/view3d_draw.cc @@ -1886,7 +1886,13 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, if (own_ofs) { /* bind */ - ofs = GPU_offscreen_create(sizex, sizey, true, GPU_RGBA8, err_out); + ofs = GPU_offscreen_create(sizex, + sizey, + true, + GPU_RGBA8, + GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT | + GPU_TEXTURE_USAGE_HOST_READ, + err_out); if (ofs == nullptr) { DRW_opengl_context_disable(); return nullptr; diff --git a/source/blender/gpu/GPU_framebuffer.h b/source/blender/gpu/GPU_framebuffer.h index f40144ef8a8..76187f5b049 100644 --- a/source/blender/gpu/GPU_framebuffer.h +++ b/source/blender/gpu/GPU_framebuffer.h @@ -589,8 +589,12 @@ typedef struct GPUOffScreen GPUOffScreen; * If \a err_out is not `nullptr` it will be use to write any configuration error message.. * \note This function binds the framebuffer to the active context. */ -GPUOffScreen *GPU_offscreen_create( - int width, int height, bool with_depth_buffer, eGPUTextureFormat format, char err_out[256]); +GPUOffScreen *GPU_offscreen_create(int width, + int height, + bool with_depth_buffer, + eGPUTextureFormat format, + eGPUTextureUsage usage, + char err_out[256]); /** * Free a #GPUOffScreen. diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc index 4720941e1f2..64c07b4c4aa 100644 --- a/source/blender/gpu/intern/gpu_framebuffer.cc +++ b/source/blender/gpu/intern/gpu_framebuffer.cc @@ -652,8 +652,12 @@ static GPUFrameBuffer *gpu_offscreen_fb_get(GPUOffScreen *ofs) return gpu_offscreen_fb_get(ofs); } -GPUOffScreen *GPU_offscreen_create( - int width, int height, bool depth, eGPUTextureFormat format, char err_out[256]) +GPUOffScreen *GPU_offscreen_create(int width, + int height, + bool depth, + eGPUTextureFormat format, + eGPUTextureUsage usage, + char err_out[256]) { GPUOffScreen *ofs = MEM_cnew(__func__); @@ -662,7 +666,6 @@ GPUOffScreen *GPU_offscreen_create( height = max_ii(1, height); width = max_ii(1, width); - eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT; ofs->color = GPU_texture_create_2d("ofs_color", width, height, 1, format, usage, nullptr); if (depth) { diff --git a/source/blender/python/gpu/gpu_py_offscreen.c b/source/blender/python/gpu/gpu_py_offscreen.c index 6e50a7f323d..7fb7e076761 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.c +++ b/source/blender/python/gpu/gpu_py_offscreen.c @@ -232,7 +232,13 @@ static PyObject *pygpu_offscreen__tp_new(PyTypeObject *UNUSED(self), } if (GPU_context_active_get()) { - ofs = GPU_offscreen_create(width, height, true, pygpu_textureformat.value_found, err_out); + ofs = GPU_offscreen_create(width, + height, + true, + pygpu_textureformat.value_found, + GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT | + GPU_TEXTURE_USAGE_HOST_READ, + err_out); } else { STRNCPY(err_out, "No active GPU context found"); diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 1f8b434d08d..03faed2e3f7 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -684,8 +684,13 @@ static void wm_draw_region_buffer_create(ARegion *region, bool stereo, bool use_ /* Allocate offscreen buffer if it does not exist. This one has no * depth or multisample buffers. 3D view creates own buffers with * the data it needs. */ - GPUOffScreen *offscreen = GPU_offscreen_create( - region->winx, region->winy, false, GPU_RGBA8, NULL); + GPUOffScreen *offscreen = GPU_offscreen_create(region->winx, + region->winy, + false, + GPU_RGBA8, + GPU_TEXTURE_USAGE_SHADER_READ | + GPU_TEXTURE_USAGE_ATTACHMENT, + NULL); if (!offscreen) { WM_report(RPT_ERROR, "Region could not be drawn!"); return; @@ -1151,7 +1156,13 @@ static void wm_draw_window(bContext *C, wmWindow *win) * stereo methods, but it's less efficient than drawing directly. */ const int width = WM_window_pixels_x(win); const int height = WM_window_pixels_y(win); - GPUOffScreen *offscreen = GPU_offscreen_create(width, height, false, GPU_RGBA8, NULL); + GPUOffScreen *offscreen = GPU_offscreen_create(width, + height, + false, + GPU_RGBA8, + GPU_TEXTURE_USAGE_SHADER_READ | + GPU_TEXTURE_USAGE_ATTACHMENT, + NULL); if (offscreen) { GPUTexture *texture = GPU_offscreen_color_texture(offscreen); @@ -1226,7 +1237,13 @@ uint *WM_window_pixels_read_offscreen(bContext *C, wmWindow *win, int r_size[2]) r_size[0] = WM_window_pixels_x(win); r_size[1] = WM_window_pixels_y(win); - GPUOffScreen *offscreen = GPU_offscreen_create(r_size[0], r_size[1], false, GPU_RGBA8, NULL); + GPUOffScreen *offscreen = GPU_offscreen_create(r_size[0], + r_size[1], + false, + GPU_RGBA8, + GPU_TEXTURE_USAGE_SHADER_READ | + GPU_TEXTURE_USAGE_ATTACHMENT, + NULL); if (UNLIKELY(!offscreen)) { return NULL; } diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c index aefc3afff66..506533851c0 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_session.c +++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c @@ -1387,8 +1387,13 @@ bool wm_xr_session_surface_offscreen_ensure(wmXrSurfaceData *surface_data, } BLI_assert(format != GPU_R8); - offscreen = vp->offscreen = GPU_offscreen_create( - draw_view->width, draw_view->height, true, format, err_out); + offscreen = vp->offscreen = GPU_offscreen_create(draw_view->width, + draw_view->height, + true, + format, + GPU_TEXTURE_USAGE_SHADER_READ | + GPU_TEXTURE_USAGE_ATTACHMENT, + err_out); if (offscreen) { viewport = vp->viewport = GPU_viewport_create(); if (!viewport) { -- 2.30.2 From 36578ac4ee1a83afc53c80f51ed3592b66aef070 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 13 Apr 2023 15:40:21 +0200 Subject: [PATCH 2/4] Automatic add GPU_TEXTURE_USAGE_ATTACHMENT. --- source/blender/editors/gpencil/gpencil_fill.c | 9 +-- .../blender/editors/render/render_opengl.cc | 3 +- source/blender/editors/screen/screen_draw.c | 14 ++--- .../editors/space_view3d/view3d_draw.cc | 3 +- source/blender/gpu/GPU_framebuffer.h | 1 + source/blender/gpu/intern/gpu_framebuffer.cc | 3 +- source/blender/gpu/tests/state_blend_test.cc | 63 +++++++++++++++++++ source/blender/python/gpu/gpu_py_offscreen.c | 3 +- source/blender/windowmanager/intern/wm_draw.c | 27 ++------ .../windowmanager/xr/intern/wm_xr_session.c | 9 +-- 10 files changed, 86 insertions(+), 49 deletions(-) create mode 100644 source/blender/gpu/tests/state_blend_test.cc diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c index 7db1a4e1686..0dade3cee38 100644 --- a/source/blender/editors/gpencil/gpencil_fill.c +++ b/source/blender/editors/gpencil/gpencil_fill.c @@ -1234,13 +1234,8 @@ static bool gpencil_render_offscreen(tGPDfill *tgpf) tgpf->sizey = (int)tgpf->region->winy; char err_out[256] = "unknown"; - GPUOffScreen *offscreen = GPU_offscreen_create(tgpf->sizex, - tgpf->sizey, - true, - GPU_RGBA8, - GPU_TEXTURE_USAGE_ATTACHMENT | - GPU_TEXTURE_USAGE_HOST_READ, - err_out); + GPUOffScreen *offscreen = GPU_offscreen_create( + tgpf->sizex, tgpf->sizey, true, GPU_RGBA8, GPU_TEXTURE_USAGE_HOST_READ, err_out); if (offscreen == NULL) { printf("GPencil - Fill - Unable to create fill buffer\n"); return false; diff --git a/source/blender/editors/render/render_opengl.cc b/source/blender/editors/render/render_opengl.cc index 702e660dfbf..b2ce627fbe3 100644 --- a/source/blender/editors/render/render_opengl.cc +++ b/source/blender/editors/render/render_opengl.cc @@ -761,8 +761,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) sizey, true, GPU_RGBA16F, - GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT | - GPU_TEXTURE_USAGE_HOST_READ, + GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_HOST_READ, err_out); DRW_opengl_context_disable(); diff --git a/source/blender/editors/screen/screen_draw.c b/source/blender/editors/screen/screen_draw.c index c1ea6a74e35..95b82131789 100644 --- a/source/blender/editors/screen/screen_draw.c +++ b/source/blender/editors/screen/screen_draw.c @@ -425,13 +425,13 @@ static void screen_preview_draw(const bScreen *screen, int size_x, int size_y) void ED_screen_preview_render(const bScreen *screen, int size_x, int size_y, uint *r_rect) { char err_out[256] = "unknown"; - GPUOffScreen *offscreen = GPU_offscreen_create( - size_x, - size_y, - true, - GPU_RGBA8, - GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT | GPU_TEXTURE_USAGE_HOST_READ, - err_out); + GPUOffScreen *offscreen = GPU_offscreen_create(size_x, + size_y, + true, + GPU_RGBA8, + GPU_TEXTURE_USAGE_SHADER_READ | + GPU_TEXTURE_USAGE_HOST_READ, + err_out); GPU_offscreen_bind(offscreen, true); GPU_clear_color(0.0f, 0.0f, 0.0f, 0.0f); diff --git a/source/blender/editors/space_view3d/view3d_draw.cc b/source/blender/editors/space_view3d/view3d_draw.cc index 9aeffe097c1..57a98d1f265 100644 --- a/source/blender/editors/space_view3d/view3d_draw.cc +++ b/source/blender/editors/space_view3d/view3d_draw.cc @@ -1890,8 +1890,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, sizey, true, GPU_RGBA8, - GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT | - GPU_TEXTURE_USAGE_HOST_READ, + GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_HOST_READ, err_out); if (ofs == nullptr) { DRW_opengl_context_disable(); diff --git a/source/blender/gpu/GPU_framebuffer.h b/source/blender/gpu/GPU_framebuffer.h index 76187f5b049..f4a71e0811d 100644 --- a/source/blender/gpu/GPU_framebuffer.h +++ b/source/blender/gpu/GPU_framebuffer.h @@ -588,6 +588,7 @@ typedef struct GPUOffScreen GPUOffScreen; * \a format is the format of the color buffer. * If \a err_out is not `nullptr` it will be use to write any configuration error message.. * \note This function binds the framebuffer to the active context. + * \note `GPU_TEXTURE_USAGE_ATTACHMENT` is added to the usage parameter by default. */ GPUOffScreen *GPU_offscreen_create(int width, int height, diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc index 64c07b4c4aa..9bdf945b45b 100644 --- a/source/blender/gpu/intern/gpu_framebuffer.cc +++ b/source/blender/gpu/intern/gpu_framebuffer.cc @@ -656,7 +656,7 @@ GPUOffScreen *GPU_offscreen_create(int width, int height, bool depth, eGPUTextureFormat format, - eGPUTextureUsage usage, + const eGPUTextureUsage usage_, char err_out[256]) { GPUOffScreen *ofs = MEM_cnew(__func__); @@ -666,6 +666,7 @@ GPUOffScreen *GPU_offscreen_create(int width, height = max_ii(1, height); width = max_ii(1, width); + const eGPUTextureUsage usage = usage_ | GPU_TEXTURE_USAGE_ATTACHMENT; ofs->color = GPU_texture_create_2d("ofs_color", width, height, 1, format, usage, nullptr); if (depth) { diff --git a/source/blender/gpu/tests/state_blend_test.cc b/source/blender/gpu/tests/state_blend_test.cc new file mode 100644 index 00000000000..17e99045541 --- /dev/null +++ b/source/blender/gpu/tests/state_blend_test.cc @@ -0,0 +1,63 @@ +/* SPDX-License-Identifier: Apache-2.0 */ + +#include "testing/testing.h" + +#include "gpu_testing.hh" + +#include "GPU_batch.h" +#include "GPU_batch_presets.h" +#include "GPU_framebuffer.h" +#include "GPU_matrix.h" + +#include "BLI_math_vector.hh" + +#include "intern/draw_cache.h" + +namespace blender::gpu::tests { + +template +void blend_test(float4 source_a, float4 source_b, float4 expected_result) +{ + GPUOffScreen *offscreen = GPU_offscreen_create( + 1, 1, false, GPU_RGBA16F, GPU_TEXTURE_USAGE_HOST_READ, nullptr); + BLI_assert(offscreen != nullptr); + GPU_offscreen_bind(offscreen, false); + GPUTexture *color_texture = GPU_offscreen_color_texture(offscreen); + GPU_texture_clear(color_texture, GPU_DATA_FLOAT, source_a); + + GPUBatch *batch = DRW_cache_quad_get(); + + GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_UNIFORM_COLOR); + GPU_batch_uniform_4fv(batch, "color", source_b); + GPU_blend(blend_type); + + GPU_batch_draw(batch); + GPU_offscreen_unbind(offscreen, false); + GPU_flush(); + + float4 read_back; + GPU_memory_barrier(GPU_BARRIER_TEXTURE_FETCH); + GPU_offscreen_read_pixels(offscreen, GPU_DATA_FLOAT, &read_back); + EXPECT_EQ(read_back, expected_result); + + GPU_offscreen_free(offscreen); + DRW_shape_cache_free(); +} + +static void test_blend_none() +{ + blend_test(float4(1.0f, 0.0f, 1.0f, 1.0f), + float4(0.0f, 1.0f, 0.0f, 0.5f), + float4(0.0f, 1.0f, 0.0f, 0.5f)); +} +GPU_TEST(blend_none) + +static void test_blend_alpha() +{ + blend_test(float4(1.0f, 0.0f, 1.0f, 1.0f), + float4(0.0f, 1.0f, 0.0f, 0.5f), + float4(0.5f, 0.5f, 0.5f, 1.0f)); +} +GPU_TEST(blend_alpha) + +} // namespace blender::gpu::tests diff --git a/source/blender/python/gpu/gpu_py_offscreen.c b/source/blender/python/gpu/gpu_py_offscreen.c index 7fb7e076761..f88085edd5a 100644 --- a/source/blender/python/gpu/gpu_py_offscreen.c +++ b/source/blender/python/gpu/gpu_py_offscreen.c @@ -236,8 +236,7 @@ static PyObject *pygpu_offscreen__tp_new(PyTypeObject *UNUSED(self), height, true, pygpu_textureformat.value_found, - GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT | - GPU_TEXTURE_USAGE_HOST_READ, + GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_HOST_READ, err_out); } else { diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 03faed2e3f7..b63756dd886 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -684,13 +684,8 @@ static void wm_draw_region_buffer_create(ARegion *region, bool stereo, bool use_ /* Allocate offscreen buffer if it does not exist. This one has no * depth or multisample buffers. 3D view creates own buffers with * the data it needs. */ - GPUOffScreen *offscreen = GPU_offscreen_create(region->winx, - region->winy, - false, - GPU_RGBA8, - GPU_TEXTURE_USAGE_SHADER_READ | - GPU_TEXTURE_USAGE_ATTACHMENT, - NULL); + GPUOffScreen *offscreen = GPU_offscreen_create( + region->winx, region->winy, false, GPU_RGBA8, GPU_TEXTURE_USAGE_SHADER_READ, NULL); if (!offscreen) { WM_report(RPT_ERROR, "Region could not be drawn!"); return; @@ -1156,13 +1151,8 @@ static void wm_draw_window(bContext *C, wmWindow *win) * stereo methods, but it's less efficient than drawing directly. */ const int width = WM_window_pixels_x(win); const int height = WM_window_pixels_y(win); - GPUOffScreen *offscreen = GPU_offscreen_create(width, - height, - false, - GPU_RGBA8, - GPU_TEXTURE_USAGE_SHADER_READ | - GPU_TEXTURE_USAGE_ATTACHMENT, - NULL); + GPUOffScreen *offscreen = GPU_offscreen_create( + width, height, false, GPU_RGBA8, GPU_TEXTURE_USAGE_SHADER_READ, NULL); if (offscreen) { GPUTexture *texture = GPU_offscreen_color_texture(offscreen); @@ -1237,13 +1227,8 @@ uint *WM_window_pixels_read_offscreen(bContext *C, wmWindow *win, int r_size[2]) r_size[0] = WM_window_pixels_x(win); r_size[1] = WM_window_pixels_y(win); - GPUOffScreen *offscreen = GPU_offscreen_create(r_size[0], - r_size[1], - false, - GPU_RGBA8, - GPU_TEXTURE_USAGE_SHADER_READ | - GPU_TEXTURE_USAGE_ATTACHMENT, - NULL); + GPUOffScreen *offscreen = GPU_offscreen_create( + r_size[0], r_size[1], false, GPU_RGBA8, GPU_TEXTURE_USAGE_SHADER_READ, NULL); if (UNLIKELY(!offscreen)) { return NULL; } diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c index 506533851c0..64d687b956a 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_session.c +++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c @@ -1387,13 +1387,8 @@ bool wm_xr_session_surface_offscreen_ensure(wmXrSurfaceData *surface_data, } BLI_assert(format != GPU_R8); - offscreen = vp->offscreen = GPU_offscreen_create(draw_view->width, - draw_view->height, - true, - format, - GPU_TEXTURE_USAGE_SHADER_READ | - GPU_TEXTURE_USAGE_ATTACHMENT, - err_out); + offscreen = vp->offscreen = GPU_offscreen_create( + draw_view->width, draw_view->height, true, format, GPU_TEXTURE_USAGE_SHADER_READ, err_out); if (offscreen) { viewport = vp->viewport = GPU_viewport_create(); if (!viewport) { -- 2.30.2 From a01991b5387a6b4ae0df96481e31c7e2d304754b Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 13 Apr 2023 15:42:24 +0200 Subject: [PATCH 3/4] Remove unneeded file. --- source/blender/gpu/tests/state_blend_test.cc | 63 -------------------- 1 file changed, 63 deletions(-) delete mode 100644 source/blender/gpu/tests/state_blend_test.cc diff --git a/source/blender/gpu/tests/state_blend_test.cc b/source/blender/gpu/tests/state_blend_test.cc deleted file mode 100644 index 17e99045541..00000000000 --- a/source/blender/gpu/tests/state_blend_test.cc +++ /dev/null @@ -1,63 +0,0 @@ -/* SPDX-License-Identifier: Apache-2.0 */ - -#include "testing/testing.h" - -#include "gpu_testing.hh" - -#include "GPU_batch.h" -#include "GPU_batch_presets.h" -#include "GPU_framebuffer.h" -#include "GPU_matrix.h" - -#include "BLI_math_vector.hh" - -#include "intern/draw_cache.h" - -namespace blender::gpu::tests { - -template -void blend_test(float4 source_a, float4 source_b, float4 expected_result) -{ - GPUOffScreen *offscreen = GPU_offscreen_create( - 1, 1, false, GPU_RGBA16F, GPU_TEXTURE_USAGE_HOST_READ, nullptr); - BLI_assert(offscreen != nullptr); - GPU_offscreen_bind(offscreen, false); - GPUTexture *color_texture = GPU_offscreen_color_texture(offscreen); - GPU_texture_clear(color_texture, GPU_DATA_FLOAT, source_a); - - GPUBatch *batch = DRW_cache_quad_get(); - - GPU_batch_program_set_builtin(batch, GPU_SHADER_3D_UNIFORM_COLOR); - GPU_batch_uniform_4fv(batch, "color", source_b); - GPU_blend(blend_type); - - GPU_batch_draw(batch); - GPU_offscreen_unbind(offscreen, false); - GPU_flush(); - - float4 read_back; - GPU_memory_barrier(GPU_BARRIER_TEXTURE_FETCH); - GPU_offscreen_read_pixels(offscreen, GPU_DATA_FLOAT, &read_back); - EXPECT_EQ(read_back, expected_result); - - GPU_offscreen_free(offscreen); - DRW_shape_cache_free(); -} - -static void test_blend_none() -{ - blend_test(float4(1.0f, 0.0f, 1.0f, 1.0f), - float4(0.0f, 1.0f, 0.0f, 0.5f), - float4(0.0f, 1.0f, 0.0f, 0.5f)); -} -GPU_TEST(blend_none) - -static void test_blend_alpha() -{ - blend_test(float4(1.0f, 0.0f, 1.0f, 1.0f), - float4(0.0f, 1.0f, 0.0f, 0.5f), - float4(0.5f, 0.5f, 0.5f, 1.0f)); -} -GPU_TEST(blend_alpha) - -} // namespace blender::gpu::tests -- 2.30.2 From 2830dacaaecee28c48b510075ff3633bd1e3bd41 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 14 Apr 2023 16:23:09 +0200 Subject: [PATCH 4/4] Small tweaks in code readability. --- source/blender/gpu/intern/gpu_framebuffer.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/blender/gpu/intern/gpu_framebuffer.cc b/source/blender/gpu/intern/gpu_framebuffer.cc index 9bdf945b45b..1a8d8518f95 100644 --- a/source/blender/gpu/intern/gpu_framebuffer.cc +++ b/source/blender/gpu/intern/gpu_framebuffer.cc @@ -656,7 +656,7 @@ GPUOffScreen *GPU_offscreen_create(int width, int height, bool depth, eGPUTextureFormat format, - const eGPUTextureUsage usage_, + eGPUTextureUsage usage, char err_out[256]) { GPUOffScreen *ofs = MEM_cnew(__func__); @@ -666,7 +666,9 @@ GPUOffScreen *GPU_offscreen_create(int width, height = max_ii(1, height); width = max_ii(1, width); - const eGPUTextureUsage usage = usage_ | GPU_TEXTURE_USAGE_ATTACHMENT; + /* Always add GPU_TEXTURE_USAGE_ATTACHMENT for convenience. */ + usage |= GPU_TEXTURE_USAGE_ATTACHMENT; + ofs->color = GPU_texture_create_2d("ofs_color", width, height, 1, format, usage, nullptr); if (depth) { -- 2.30.2