using buffer_view for creating and updating render buffers

This commit is contained in:
2019-04-06 19:23:18 +07:00
parent a889bee4a0
commit 400da781b8
9 changed files with 43 additions and 43 deletions

View File

@@ -266,7 +266,7 @@ namespace e2d
explicit index_buffer(internal_state_uptr); explicit index_buffer(internal_state_uptr);
~index_buffer() noexcept; ~index_buffer() noexcept;
public: public:
void update(const buffer& indices, std::size_t offset) noexcept; void update(buffer_view indices, std::size_t offset) noexcept;
std::size_t buffer_size() const noexcept; std::size_t buffer_size() const noexcept;
std::size_t index_count() const noexcept; std::size_t index_count() const noexcept;
const index_declaration& decl() const noexcept; const index_declaration& decl() const noexcept;
@@ -293,7 +293,7 @@ namespace e2d
explicit vertex_buffer(internal_state_uptr); explicit vertex_buffer(internal_state_uptr);
~vertex_buffer() noexcept; ~vertex_buffer() noexcept;
public: public:
void update(const buffer& vertices, std::size_t offset) noexcept; void update(buffer_view vertices, std::size_t offset) noexcept;
std::size_t buffer_size() const noexcept; std::size_t buffer_size() const noexcept;
std::size_t vertex_count() const noexcept; std::size_t vertex_count() const noexcept;
const vertex_declaration& decl() const noexcept; const vertex_declaration& decl() const noexcept;
@@ -890,12 +890,12 @@ namespace e2d
const pixel_declaration& decl); const pixel_declaration& decl);
index_buffer_ptr create_index_buffer( index_buffer_ptr create_index_buffer(
const buffer& indices, buffer_view indices,
const index_declaration& decl, const index_declaration& decl,
index_buffer::usage usage); index_buffer::usage usage);
vertex_buffer_ptr create_vertex_buffer( vertex_buffer_ptr create_vertex_buffer(
const buffer& vertices, buffer_view vertices,
const vertex_declaration& decl, const vertex_declaration& decl,
vertex_buffer::usage usage); vertex_buffer::usage usage);

View File

@@ -114,19 +114,19 @@ namespace
const auto indices = generate_quad_indices(); const auto indices = generate_quad_indices();
index_buffer_ = the<render>().create_index_buffer( index_buffer_ = the<render>().create_index_buffer(
buffer(indices.data(), indices.size() * sizeof(indices[0])), indices,
index_declaration::index_type::unsigned_byte, index_declaration::index_type::unsigned_byte,
index_buffer::usage::static_draw); index_buffer::usage::static_draw);
const auto vertices1 = generate_quad_vertices(texture1_->size()); const auto vertices1 = generate_quad_vertices(texture1_->size());
vertex_buffer1_ = the<render>().create_vertex_buffer( vertex_buffer1_ = the<render>().create_vertex_buffer(
buffer(vertices1.data(), vertices1.size() * sizeof(vertices1[0])), vertices1,
vertex1::decl(), vertex1::decl(),
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);
const auto vertices2 = generate_quad_colors(); const auto vertices2 = generate_quad_colors();
vertex_buffer2_ = the<render>().create_vertex_buffer( vertex_buffer2_ = the<render>().create_vertex_buffer(
buffer(vertices2.data(), vertices2.size() * sizeof(vertices2[0])), vertices2,
vertex2::decl(), vertex2::decl(),
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);

View File

@@ -173,19 +173,19 @@ namespace
const auto indices = generate_cube_indices(); const auto indices = generate_cube_indices();
index_buffer_ = the<render>().create_index_buffer( index_buffer_ = the<render>().create_index_buffer(
buffer(indices.data(), indices.size() * sizeof(indices[0])), indices,
index_declaration::index_type::unsigned_byte, index_declaration::index_type::unsigned_byte,
index_buffer::usage::static_draw); index_buffer::usage::static_draw);
const auto vertices1 = generate_cube_vertices(make_vec3(1.f)); const auto vertices1 = generate_cube_vertices(make_vec3(1.f));
vertex_buffer1_ = the<render>().create_vertex_buffer( vertex_buffer1_ = the<render>().create_vertex_buffer(
buffer(vertices1.data(), vertices1.size() * sizeof(vertices1[0])), vertices1,
vertex1::decl(), vertex1::decl(),
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);
const auto vertices2 = generate_cube_colors(); const auto vertices2 = generate_cube_colors();
vertex_buffer2_ = the<render>().create_vertex_buffer( vertex_buffer2_ = the<render>().create_vertex_buffer(
buffer(vertices2.data(), vertices2.size() * sizeof(vertices2[0])), vertices2,
vertex2::decl(), vertex2::decl(),
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);

View File

@@ -128,13 +128,13 @@ namespace
const auto indices = generate_cube_indices(); const auto indices = generate_cube_indices();
index_buffer_ = the<render>().create_index_buffer( index_buffer_ = the<render>().create_index_buffer(
buffer(indices.data(), indices.size() * sizeof(indices[0])), indices,
index_declaration::index_type::unsigned_byte, index_declaration::index_type::unsigned_byte,
index_buffer::usage::static_draw); index_buffer::usage::static_draw);
const auto vertices = generate_cube_vertices(make_vec3(1.f)); const auto vertices = generate_cube_vertices(make_vec3(1.f));
vertex_buffer_ = the<render>().create_vertex_buffer( vertex_buffer_ = the<render>().create_vertex_buffer(
buffer(vertices.data(), vertices.size() * sizeof(vertices[0])), vertices,
vertex::decl(), vertex::decl(),
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);

View File

@@ -158,13 +158,13 @@ namespace e2d
for ( int i = 0; i < draw_data->CmdListsCount; ++i ) { for ( int i = 0; i < draw_data->CmdListsCount; ++i ) {
const ImDrawList* cmd_list = draw_data->CmdLists[i]; const ImDrawList* cmd_list = draw_data->CmdLists[i];
update_index_buffer( update_index_buffer({
cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Data,
math::numeric_cast<std::size_t>(cmd_list->IdxBuffer.Size) * sizeof(ImDrawIdx)); math::numeric_cast<std::size_t>(cmd_list->IdxBuffer.Size) * sizeof(ImDrawIdx)});
update_vertex_buffer( update_vertex_buffer({
cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Data,
math::numeric_cast<std::size_t>(cmd_list->VtxBuffer.Size) * sizeof(ImDrawVert)); math::numeric_cast<std::size_t>(cmd_list->VtxBuffer.Size) * sizeof(ImDrawVert)});
const auto geometry = render::geometry() const auto geometry = render::geometry()
.indices(index_buffer_) .indices(index_buffer_)
@@ -301,19 +301,19 @@ namespace e2d
return math::max(osize * 2u, nsize); return math::max(osize * 2u, nsize);
} }
void update_index_buffer(const void* indices, std::size_t size) { void update_index_buffer(buffer_view indices) {
if ( index_buffer_ && index_buffer_->buffer_size() >= size ) { if ( index_buffer_ && index_buffer_->buffer_size() >= indices.size() ) {
index_buffer_->update(buffer(indices, size), 0); index_buffer_->update(indices, 0);
return; return;
} }
const std::size_t new_buffer_size = calculate_new_buffer_size( const std::size_t new_buffer_size = calculate_new_buffer_size(
sizeof(ImDrawIdx), sizeof(ImDrawIdx),
index_buffer_ ? index_buffer_->buffer_size() : 0u, index_buffer_ ? index_buffer_->buffer_size() : 0u,
size); indices.size());
buffer new_buffer_data(new_buffer_size); buffer new_buffer_data(new_buffer_size);
std::memcpy(new_buffer_data.data(), indices, size); std::memcpy(new_buffer_data.data(), indices.data(), indices.size());
index_buffer_ = render_.create_index_buffer( index_buffer_ = render_.create_index_buffer(
new_buffer_data, new_buffer_data,
@@ -327,19 +327,19 @@ namespace e2d
} }
} }
void update_vertex_buffer(const void* vertices, std::size_t size) { void update_vertex_buffer(buffer_view vertices) {
if ( vertex_buffer_ && vertex_buffer_->buffer_size() >= size ) { if ( vertex_buffer_ && vertex_buffer_->buffer_size() >= vertices.size() ) {
vertex_buffer_->update(buffer(vertices, size), 0); vertex_buffer_->update(vertices, 0);
return; return;
} }
const std::size_t new_buffer_size = calculate_new_buffer_size( const std::size_t new_buffer_size = calculate_new_buffer_size(
sizeof(ImDrawVert), sizeof(ImDrawVert),
vertex_buffer_ ? vertex_buffer_->buffer_size() : 0u, vertex_buffer_ ? vertex_buffer_->buffer_size() : 0u,
size); vertices.size());
buffer new_buffer_data(new_buffer_size); buffer new_buffer_data(new_buffer_size);
std::memcpy(new_buffer_data.data(), vertices, size); std::memcpy(new_buffer_data.data(), vertices.data(), vertices.size());
vertex_buffer_ = render_.create_vertex_buffer( vertex_buffer_ = render_.create_vertex_buffer(
new_buffer_data, new_buffer_data,

View File

@@ -121,7 +121,7 @@ namespace e2d
: state_(std::move(state)) {} : state_(std::move(state)) {}
index_buffer::~index_buffer() noexcept = default; index_buffer::~index_buffer() noexcept = default;
void index_buffer::update(const buffer& indices, std::size_t offset) noexcept { void index_buffer::update(buffer_view indices, std::size_t offset) noexcept {
E2D_UNUSED(indices, offset); E2D_UNUSED(indices, offset);
} }
@@ -141,7 +141,7 @@ namespace e2d
: state_(std::move(state)) {} : state_(std::move(state)) {}
vertex_buffer::~vertex_buffer() noexcept = default; vertex_buffer::~vertex_buffer() noexcept = default;
void vertex_buffer::update(const buffer& vertices, std::size_t offset) noexcept { void vertex_buffer::update(buffer_view vertices, std::size_t offset) noexcept {
E2D_UNUSED(vertices, offset); E2D_UNUSED(vertices, offset);
} }
@@ -212,7 +212,7 @@ namespace e2d
} }
index_buffer_ptr render::create_index_buffer( index_buffer_ptr render::create_index_buffer(
const buffer& indices, buffer_view indices,
const index_declaration& decl, const index_declaration& decl,
index_buffer::usage usage) index_buffer::usage usage)
{ {
@@ -221,7 +221,7 @@ namespace e2d
} }
vertex_buffer_ptr render::create_vertex_buffer( vertex_buffer_ptr render::create_vertex_buffer(
const buffer& vertices, buffer_view vertices,
const vertex_declaration& decl, const vertex_declaration& decl,
vertex_buffer::usage usage) vertex_buffer::usage usage)
{ {

View File

@@ -355,7 +355,7 @@ namespace e2d
} }
index_buffer::~index_buffer() noexcept = default; index_buffer::~index_buffer() noexcept = default;
void index_buffer::update(const buffer& indices, std::size_t offset) noexcept { void index_buffer::update(buffer_view indices, std::size_t offset) noexcept {
const std::size_t buffer_offset = offset * state_->decl().bytes_per_index(); const std::size_t buffer_offset = offset * state_->decl().bytes_per_index();
E2D_ASSERT(indices.size() + buffer_offset <= state_->size()); E2D_ASSERT(indices.size() + buffer_offset <= state_->size());
E2D_ASSERT(indices.size() % state_->decl().bytes_per_index() == 0); E2D_ASSERT(indices.size() % state_->decl().bytes_per_index() == 0);
@@ -396,7 +396,7 @@ namespace e2d
} }
vertex_buffer::~vertex_buffer() noexcept = default; vertex_buffer::~vertex_buffer() noexcept = default;
void vertex_buffer::update(const buffer& vertices, std::size_t offset) noexcept { void vertex_buffer::update(buffer_view vertices, std::size_t offset) noexcept {
const std::size_t buffer_offset = offset * state_->decl().bytes_per_vertex(); const std::size_t buffer_offset = offset * state_->decl().bytes_per_vertex();
E2D_ASSERT(vertices.size() + buffer_offset <= state_->size()); E2D_ASSERT(vertices.size() + buffer_offset <= state_->size());
E2D_ASSERT(vertices.size() % state_->decl().bytes_per_vertex() == 0); E2D_ASSERT(vertices.size() % state_->decl().bytes_per_vertex() == 0);
@@ -689,7 +689,7 @@ namespace e2d
} }
index_buffer_ptr render::create_index_buffer( index_buffer_ptr render::create_index_buffer(
const buffer& indices, buffer_view indices,
const index_declaration& decl, const index_declaration& decl,
index_buffer::usage usage) index_buffer::usage usage)
{ {
@@ -725,7 +725,7 @@ namespace e2d
} }
vertex_buffer_ptr render::create_vertex_buffer( vertex_buffer_ptr render::create_vertex_buffer(
const buffer& vertices, buffer_view vertices,
const vertex_declaration& decl, const vertex_declaration& decl,
vertex_buffer::usage usage) vertex_buffer::usage usage)
{ {

View File

@@ -52,7 +52,7 @@ namespace
} }
const index_buffer_ptr index_buffer = render.create_index_buffer( const index_buffer_ptr index_buffer = render.create_index_buffer(
buffer(indices.data(), indices.size() * sizeof(indices[0])), indices,
index_declaration::index_type::unsigned_int, index_declaration::index_type::unsigned_int,
index_buffer::usage::static_draw); index_buffer::usage::static_draw);
@@ -65,7 +65,7 @@ namespace
{ {
const vector<v3f>& vertices = mesh.vertices(); const vector<v3f>& vertices = mesh.vertices();
const vertex_buffer_ptr vertex_buffer = render.create_vertex_buffer( const vertex_buffer_ptr vertex_buffer = render.create_vertex_buffer(
buffer(vertices.data(), vertices.size() * sizeof(vertices[0])), vertices,
vertex_buffer_decl, vertex_buffer_decl,
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);
if ( vertex_buffer ) { if ( vertex_buffer ) {
@@ -80,7 +80,7 @@ namespace
for ( std::size_t i = 0; i < uv_count; ++i ) { for ( std::size_t i = 0; i < uv_count; ++i ) {
const vector<v2f>& uvs = mesh.uvs(i); const vector<v2f>& uvs = mesh.uvs(i);
const vertex_buffer_ptr uv_buffer = render.create_vertex_buffer( const vertex_buffer_ptr uv_buffer = render.create_vertex_buffer(
buffer(uvs.data(), uvs.size() * sizeof(uvs[0])), uvs,
uv_buffer_decls[i], uv_buffer_decls[i],
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);
if ( uv_buffer ) { if ( uv_buffer ) {
@@ -96,7 +96,7 @@ namespace
for ( std::size_t i = 0; i < color_count; ++i ) { for ( std::size_t i = 0; i < color_count; ++i ) {
const vector<color32>& colors = mesh.colors(i); const vector<color32>& colors = mesh.colors(i);
const vertex_buffer_ptr color_buffer = render.create_vertex_buffer( const vertex_buffer_ptr color_buffer = render.create_vertex_buffer(
buffer(colors.data(), colors.size() * sizeof(colors[0])), colors,
color_buffer_decls[i], color_buffer_decls[i],
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);
if ( color_buffer ) { if ( color_buffer ) {
@@ -108,7 +108,7 @@ namespace
{ {
const vector<v3f>& normals = mesh.normals(); const vector<v3f>& normals = mesh.normals();
const vertex_buffer_ptr normal_buffer = render.create_vertex_buffer( const vertex_buffer_ptr normal_buffer = render.create_vertex_buffer(
buffer(normals.data(), normals.size() * sizeof(normals[0])), normals,
normal_buffer_decl, normal_buffer_decl,
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);
if ( normal_buffer ) { if ( normal_buffer ) {
@@ -119,7 +119,7 @@ namespace
{ {
const vector<v3f>& tangents = mesh.tangents(); const vector<v3f>& tangents = mesh.tangents();
const vertex_buffer_ptr tangent_buffer = render.create_vertex_buffer( const vertex_buffer_ptr tangent_buffer = render.create_vertex_buffer(
buffer(tangents.data(), tangents.size() * sizeof(tangents[0])), tangents,
tangent_buffer_decl, tangent_buffer_decl,
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);
if ( tangent_buffer ) { if ( tangent_buffer ) {
@@ -130,7 +130,7 @@ namespace
{ {
const vector<v3f>& bitangents = mesh.bitangents(); const vector<v3f>& bitangents = mesh.bitangents();
const vertex_buffer_ptr bitangent_buffer = render.create_vertex_buffer( const vertex_buffer_ptr bitangent_buffer = render.create_vertex_buffer(
buffer(bitangents.data(), bitangents.size() * sizeof(bitangents[0])), bitangents,
bitangent_buffer_decl, bitangent_buffer_decl,
vertex_buffer::usage::static_draw); vertex_buffer::usage::static_draw);
if ( bitangent_buffer ) { if ( bitangent_buffer ) {

View File

@@ -200,7 +200,7 @@ namespace e2d { namespace render_system_impl
void batcher<Index, Vertex>::update_index_buffer_() { void batcher<Index, Vertex>::update_index_buffer_() {
const std::size_t min_ib_size = indices_.size() * sizeof(indices_[0]); const std::size_t min_ib_size = indices_.size() * sizeof(indices_[0]);
if ( index_buffer_ && index_buffer_->buffer_size() >= min_ib_size ) { if ( index_buffer_ && index_buffer_->buffer_size() >= min_ib_size ) {
index_buffer_->update(buffer(indices_.data(), min_ib_size), 0u); index_buffer_->update(indices_, 0u);
} else { } else {
const std::size_t new_ib_size = calculate_new_buffer_size( const std::size_t new_ib_size = calculate_new_buffer_size(
sizeof(Index), sizeof(Index),
@@ -227,7 +227,7 @@ namespace e2d { namespace render_system_impl
void batcher<Index, Vertex>::update_vertex_buffer_() { void batcher<Index, Vertex>::update_vertex_buffer_() {
const std::size_t min_vb_size = vertices_.size() * sizeof(vertices_[0]); const std::size_t min_vb_size = vertices_.size() * sizeof(vertices_[0]);
if ( vertex_buffer_ && vertex_buffer_->buffer_size() >= min_vb_size ) { if ( vertex_buffer_ && vertex_buffer_->buffer_size() >= min_vb_size ) {
vertex_buffer_->update(buffer(vertices_.data(), min_vb_size), 0u); vertex_buffer_->update(vertices_, 0u);
} else { } else {
const std::size_t new_vb_size = calculate_new_buffer_size( const std::size_t new_vb_size = calculate_new_buffer_size(
sizeof(Vertex), sizeof(Vertex),