Commit: 479de155f422786628eb9f712088a8112a7d58af Author: Jeroen Bakker Date: Wed May 26 16:33:54 2021 +0200 Branches: temp-gpu-compute-shaders https://developer.blender.org/rB479de155f422786628eb9f712088a8112a7d58af
Splitted read and unmap in different calls. Most of the time you just want to access the data without the overhead of a local copy. =================================================================== M source/blender/gpu/GPU_index_buffer.h M source/blender/gpu/GPU_vertex_buffer.h M source/blender/gpu/intern/gpu_index_buffer.cc M source/blender/gpu/intern/gpu_index_buffer_private.hh M source/blender/gpu/intern/gpu_vertex_buffer.cc M source/blender/gpu/intern/gpu_vertex_buffer_private.hh M source/blender/gpu/opengl/gl_index_buffer.cc M source/blender/gpu/opengl/gl_vertex_buffer.cc M source/blender/gpu/opengl/gl_vertex_buffer.hh M source/blender/gpu/tests/gpu_shader_test.cc =================================================================== diff --git a/source/blender/gpu/GPU_index_buffer.h b/source/blender/gpu/GPU_index_buffer.h index 03e39a5d846..d1e68842563 100644 --- a/source/blender/gpu/GPU_index_buffer.h +++ b/source/blender/gpu/GPU_index_buffer.h @@ -80,7 +80,14 @@ void GPU_indexbuf_create_subrange_in_place(GPUIndexBuf *elem, uint start, uint length); +/** + * (Download and) return a pointer containing the data of an index buffer. + * + * Note that the returned pointer is still owned by the driver. To get an + * local copy, use `GPU_indexbuf_unmap` after calling `GPU_indexbuf_read`. + */ uint32_t *GPU_indexbuf_read(GPUIndexBuf *elem); +uint32_t *GPU_indexbuf_unmap(const GPUIndexBuf *elem, const uint32_t *mapped_data); void GPU_indexbuf_discard(GPUIndexBuf *elem); diff --git a/source/blender/gpu/GPU_vertex_buffer.h b/source/blender/gpu/GPU_vertex_buffer.h index b528c024e01..605d660126f 100644 --- a/source/blender/gpu/GPU_vertex_buffer.h +++ b/source/blender/gpu/GPU_vertex_buffer.h @@ -71,7 +71,14 @@ GPUVertBuf *GPU_vertbuf_create_with_format_ex(const GPUVertFormat *, GPUUsageTyp #define GPU_vertbuf_create_with_format(format) \ GPU_vertbuf_create_with_format_ex(format, GPU_USAGE_STATIC) +/** + * (Download and) return a pointer containing the data of a vertex buffer. + * + * Note that the returned pointer is still owned by the driver. To get an + * local copy, use `GPU_vertbuf_unmap` after calling `GPU_vertbuf_read`. + */ void *GPU_vertbuf_read(GPUVertBuf *verts); +void *GPU_vertbuf_unmap(const GPUVertBuf *verts, const void *mapped_data); void GPU_vertbuf_clear(GPUVertBuf *verts); void GPU_vertbuf_discard(GPUVertBuf *); diff --git a/source/blender/gpu/intern/gpu_index_buffer.cc b/source/blender/gpu/intern/gpu_index_buffer.cc index 3586c512fda..e7009addde1 100644 --- a/source/blender/gpu/intern/gpu_index_buffer.cc +++ b/source/blender/gpu/intern/gpu_index_buffer.cc @@ -31,6 +31,8 @@ #include "gpu_index_buffer_private.hh" +#include <cstring> + #define KEEP_SINGLE_COPY 1 #define RESTART_INDEX 0xFFFFFFFF @@ -324,6 +326,13 @@ void IndexBuf::squeeze_indices_short(uint min_idx, uint max_idx) } } + uint32_t *IndexBuf::unmap(const uint32_t* mapped_memory) const { + size_t size = size_get(); + uint32_t *result = static_cast<uint32_t *>(MEM_mallocN(size, __func__)); + memcpy(result, mapped_memory, size); + return result; + } + } // namespace blender::gpu /** \} */ @@ -373,6 +382,11 @@ uint32_t *GPU_indexbuf_read(GPUIndexBuf *elem) return unwrap(elem)->read(); } +uint32_t *GPU_indexbuf_unmap(const GPUIndexBuf *elem, const uint32_t *mapped_buffer) +{ + return unwrap(elem)->unmap(mapped_buffer); +} + void GPU_indexbuf_discard(GPUIndexBuf *elem) { delete unwrap(elem); diff --git a/source/blender/gpu/intern/gpu_index_buffer_private.hh b/source/blender/gpu/intern/gpu_index_buffer_private.hh index 9d81c338417..07c163b000f 100644 --- a/source/blender/gpu/intern/gpu_index_buffer_private.hh +++ b/source/blender/gpu/intern/gpu_index_buffer_private.hh @@ -95,6 +95,7 @@ class IndexBuf { virtual void bind_as_ssbo(uint binding) = 0; virtual uint32_t *read() const = 0; + uint32_t *unmap(const uint32_t* mapped_memory) const; private: inline void squeeze_indices_short(uint min_idx, uint max_idx); @@ -110,6 +111,10 @@ static inline IndexBuf *unwrap(GPUIndexBuf *indexbuf) { return reinterpret_cast<IndexBuf *>(indexbuf); } +static inline const IndexBuf *unwrap(const GPUIndexBuf *indexbuf) +{ + return reinterpret_cast<const IndexBuf *>(indexbuf); +} static inline int indices_per_primitive(GPUPrimType prim_type) { diff --git a/source/blender/gpu/intern/gpu_vertex_buffer.cc b/source/blender/gpu/intern/gpu_vertex_buffer.cc index fa27ccfbed8..6f48ef45645 100644 --- a/source/blender/gpu/intern/gpu_vertex_buffer.cc +++ b/source/blender/gpu/intern/gpu_vertex_buffer.cc @@ -154,6 +154,11 @@ void *GPU_vertbuf_read(GPUVertBuf *verts) return unwrap(verts)->read(); } +void *GPU_vertbuf_unmap(const GPUVertBuf *verts, const void *mapped_data) +{ + return unwrap(verts)->unmap(mapped_data); +} + /** Same as discard but does not free. */ void GPU_vertbuf_clear(GPUVertBuf *verts) { diff --git a/source/blender/gpu/intern/gpu_vertex_buffer_private.hh b/source/blender/gpu/intern/gpu_vertex_buffer_private.hh index 27e36ae3915..9143d5d601f 100644 --- a/source/blender/gpu/intern/gpu_vertex_buffer_private.hh +++ b/source/blender/gpu/intern/gpu_vertex_buffer_private.hh @@ -97,7 +97,8 @@ class VertBuf { } virtual void update_sub(uint start, uint len, void *data) = 0; - virtual void *read() = 0; + virtual void *read() const = 0; + virtual void *unmap(const void* mapped_data) const = 0; protected: virtual void acquire_data(void) = 0; diff --git a/source/blender/gpu/opengl/gl_index_buffer.cc b/source/blender/gpu/opengl/gl_index_buffer.cc index e74ea45fd21..ac5d4b490f4 100644 --- a/source/blender/gpu/opengl/gl_index_buffer.cc +++ b/source/blender/gpu/opengl/gl_index_buffer.cc @@ -66,10 +66,8 @@ void GLIndexBuf::bind_as_ssbo(uint binding) uint32_t *GLIndexBuf::read() const { BLI_assert(is_active()); - size_t size = size_get(); - uint32_t *result = static_cast<uint32_t *>(MEM_mallocN(size, __func__)); void *data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_READ_ONLY); - memcpy(result, data, size); + uint32_t *result = static_cast<uint32_t *>(data); return result; } diff --git a/source/blender/gpu/opengl/gl_vertex_buffer.cc b/source/blender/gpu/opengl/gl_vertex_buffer.cc index 477af8342f8..69575c396fb 100644 --- a/source/blender/gpu/opengl/gl_vertex_buffer.cc +++ b/source/blender/gpu/opengl/gl_vertex_buffer.cc @@ -123,12 +123,16 @@ void GLVertBuf::bind_as_ssbo(uint binding) glBindBufferBase(GL_SHADER_STORAGE_BUFFER, binding, vbo_id_); } -void *GLVertBuf::read() +void *GLVertBuf::read() const { BLI_assert(is_active()); + void *result = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY); + return result; +} + +void *GLVertBuf::unmap(const void* mapped_data) const { void *result = MEM_mallocN(vbo_size_, __func__); - void *data = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY); - memcpy(result, data, vbo_size_); + memcpy(result, mapped_data, vbo_size_); return result; } diff --git a/source/blender/gpu/opengl/gl_vertex_buffer.hh b/source/blender/gpu/opengl/gl_vertex_buffer.hh index fd7a63db519..5c25078353a 100644 --- a/source/blender/gpu/opengl/gl_vertex_buffer.hh +++ b/source/blender/gpu/opengl/gl_vertex_buffer.hh @@ -47,7 +47,8 @@ class GLVertBuf : public VertBuf { void update_sub(uint start, uint len, void *data) override; - void *read() override; + void *read() const override; + void *unmap(const void* mapped_data) const override; protected: void acquire_data(void) override; diff --git a/source/blender/gpu/tests/gpu_shader_test.cc b/source/blender/gpu/tests/gpu_shader_test.cc index 75787e1e83f..9ba6cce60e3 100644 --- a/source/blender/gpu/tests/gpu_shader_test.cc +++ b/source/blender/gpu/tests/gpu_shader_test.cc @@ -195,7 +195,6 @@ void main() { EXPECT_FLOAT_EQ(data[index * 4 + 2], expected_value); EXPECT_FLOAT_EQ(data[index * 4 + 3], expected_value); } - MEM_freeN(data); /* Cleanup. */ GPU_shader_unbind(); @@ -253,7 +252,6 @@ void main() { uint32_t expected = index; EXPECT_EQ(data[index], expected); } - MEM_freeN(data); /* Cleanup. */ GPU_shader_unbind(); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs