Commit: 2e61c446acb189ecfbd5ba4508082a25ec9f4369 Author: Jason Fielder Date: Thu Dec 8 23:30:57 2022 +0100 Branches: master https://developer.blender.org/rB2e61c446acb189ecfbd5ba4508082a25ec9f4369
GPU: Explicit Texture Usage Flags for enabling GPU Backend optimizations. Texture usage flags can now be provided during texture creation specifying the ways in which a texture can be used. This allows the GPU backends to perform contextual optimizations which were not previously possible. This includes enablement of hardware lossless compression which can result in a 15%+ performance uplift for bandwidth-limited scenes on hardware such as Apple-Silicon using Metal. GPU_TEXTURE_USAGE_GENERAL can be used by default if usage is not known ahead of time. Patch will also be relevant for the Vulkan backend. Authored by Apple: Michael Parkin-White Ref T96261 Reviewed By: fclem Differential Revision: https://developer.blender.org/D15967 =================================================================== M intern/opencolorio/ocio_impl_glsl.cc M source/blender/blenfont/intern/blf_glyph.c M source/blender/blenkernel/intern/image_gpu.cc M source/blender/blenkernel/intern/studiolight.c M source/blender/draw/engines/eevee/eevee_depth_of_field.c M source/blender/draw/engines/eevee/eevee_lightcache.c M source/blender/draw/engines/eevee/eevee_motion_blur.c M source/blender/draw/engines/eevee_next/eevee_depth_of_field.cc M source/blender/draw/engines/eevee_next/eevee_hizbuffer.cc M source/blender/draw/engines/eevee_next/eevee_pipeline.hh M source/blender/draw/engines/gpencil/gpencil_antialiasing.c M source/blender/draw/engines/image/image_space_image.hh M source/blender/draw/engines/overlay/overlay_edit_uv.cc M source/blender/draw/engines/select/select_engine.c M source/blender/draw/engines/workbench/workbench_effect_antialiasing.c M source/blender/draw/engines/workbench/workbench_render.c M source/blender/draw/engines/workbench/workbench_volume.c M source/blender/draw/intern/DRW_gpu_wrapper.hh M source/blender/draw/intern/DRW_render.h M source/blender/draw/intern/draw_cache_impl_volume.cc M source/blender/draw/intern/draw_common.c M source/blender/draw/intern/draw_curves.cc M source/blender/draw/intern/draw_fluid.c M source/blender/draw/intern/draw_hair.cc M source/blender/draw/intern/draw_manager.c M source/blender/draw/intern/draw_manager_texture.c M source/blender/draw/intern/draw_texture_pool.cc M source/blender/draw/intern/draw_texture_pool.h M source/blender/draw/intern/draw_volume.cc M source/blender/editors/interface/interface_icons.cc M source/blender/editors/sculpt_paint/paint_cursor.cc M source/blender/editors/space_clip/clip_draw.c M source/blender/editors/space_sequencer/sequencer_draw.c M source/blender/gpu/GPU_texture.h M source/blender/gpu/intern/gpu_framebuffer.cc M source/blender/gpu/intern/gpu_material.c M source/blender/gpu/intern/gpu_texture.cc M source/blender/gpu/intern/gpu_texture_private.hh M source/blender/gpu/intern/gpu_viewport.c M source/blender/gpu/metal/mtl_texture.hh M source/blender/gpu/metal/mtl_texture.mm M source/blender/gpu/metal/mtl_texture_util.mm M source/blender/imbuf/intern/util_gpu.c M source/blender/windowmanager/intern/wm_operators.c M source/blender/windowmanager/intern/wm_playanim.c =================================================================== diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc index 150ed1a58bb..6a72cd2aacb 100644 --- a/intern/opencolorio/ocio_impl_glsl.cc +++ b/intern/opencolorio/ocio_impl_glsl.cc @@ -337,10 +337,12 @@ static bool addGPULut1D2D(OCIO_GPUTextures &textures, * It depends on more than height. So check instead by looking at the source. */ std::string sampler1D_name = std::string("sampler1D ") + sampler_name; if (strstr(shader_desc->getShaderText(), sampler1D_name.c_str()) != nullptr) { - lut.texture = GPU_texture_create_1d(texture_name, width, 1, format, values); + lut.texture = GPU_texture_create_1d_ex( + texture_name, width, 1, format, GPU_TEXTURE_USAGE_SHADER_READ, values); } else { - lut.texture = GPU_texture_create_2d(texture_name, width, height, 1, format, values); + lut.texture = GPU_texture_create_2d_ex( + texture_name, width, height, 1, format, GPU_TEXTURE_USAGE_SHADER_READ, values); } if (lut.texture == nullptr) { return false; @@ -372,8 +374,15 @@ static bool addGPULut3D(OCIO_GPUTextures &textures, } OCIO_GPULutTexture lut; - lut.texture = GPU_texture_create_3d( - texture_name, edgelen, edgelen, edgelen, 1, GPU_RGB16F, GPU_DATA_FLOAT, values); + lut.texture = GPU_texture_create_3d_ex(texture_name, + edgelen, + edgelen, + edgelen, + 1, + GPU_RGB16F, + GPU_DATA_FLOAT, + GPU_TEXTURE_USAGE_SHADER_READ, + values); if (lut.texture == nullptr) { return false; } @@ -442,7 +451,8 @@ static bool createGPUCurveMapping(OCIO_GPUCurveMappping &curvemap, if (curve_mapping_settings) { int lut_size = curve_mapping_settings->lut_size; - curvemap.texture = GPU_texture_create_1d("OCIOCurveMap", lut_size, 1, GPU_RGBA16F, nullptr); + curvemap.texture = GPU_texture_create_1d_ex( + "OCIOCurveMap", lut_size, 1, GPU_RGBA16F, GPU_TEXTURE_USAGE_SHADER_READ, nullptr); GPU_texture_filter_mode(curvemap.texture, false); GPU_texture_wrap_mode(curvemap.texture, false, true); diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index b60ca3da1ea..b95a48daccf 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -1199,7 +1199,8 @@ void blf_glyph_draw(FontBLF *font, GlyphCacheBLF *gc, GlyphBLF *g, const int x, if (gc->texture) { GPU_texture_free(gc->texture); } - gc->texture = GPU_texture_create_2d(__func__, w, h, 1, GPU_R8, NULL); + gc->texture = GPU_texture_create_2d_ex( + __func__, w, h, 1, GPU_R8, GPU_TEXTURE_USAGE_SHADER_READ, NULL); gc->bitmap_len_landed = 0; } diff --git a/source/blender/blenkernel/intern/image_gpu.cc b/source/blender/blenkernel/intern/image_gpu.cc index 6893a50638a..12f3287ef97 100644 --- a/source/blender/blenkernel/intern/image_gpu.cc +++ b/source/blender/blenkernel/intern/image_gpu.cc @@ -111,7 +111,8 @@ static GPUTexture *gpu_texture_create_tile_mapping(Image *ima, const int multivi tile_info[3] = tile_runtime->tilearray_size[1] / array_h; } - GPUTexture *tex = GPU_texture_create_1d_array(ima->id.name + 2, width, 2, 1, GPU_RGBA32F, data); + GPUTexture *tex = GPU_texture_create_1d_array_ex( + ima->id.name + 2, width, 2, 1, GPU_RGBA32F, GPU_TEXTURE_USAGE_SHADER_READ, data); GPU_texture_mipmap_mode(tex, false, false); MEM_freeN(data); diff --git a/source/blender/blenkernel/intern/studiolight.c b/source/blender/blenkernel/intern/studiolight.c index daad983f0bf..9a1d45434c2 100644 --- a/source/blender/blenkernel/intern/studiolight.c +++ b/source/blender/blenkernel/intern/studiolight.c @@ -478,8 +478,13 @@ static void studiolight_create_equirect_radiance_gputexture(StudioLight *sl) BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EXTERNAL_IMAGE_LOADED); ImBuf *ibuf = sl->equirect_radiance_buffer; - sl->equirect_radiance_gputexture = GPU_texture_create_2d( - "studiolight_radiance", ibuf->x, ibuf->y, 1, GPU_RGBA16F, ibuf->rect_float); + sl->equirect_radiance_gputexture = GPU_texture_create_2d_ex("studiolight_radiance", + ibuf->x, + ibuf->y, + 1, + GPU_RGBA16F, + GPU_TEXTURE_USAGE_SHADER_READ, + ibuf->rect_float); GPUTexture *tex = sl->equirect_radiance_gputexture; GPU_texture_filter_mode(tex, true); GPU_texture_wrap_mode(tex, true, true); @@ -499,7 +504,8 @@ static void studiolight_create_matcap_gputexture(StudioLightImage *sli) copy_v3_v3(*offset3, *offset4); } - sli->gputexture = GPU_texture_create_2d("matcap", ibuf->x, ibuf->y, 1, GPU_R11F_G11F_B10F, NULL); + sli->gputexture = GPU_texture_create_2d_ex( + "matcap", ibuf->x, ibuf->y, 1, GPU_R11F_G11F_B10F, GPU_TEXTURE_USAGE_SHADER_READ, NULL); GPU_texture_update(sli->gputexture, GPU_DATA_FLOAT, gpu_matcap_3components); MEM_SAFE_FREE(gpu_matcap_3components); @@ -533,8 +539,13 @@ static void studiolight_create_equirect_irradiance_gputexture(StudioLight *sl) if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) { BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECT_IRRADIANCE_IMAGE_CALCULATED); ImBuf *ibuf = sl->equirect_irradiance_buffer; - sl->equirect_irradiance_gputexture = GPU_texture_create_2d( - "studiolight_irradiance", ibuf->x, ibuf->y, 1, GPU_RGBA16F, ibuf->rect_float); + sl->equirect_irradiance_gputexture = GPU_texture_create_2d_ex("studiolight_irradiance", + ibuf->x, + ibuf->y, + 1, + GPU_RGBA16F, + GPU_TEXTURE_USAGE_SHADER_READ, + ibuf->rect_float); GPUTexture *tex = sl->equirect_irradiance_gputexture; GPU_texture_filter_mode(tex, true); GPU_texture_wrap_mode(tex, true, true); diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c index caa63b9c54c..e529411bbfd 100644 --- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c +++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c @@ -362,9 +362,13 @@ static void dof_bokeh_pass_init(EEVEE_FramebufferList *fbl, DRW_shgroup_uniform_vec2_copy(grp, "bokehAnisotropyInv", fx->dof_bokeh_aniso_inv); DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - fx->dof_bokeh_gather_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_RG16F, owner); - fx->dof_bokeh_scatter_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); - fx->dof_bokeh_resolve_lut_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_R16F, owner); + eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT; + fx->dof_bokeh_gather_lut_tx = DRW_texture_pool_query_2d_ex( + UNPACK2(res), GPU_RG16F, usage, owner); + fx->dof_bokeh_scatter_lut_tx = DRW_texture_pool_query_2d_ex( + UNPACK2(res), GPU_R16F, usage, owner); + fx->dof_bokeh_resolve_lut_tx = DRW_texture_pool_query_2d_ex( + UNPACK2(res), GPU_R16F, usage, owner); GPU_framebuffer_ensure_config(&fbl->dof_bokeh_fb, { @@ -398,8 +402,10 @@ static void dof_setup_pass_init(EEVEE_FramebufferList *fbl, DRW_shgroup_uniform_float_copy(grp, "bokehMaxSize", fx->dof_bokeh_max_size); DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - fx->dof_half_res_color_tx = DRW_texture_pool_query_2d(UNPACK2(res), COLOR_FORMAT, owner); - fx->dof_half_res_coc_tx = DRW_texture_pool_query_2d(UNPACK2(res), GPU_RG16F, owner); + eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT; + fx->dof_half_res_color_tx = DRW_texture_pool_query_2d_ex( + UNPACK2(res), COLOR_FORMAT, usage, owner); + fx->dof_half_res_coc_tx = DRW_texture_pool_query_2d_ex(UNPACK2(res), GPU_RG16F, usage, owner); GPU_framebuffer_ensure_config(&fbl->dof_setup_fb, { @@ -429,8 +435,11 @@ static void dof_flatten_tiles_pass_init(EEVEE_FramebufferList *fbl, grp, "halfResCocBuffer", &fx->dof_half_res_coc_tx, NO_FILTERING); DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - fx->dof_coc_tiles_fg_tx = DRW_texture_pool_query_2d(UNPACK2(res), FG_TILE_FORMAT, owner); - fx->dof_coc_tiles_bg_tx = DRW_texture_pool_query_2d(UNPACK2(res), BG_TILE_FORMAT, owner); + eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT; + fx->dof_coc_tiles_fg_tx = DRW_texture_pool_query_2d_ex( + UNPACK2(res), FG_TILE_FORMAT, usage, owner); + fx->dof_coc_tiles_bg_tx = DRW_texture_pool_query_2d_ex( + UNPACK2(res), BG_TILE_FORMAT, usage, owner); GPU_framebuffer_ensure_config(&fbl->dof_flatten_tiles_fb, { @@ -468,9 +477,11 @@ static void dof_dilate_tiles_pass_init(EEVEE_FramebufferList *fbl, DRW_shgroup_uniform_int(grp, "ringWidthMultiplier", &fx->dof_dilate_ring_width_multiplier, 1); DRW_shgroup_call_procedural_triangles(grp, NULL, 1); } - - fx->dof_coc_dilated_tiles_fg_tx = DRW_texture_pool_query_2d(UNPACK2(res), FG_TILE_FORMAT, owner); - fx->dof_coc_dilated_tiles_bg_tx = DRW_texture_pool_query_2d(UNPACK2(res), BG_TILE_FORMAT, owner); + eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT; + fx->dof_coc_dilated_tiles_fg_tx = DRW_texture_pool_ @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs