From a22a4810c74bc450b5fc06f4ca59072b09aeaf87 Mon Sep 17 00:00:00 2001 From: Miguel Pozo Date: Fri, 14 Jun 2024 19:27:33 +0200 Subject: [PATCH 1/2] GPU: Use size_t for GPU buffer sizes Update all GPU buffer size-related functions to use `size_t` for consistency. Pull Request: https://projects.blender.org/blender/blender/pulls/123240 --- source/blender/gpu/dummy/dummy_backend.hh | 6 +++--- source/blender/gpu/intern/gpu_backend.hh | 6 +++--- source/blender/gpu/metal/mtl_backend.hh | 6 +++--- source/blender/gpu/metal/mtl_backend.mm | 6 +++--- source/blender/gpu/metal/mtl_texture.hh | 2 +- source/blender/gpu/metal/mtl_texture.mm | 2 +- source/blender/gpu/opengl/gl_backend.hh | 6 +++--- source/blender/gpu/opengl/gl_texture.cc | 2 +- source/blender/gpu/opengl/gl_texture.hh | 2 +- source/blender/gpu/vulkan/vk_backend.cc | 6 +++--- source/blender/gpu/vulkan/vk_backend.hh | 6 +++--- source/blender/gpu/vulkan/vk_buffer.cc | 2 +- source/blender/gpu/vulkan/vk_buffer.hh | 4 ++-- source/blender/gpu/vulkan/vk_pixel_buffer.cc | 2 +- source/blender/gpu/vulkan/vk_pixel_buffer.hh | 2 +- source/blender/gpu/vulkan/vk_storage_buffer.cc | 2 +- source/blender/gpu/vulkan/vk_storage_buffer.hh | 2 +- source/blender/gpu/vulkan/vk_uniform_buffer.hh | 2 +- 18 files changed, 33 insertions(+), 33 deletions(-) diff --git a/source/blender/gpu/dummy/dummy_backend.hh b/source/blender/gpu/dummy/dummy_backend.hh index 3cd88bacb41..566bb679c1d 100644 --- a/source/blender/gpu/dummy/dummy_backend.hh +++ b/source/blender/gpu/dummy/dummy_backend.hh @@ -63,7 +63,7 @@ class DummyBackend : public GPUBackend { { return nullptr; } - PixelBuffer *pixelbuf_alloc(uint /*size*/) override + PixelBuffer *pixelbuf_alloc(size_t /*size*/) override { return nullptr; } @@ -79,11 +79,11 @@ class DummyBackend : public GPUBackend { { return nullptr; } - UniformBuf *uniformbuf_alloc(int /*size*/, const char * /*name*/) override + UniformBuf *uniformbuf_alloc(size_t /*size*/, const char * /*name*/) override { return nullptr; } - StorageBuf *storagebuf_alloc(int /*size*/, + StorageBuf *storagebuf_alloc(size_t /*size*/, GPUUsageType /*usage*/, const char * /*name*/) override { diff --git a/source/blender/gpu/intern/gpu_backend.hh b/source/blender/gpu/intern/gpu_backend.hh index d9c824cf01e..fe938ebb6df 100644 --- a/source/blender/gpu/intern/gpu_backend.hh +++ b/source/blender/gpu/intern/gpu_backend.hh @@ -48,12 +48,12 @@ class GPUBackend { virtual Fence *fence_alloc() = 0; virtual FrameBuffer *framebuffer_alloc(const char *name) = 0; virtual IndexBuf *indexbuf_alloc() = 0; - virtual PixelBuffer *pixelbuf_alloc(uint size) = 0; + virtual PixelBuffer *pixelbuf_alloc(size_t size) = 0; virtual QueryPool *querypool_alloc() = 0; virtual Shader *shader_alloc(const char *name) = 0; virtual Texture *texture_alloc(const char *name) = 0; - virtual UniformBuf *uniformbuf_alloc(int size, const char *name) = 0; - virtual StorageBuf *storagebuf_alloc(int size, GPUUsageType usage, const char *name) = 0; + virtual UniformBuf *uniformbuf_alloc(size_t size, const char *name) = 0; + virtual StorageBuf *storagebuf_alloc(size_t size, GPUUsageType usage, const char *name) = 0; virtual VertBuf *vertbuf_alloc() = 0; /* Render Frame Coordination -- diff --git a/source/blender/gpu/metal/mtl_backend.hh b/source/blender/gpu/metal/mtl_backend.hh index ae77d9e99d0..b22bdf8f711 100644 --- a/source/blender/gpu/metal/mtl_backend.hh +++ b/source/blender/gpu/metal/mtl_backend.hh @@ -64,12 +64,12 @@ class MTLBackend : public GPUBackend { Fence *fence_alloc() override; FrameBuffer *framebuffer_alloc(const char *name) override; IndexBuf *indexbuf_alloc() override; - PixelBuffer *pixelbuf_alloc(uint size) override; + PixelBuffer *pixelbuf_alloc(size_t size) override; QueryPool *querypool_alloc() override; Shader *shader_alloc(const char *name) override; Texture *texture_alloc(const char *name) override; - UniformBuf *uniformbuf_alloc(int size, const char *name) override; - StorageBuf *storagebuf_alloc(int size, GPUUsageType usage, const char *name) override; + UniformBuf *uniformbuf_alloc(size_t size, const char *name) override; + StorageBuf *storagebuf_alloc(size_t size, GPUUsageType usage, const char *name) override; VertBuf *vertbuf_alloc() override; /* Render Frame Coordination. */ diff --git a/source/blender/gpu/metal/mtl_backend.mm b/source/blender/gpu/metal/mtl_backend.mm index 76169863a9f..b10c314b7e6 100644 --- a/source/blender/gpu/metal/mtl_backend.mm +++ b/source/blender/gpu/metal/mtl_backend.mm @@ -73,7 +73,7 @@ IndexBuf *MTLBackend::indexbuf_alloc() return new MTLIndexBuf(); }; -PixelBuffer *MTLBackend::pixelbuf_alloc(uint size) +PixelBuffer *MTLBackend::pixelbuf_alloc(size_t size) { return new MTLPixelBuffer(size); }; @@ -93,12 +93,12 @@ Texture *MTLBackend::texture_alloc(const char *name) return new gpu::MTLTexture(name); } -UniformBuf *MTLBackend::uniformbuf_alloc(int size, const char *name) +UniformBuf *MTLBackend::uniformbuf_alloc(size_t size, const char *name) { return new MTLUniformBuf(size, name); }; -StorageBuf *MTLBackend::storagebuf_alloc(int size, GPUUsageType usage, const char *name) +StorageBuf *MTLBackend::storagebuf_alloc(size_t size, GPUUsageType usage, const char *name) { return new MTLStorageBuf(size, usage, name); } diff --git a/source/blender/gpu/metal/mtl_texture.hh b/source/blender/gpu/metal/mtl_texture.hh index 76aff9b88a9..d97e8cffd3b 100644 --- a/source/blender/gpu/metal/mtl_texture.hh +++ b/source/blender/gpu/metal/mtl_texture.hh @@ -481,7 +481,7 @@ class MTLPixelBuffer : public PixelBuffer { id buffer_ = nil; public: - MTLPixelBuffer(uint size); + MTLPixelBuffer(size_t size); ~MTLPixelBuffer(); void *map() override; diff --git a/source/blender/gpu/metal/mtl_texture.mm b/source/blender/gpu/metal/mtl_texture.mm index 71d75a3a2e8..96037e6a14f 100644 --- a/source/blender/gpu/metal/mtl_texture.mm +++ b/source/blender/gpu/metal/mtl_texture.mm @@ -2596,7 +2596,7 @@ id MTLTexture::get_non_srgb_handle() /** \name Pixel Buffer * \{ */ -MTLPixelBuffer::MTLPixelBuffer(uint size) : PixelBuffer(size) +MTLPixelBuffer::MTLPixelBuffer(size_t size) : PixelBuffer(size) { /* Ensure buffer satisfies the alignment of 256 bytes for copying * data between buffers and textures. As specified in: diff --git a/source/blender/gpu/opengl/gl_backend.hh b/source/blender/gpu/opengl/gl_backend.hh index 4635de1d402..13dfd9a3774 100644 --- a/source/blender/gpu/opengl/gl_backend.hh +++ b/source/blender/gpu/opengl/gl_backend.hh @@ -106,7 +106,7 @@ class GLBackend : public GPUBackend { return new GLIndexBuf(); }; - PixelBuffer *pixelbuf_alloc(uint size) override + PixelBuffer *pixelbuf_alloc(size_t size) override { return new GLPixelBuffer(size); }; @@ -126,12 +126,12 @@ class GLBackend : public GPUBackend { return new GLTexture(name); }; - UniformBuf *uniformbuf_alloc(int size, const char *name) override + UniformBuf *uniformbuf_alloc(size_t size, const char *name) override { return new GLUniformBuf(size, name); }; - StorageBuf *storagebuf_alloc(int size, GPUUsageType usage, const char *name) override + StorageBuf *storagebuf_alloc(size_t size, GPUUsageType usage, const char *name) override { return new GLStorageBuf(size, usage, name); }; diff --git a/source/blender/gpu/opengl/gl_texture.cc b/source/blender/gpu/opengl/gl_texture.cc index a99d55df2e6..0c06c200ad8 100644 --- a/source/blender/gpu/opengl/gl_texture.cc +++ b/source/blender/gpu/opengl/gl_texture.cc @@ -768,7 +768,7 @@ uint GLTexture::gl_bindcode_get() const /** \name Pixel Buffer * \{ */ -GLPixelBuffer::GLPixelBuffer(uint size) : PixelBuffer(size) +GLPixelBuffer::GLPixelBuffer(size_t size) : PixelBuffer(size) { glGenBuffers(1, &gl_id_); BLI_assert(gl_id_); diff --git a/source/blender/gpu/opengl/gl_texture.hh b/source/blender/gpu/opengl/gl_texture.hh index 58d93bea676..806c7f74b60 100644 --- a/source/blender/gpu/opengl/gl_texture.hh +++ b/source/blender/gpu/opengl/gl_texture.hh @@ -132,7 +132,7 @@ class GLPixelBuffer : public PixelBuffer { GLuint gl_id_ = 0; public: - GLPixelBuffer(uint size); + GLPixelBuffer(size_t size); ~GLPixelBuffer(); void *map() override; diff --git a/source/blender/gpu/vulkan/vk_backend.cc b/source/blender/gpu/vulkan/vk_backend.cc index db4f6aef9e4..69f579dfc42 100644 --- a/source/blender/gpu/vulkan/vk_backend.cc +++ b/source/blender/gpu/vulkan/vk_backend.cc @@ -225,7 +225,7 @@ IndexBuf *VKBackend::indexbuf_alloc() return new VKIndexBuffer(); } -PixelBuffer *VKBackend::pixelbuf_alloc(uint size) +PixelBuffer *VKBackend::pixelbuf_alloc(size_t size) { return new VKPixelBuffer(size); } @@ -245,12 +245,12 @@ Texture *VKBackend::texture_alloc(const char *name) return new VKTexture(name); } -UniformBuf *VKBackend::uniformbuf_alloc(int size, const char *name) +UniformBuf *VKBackend::uniformbuf_alloc(size_t size, const char *name) { return new VKUniformBuffer(size, name); } -StorageBuf *VKBackend::storagebuf_alloc(int size, GPUUsageType usage, const char *name) +StorageBuf *VKBackend::storagebuf_alloc(size_t size, GPUUsageType usage, const char *name) { return new VKStorageBuffer(size, usage, name); } diff --git a/source/blender/gpu/vulkan/vk_backend.hh b/source/blender/gpu/vulkan/vk_backend.hh index 107af4c77ed..46461150d25 100644 --- a/source/blender/gpu/vulkan/vk_backend.hh +++ b/source/blender/gpu/vulkan/vk_backend.hh @@ -58,12 +58,12 @@ class VKBackend : public GPUBackend { Fence *fence_alloc() override; FrameBuffer *framebuffer_alloc(const char *name) override; IndexBuf *indexbuf_alloc() override; - PixelBuffer *pixelbuf_alloc(uint size) override; + PixelBuffer *pixelbuf_alloc(size_t size) override; QueryPool *querypool_alloc() override; Shader *shader_alloc(const char *name) override; Texture *texture_alloc(const char *name) override; - UniformBuf *uniformbuf_alloc(int size, const char *name) override; - StorageBuf *storagebuf_alloc(int size, GPUUsageType usage, const char *name) override; + UniformBuf *uniformbuf_alloc(size_t size, const char *name) override; + StorageBuf *storagebuf_alloc(size_t size, GPUUsageType usage, const char *name) override; VertBuf *vertbuf_alloc() override; /* Render Frame Coordination -- diff --git a/source/blender/gpu/vulkan/vk_buffer.cc b/source/blender/gpu/vulkan/vk_buffer.cc index 2427197a6c4..20472eba347 100644 --- a/source/blender/gpu/vulkan/vk_buffer.cc +++ b/source/blender/gpu/vulkan/vk_buffer.cc @@ -51,7 +51,7 @@ static VkMemoryPropertyFlags vma_preferred_flags(const bool is_host_visible) * staging buffer can be skipped, or in case of a vertex buffer an intermediate buffer can be * removed. */ -bool VKBuffer::create(int64_t size_in_bytes, +bool VKBuffer::create(size_t size_in_bytes, GPUUsageType usage, VkBufferUsageFlags buffer_usage, const bool is_host_visible) diff --git a/source/blender/gpu/vulkan/vk_buffer.hh b/source/blender/gpu/vulkan/vk_buffer.hh index a30e1c000aa..df78d21e0e3 100644 --- a/source/blender/gpu/vulkan/vk_buffer.hh +++ b/source/blender/gpu/vulkan/vk_buffer.hh @@ -19,7 +19,7 @@ class VKContext; * Class for handing vulkan buffers (allocation/updating/binding). */ class VKBuffer { - int64_t size_in_bytes_ = 0; + size_t size_in_bytes_ = 0; VkBuffer vk_buffer_ = VK_NULL_HANDLE; VmaAllocation allocation_ = VK_NULL_HANDLE; /* Pointer to the virtually mapped memory. */ @@ -31,7 +31,7 @@ class VKBuffer { /** Has this buffer been allocated? */ bool is_allocated() const; - bool create(int64_t size, + bool create(size_t size, GPUUsageType usage, VkBufferUsageFlags buffer_usage, bool is_host_visible = true); diff --git a/source/blender/gpu/vulkan/vk_pixel_buffer.cc b/source/blender/gpu/vulkan/vk_pixel_buffer.cc index c0f37eda055..684f9ac6b72 100644 --- a/source/blender/gpu/vulkan/vk_pixel_buffer.cc +++ b/source/blender/gpu/vulkan/vk_pixel_buffer.cc @@ -12,7 +12,7 @@ namespace blender::gpu { -VKPixelBuffer::VKPixelBuffer(int64_t size) : PixelBuffer(size) +VKPixelBuffer::VKPixelBuffer(size_t size) : PixelBuffer(size) { buffer_.create( size, GPU_USAGE_STATIC, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); diff --git a/source/blender/gpu/vulkan/vk_pixel_buffer.hh b/source/blender/gpu/vulkan/vk_pixel_buffer.hh index e7a2ee93e78..a7860f7e3c8 100644 --- a/source/blender/gpu/vulkan/vk_pixel_buffer.hh +++ b/source/blender/gpu/vulkan/vk_pixel_buffer.hh @@ -18,7 +18,7 @@ class VKPixelBuffer : public PixelBuffer { VKBuffer buffer_; public: - VKPixelBuffer(int64_t size); + VKPixelBuffer(size_t size); void *map() override; void unmap() override; int64_t get_native_handle() override; diff --git a/source/blender/gpu/vulkan/vk_storage_buffer.cc b/source/blender/gpu/vulkan/vk_storage_buffer.cc index c9d30f270b2..4e3a0791a67 100644 --- a/source/blender/gpu/vulkan/vk_storage_buffer.cc +++ b/source/blender/gpu/vulkan/vk_storage_buffer.cc @@ -15,7 +15,7 @@ namespace blender::gpu { -VKStorageBuffer::VKStorageBuffer(int size, GPUUsageType usage, const char *name) +VKStorageBuffer::VKStorageBuffer(size_t size, GPUUsageType usage, const char *name) : StorageBuf(size, name), usage_(usage) { } diff --git a/source/blender/gpu/vulkan/vk_storage_buffer.hh b/source/blender/gpu/vulkan/vk_storage_buffer.hh index 3457d1b84a2..ab9ffc530cf 100644 --- a/source/blender/gpu/vulkan/vk_storage_buffer.hh +++ b/source/blender/gpu/vulkan/vk_storage_buffer.hh @@ -24,7 +24,7 @@ class VKStorageBuffer : public StorageBuf, public VKBindableResource { VKBuffer buffer_; public: - VKStorageBuffer(int size, GPUUsageType usage, const char *name); + VKStorageBuffer(size_t size, GPUUsageType usage, const char *name); void update(const void *data) override; void bind(int slot) override; diff --git a/source/blender/gpu/vulkan/vk_uniform_buffer.hh b/source/blender/gpu/vulkan/vk_uniform_buffer.hh index 71ad2958d61..7abf06f4798 100644 --- a/source/blender/gpu/vulkan/vk_uniform_buffer.hh +++ b/source/blender/gpu/vulkan/vk_uniform_buffer.hh @@ -21,7 +21,7 @@ class VKUniformBuffer : public UniformBuf, public VKBindableResource, NonCopyabl VKBuffer buffer_; public: - VKUniformBuffer(int size, const char *name) : UniformBuf(size, name) {} + VKUniformBuffer(size_t size, const char *name) : UniformBuf(size, name) {} void update(const void *data) override; void clear_to_zero() override; From 1d53025868f8954bc1b975a5af5f3fca1f981e1b Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 14 Jun 2024 20:12:00 +0200 Subject: [PATCH 2/2] Fix #121806: smooth shading not updating correctly `booleans_mix_calc` was incorrect. While it computed the correct result in many common cases, under some specific circumstances, at was wrong. Whether it was wrong also depended on how the range was split up for multi-threading which is not deterministic. The function was used in `Mesh::normals_domain` which then also returned the wrong domain in some cases. --- source/blender/blenlib/intern/array_utils.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/blender/blenlib/intern/array_utils.cc b/source/blender/blenlib/intern/array_utils.cc index ff190f2513a..89b63dcc4d3 100644 --- a/source/blender/blenlib/intern/array_utils.cc +++ b/source/blender/blenlib/intern/array_utils.cc @@ -113,13 +113,14 @@ BooleanMix booleans_mix_calc(const VArray &varray, const IndexRange range_ } const Span slice = span.slice(range); - const bool first = slice.first(); - for (const bool value : slice.drop_front(1)) { - if (value != first) { + const bool compare_value = (init == BooleanMix::None) ? slice.first() : + (init == BooleanMix::AllTrue); + for (const bool value : slice) { + if (value != compare_value) { return BooleanMix::Mixed; } } - return first ? BooleanMix::AllTrue : BooleanMix::AllFalse; + return compare_value ? BooleanMix::AllTrue : BooleanMix::AllFalse; }, [&](BooleanMix a, BooleanMix b) { return (a == b) ? a : BooleanMix::Mixed; }); }