diff --git a/source/graphics/MiniMapTexture.cpp b/source/graphics/MiniMapTexture.cpp index 15858e518a..13a138df5f 100644 --- a/source/graphics/MiniMapTexture.cpp +++ b/source/graphics/MiniMapTexture.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -191,9 +191,10 @@ bool CMiniMapTexture::CellIconKeyEqual::operator()( } CMiniMapTexture::CMiniMapTexture(Renderer::Backend::IDevice* device, CSimulation2& simulation) - : m_Simulation(simulation), m_IndexArray(false), - m_VertexArray(Renderer::Backend::IBuffer::Type::VERTEX, true), - m_InstanceVertexArray(Renderer::Backend::IBuffer::Type::VERTEX, false) + : m_Simulation(simulation), m_IndexArray(Renderer::Backend::IBuffer::Usage::TRANSFER_DST), + m_VertexArray(Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::DYNAMIC | Renderer::Backend::IBuffer::Usage::TRANSFER_DST), + m_InstanceVertexArray(Renderer::Backend::IBuffer::Type::VERTEX, Renderer::Backend::IBuffer::Usage::TRANSFER_DST) { // Register Relax NG validator. CXeromyces::AddValidator(g_VFS, "pathfinder", "simulation/data/pathfinder.rng"); diff --git a/source/graphics/ParticleEmitter.cpp b/source/graphics/ParticleEmitter.cpp index 3cef8666fa..d0b7682fb0 100644 --- a/source/graphics/ParticleEmitter.cpp +++ b/source/graphics/ParticleEmitter.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -32,8 +32,9 @@ CParticleEmitter::CParticleEmitter(const CParticleEmitterTypePtr& type) : m_Type(type), m_Active(true), m_NextParticleIdx(0), m_EmissionRoundingError(0.f), m_LastUpdateTime(type->m_Manager.GetCurrentTime()), - m_IndexArray(false), - m_VertexArray(Renderer::Backend::IBuffer::Type::VERTEX, true), + m_IndexArray(Renderer::Backend::IBuffer::Usage::TRANSFER_DST), + m_VertexArray(Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::DYNAMIC | Renderer::Backend::IBuffer::Usage::TRANSFER_DST), m_LastFrameNumber(-1) { // If we should start with particles fully emitted, pretend that we diff --git a/source/renderer/DecalRData.cpp b/source/renderer/DecalRData.cpp index d0e93d6b36..f22117937f 100644 --- a/source/renderer/DecalRData.cpp +++ b/source/renderer/DecalRData.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -325,7 +325,8 @@ void CDecalRData::BuildVertexData() { m_VBDecals = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(SDecalVertex), vertices.size(), - Renderer::Backend::IBuffer::Type::VERTEX, false); + Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST); } m_VBDecals->m_Owner->UpdateChunkVertices(m_VBDecals.Get(), vertices.data()); @@ -367,7 +368,8 @@ void CDecalRData::BuildVertexData() { m_VBDecalsIndices = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(u16), indices.size(), - Renderer::Backend::IBuffer::Type::INDEX, false); + Renderer::Backend::IBuffer::Type::INDEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST); } m_VBDecalsIndices->m_Owner->UpdateChunkVertices(m_VBDecalsIndices.Get(), indices.data()); } diff --git a/source/renderer/HWLightingModelRenderer.cpp b/source/renderer/HWLightingModelRenderer.cpp index f02d3a4c11..3e5cf47883 100644 --- a/source/renderer/HWLightingModelRenderer.cpp +++ b/source/renderer/HWLightingModelRenderer.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -59,8 +59,9 @@ struct ShaderModelDef : public CModelDefRPrivate ShaderModelDef::ShaderModelDef(const CModelDefPtr& mdef) - : m_IndexArray(false), - m_Array(Renderer::Backend::IBuffer::Type::VERTEX, false) + : m_IndexArray(Renderer::Backend::IBuffer::Usage::TRANSFER_DST), + m_Array(Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST) { size_t numVertices = mdef->GetNumVertices(); @@ -127,7 +128,8 @@ struct ShaderModel : public CModelRData ShaderModel(const void* key) : CModelRData(key), - m_Array(Renderer::Backend::IBuffer::Type::VERTEX, true) + m_Array(Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::DYNAMIC | Renderer::Backend::IBuffer::Usage::TRANSFER_DST) {} }; diff --git a/source/renderer/InstancingModelRenderer.cpp b/source/renderer/InstancingModelRenderer.cpp index 9b3c229093..6a7acef871 100644 --- a/source/renderer/InstancingModelRenderer.cpp +++ b/source/renderer/InstancingModelRenderer.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -58,7 +58,8 @@ struct IModelDef : public CModelDefRPrivate IModelDef::IModelDef(const CModelDefPtr& mdef, bool gpuSkinning, bool calculateTangents) - : m_IndexArray(false), m_Array(Renderer::Backend::IBuffer::Type::VERTEX, false) + : m_IndexArray(Renderer::Backend::IBuffer::Usage::TRANSFER_DST), + m_Array(Renderer::Backend::IBuffer::Type::VERTEX, Renderer::Backend::IBuffer::Usage::TRANSFER_DST) { size_t numVertices = mdef->GetNumVertices(); diff --git a/source/renderer/OverlayRenderer.cpp b/source/renderer/OverlayRenderer.cpp index bbbacd2830..ed5f8b76cb 100644 --- a/source/renderer/OverlayRenderer.cpp +++ b/source/renderer/OverlayRenderer.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -213,8 +213,9 @@ struct OverlayRendererInternals const float OverlayRenderer::OVERLAY_VOFFSET = 0.2f; OverlayRendererInternals::OverlayRendererInternals() - : quadVertices(Renderer::Backend::IBuffer::Type::VERTEX, true), - quadIndices(false) + : quadVertices(Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::DYNAMIC | Renderer::Backend::IBuffer::Usage::TRANSFER_DST), + quadIndices(Renderer::Backend::IBuffer::Usage::TRANSFER_DST) { quadAttributePos.format = Renderer::Backend::Format::R32G32B32_SFLOAT; quadVertices.AddAttribute(&quadAttributePos); diff --git a/source/renderer/PatchRData.cpp b/source/renderer/PatchRData.cpp index a69349bf93..5a7126b464 100644 --- a/source/renderer/PatchRData.cpp +++ b/source/renderer/PatchRData.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -422,7 +422,8 @@ void CPatchRData::BuildBlends() m_VBBlends = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(SBlendVertex), blendVertices.size(), - Renderer::Backend::IBuffer::Type::VERTEX, false, + Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::TERRAIN); m_VBBlends->m_Owner->UpdateChunkVertices(m_VBBlends.Get(), &blendVertices[0]); @@ -432,7 +433,8 @@ void CPatchRData::BuildBlends() m_VBBlendIndices = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(u16), blendIndices.size(), - Renderer::Backend::IBuffer::Type::INDEX, false, + Renderer::Backend::IBuffer::Type::INDEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::TERRAIN); m_VBBlendIndices->m_Owner->UpdateChunkVertices(m_VBBlendIndices.Get(), &blendIndices[0]); } @@ -636,7 +638,8 @@ void CPatchRData::BuildIndices() // Construct vertex buffer m_VBBaseIndices = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(u16), indices.size(), - Renderer::Backend::IBuffer::Type::INDEX, false, nullptr, CVertexBufferManager::Group::TERRAIN); + Renderer::Backend::IBuffer::Type::INDEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::TERRAIN); m_VBBaseIndices->m_Owner->UpdateChunkVertices(m_VBBaseIndices.Get(), &indices[0]); } @@ -682,7 +685,8 @@ void CPatchRData::BuildVertices() { m_VBBase = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(SBaseVertex), vsize * vsize, - Renderer::Backend::IBuffer::Type::VERTEX, false, + Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::TERRAIN); } @@ -776,7 +780,8 @@ void CPatchRData::BuildSides() { m_VBSides = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(SSideVertex), sideVertices.size(), - Renderer::Backend::IBuffer::Type::VERTEX, false, + Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::DEFAULT); } m_VBSides->m_Owner->UpdateChunkVertices(m_VBSides.Get(), &sideVertices[0]); @@ -1538,13 +1543,15 @@ void CPatchRData::BuildWater() { m_VBWater = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(SWaterVertex), water_vertex_data.size(), - Renderer::Backend::IBuffer::Type::VERTEX, false, + Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::WATER); m_VBWater->m_Owner->UpdateChunkVertices(m_VBWater.Get(), &water_vertex_data[0]); m_VBWaterIndices = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(u16), water_indices.size(), - Renderer::Backend::IBuffer::Type::INDEX, false, + Renderer::Backend::IBuffer::Type::INDEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::WATER); m_VBWaterIndices->m_Owner->UpdateChunkVertices(m_VBWaterIndices.Get(), &water_indices[0]); } @@ -1553,14 +1560,16 @@ void CPatchRData::BuildWater() { m_VBWaterShore = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(SWaterVertex), water_vertex_data_shore.size(), - Renderer::Backend::IBuffer::Type::VERTEX, false, + Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::WATER); m_VBWaterShore->m_Owner->UpdateChunkVertices(m_VBWaterShore.Get(), &water_vertex_data_shore[0]); // Construct indices buffer m_VBWaterIndicesShore = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(u16), water_indices_shore.size(), - Renderer::Backend::IBuffer::Type::INDEX, false, + Renderer::Backend::IBuffer::Type::INDEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::WATER); m_VBWaterIndicesShore->m_Owner->UpdateChunkVertices(m_VBWaterIndicesShore.Get(), &water_indices_shore[0]); } diff --git a/source/renderer/SkyManager.cpp b/source/renderer/SkyManager.cpp index 0f7def6950..6542dd69c8 100644 --- a/source/renderer/SkyManager.cpp +++ b/source/renderer/SkyManager.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -40,7 +40,8 @@ #include SkyManager::SkyManager() - : m_VertexArray(Renderer::Backend::IBuffer::Type::VERTEX, false) + : m_VertexArray(Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST) { CFG_GET_VAL("showsky", m_SkyVisible); } diff --git a/source/renderer/TexturedLineRData.cpp b/source/renderer/TexturedLineRData.cpp index b652fad243..b23b49ea04 100644 --- a/source/renderer/TexturedLineRData.cpp +++ b/source/renderer/TexturedLineRData.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -331,7 +331,8 @@ void CTexturedLineRData::Update(const SOverlayTexturedLine& line) m_BoundingBox += vertex.m_Position; m_VB = g_Renderer.GetVertexBufferManager().AllocateChunk( - sizeof(SVertex), vertices.size(), Renderer::Backend::IBuffer::Type::VERTEX, false); + sizeof(SVertex), vertices.size(), Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST); // Allocation might fail (e.g. due to too many vertices). if (m_VB) { @@ -342,7 +343,8 @@ void CTexturedLineRData::Update(const SOverlayTexturedLine& line) indices[k] += static_cast(m_VB->m_Index); m_VBIndices = g_Renderer.GetVertexBufferManager().AllocateChunk( - sizeof(u16), indices.size(), Renderer::Backend::IBuffer::Type::INDEX, false); + sizeof(u16), indices.size(), Renderer::Backend::IBuffer::Type::INDEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST); if (m_VBIndices) m_VBIndices->m_Owner->UpdateChunkVertices(m_VBIndices.Get(), &indices[0]); } diff --git a/source/renderer/VertexArray.cpp b/source/renderer/VertexArray.cpp index 4f3271327c..0f52d3b720 100644 --- a/source/renderer/VertexArray.cpp +++ b/source/renderer/VertexArray.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -66,8 +66,8 @@ uint32_t GetAttributeSize(const Renderer::Backend::Format format) } // anonymous namespace VertexArray::VertexArray( - const Renderer::Backend::IBuffer::Type type, const bool dynamic) - : m_Type(type), m_Dynamic(dynamic) + const Renderer::Backend::IBuffer::Type type, const uint32_t usage) + : m_Type(type), m_Usage(usage) { m_NumberOfVertices = 0; @@ -271,7 +271,7 @@ void VertexArray::Upload() if (!m_VB) { m_VB = g_Renderer.GetVertexBufferManager().AllocateChunk( - m_Stride, m_NumberOfVertices, m_Type, m_Dynamic, m_BackingStore); + m_Stride, m_NumberOfVertices, m_Type, m_Usage, m_BackingStore); } if (!m_VB) @@ -293,14 +293,14 @@ void VertexArray::UploadIfNeeded( void VertexArray::FreeBackingStore() { // In streaming modes, the backing store must be retained - ENSURE(!CVertexBuffer::UseStreaming(m_Dynamic)); + ENSURE(!CVertexBuffer::UseStreaming(m_Usage)); rtl_FreeAligned(m_BackingStore); m_BackingStore = 0; } -VertexIndexArray::VertexIndexArray(const bool dynamic) : - VertexArray(Renderer::Backend::IBuffer::Type::INDEX, dynamic) +VertexIndexArray::VertexIndexArray(const uint32_t usage) : + VertexArray(Renderer::Backend::IBuffer::Type::INDEX, usage) { m_Attr.format = Renderer::Backend::Format::R16_UINT; AddAttribute(&m_Attr); diff --git a/source/renderer/VertexArray.h b/source/renderer/VertexArray.h index 645123d847..47956aa04d 100644 --- a/source/renderer/VertexArray.h +++ b/source/renderer/VertexArray.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -160,7 +160,7 @@ public: public: VertexArray( - const Renderer::Backend::IBuffer::Type type, const bool dynamic); + const Renderer::Backend::IBuffer::Type type, const uint32_t usage); ~VertexArray(); // Set the number of vertices stored in the array @@ -203,7 +203,7 @@ private: } Renderer::Backend::IBuffer::Type m_Type; - bool m_Dynamic; + uint32_t m_Usage = 0; size_t m_NumberOfVertices; std::vector m_Attributes; @@ -219,7 +219,7 @@ private: class VertexIndexArray : public VertexArray { public: - VertexIndexArray(const bool dynamic); + VertexIndexArray(const uint32_t usage); /// Gets the iterator over the (only) attribute in this array, i.e. a u16. VertexArrayIterator GetIterator() const; diff --git a/source/renderer/VertexBuffer.cpp b/source/renderer/VertexBuffer.cpp index 94b81e8667..ad087951f8 100644 --- a/source/renderer/VertexBuffer.cpp +++ b/source/renderer/VertexBuffer.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -36,14 +36,14 @@ constexpr std::size_t MAX_VB_SIZE_BYTES = 4 * 1024 * 1024; CVertexBuffer::CVertexBuffer( Renderer::Backend::IDevice* device, const char* name, const size_t vertexSize, - const Renderer::Backend::IBuffer::Type type, const bool dynamic) - : CVertexBuffer(device, name, vertexSize, type, dynamic, MAX_VB_SIZE_BYTES) + const Renderer::Backend::IBuffer::Type type, const uint32_t usage) + : CVertexBuffer(device, name, vertexSize, type, usage, MAX_VB_SIZE_BYTES) { } CVertexBuffer::CVertexBuffer( Renderer::Backend::IDevice* device, const char* name, const size_t vertexSize, - const Renderer::Backend::IBuffer::Type type, const bool dynamic, + const Renderer::Backend::IBuffer::Type type, const uint32_t usage, const size_t maximumBufferSize) : m_VertexSize(vertexSize), m_HasNeededChunks(false) { @@ -65,7 +65,7 @@ CVertexBuffer::CVertexBuffer( m_MaxVertices = m_FreeVertices = size / vertexSize; m_Buffer = device->CreateBuffer( - name, type, m_MaxVertices * m_VertexSize, dynamic); + name, type, m_MaxVertices * m_VertexSize, usage); // create sole free chunk VBChunk* chunk = new VBChunk; @@ -88,10 +88,10 @@ CVertexBuffer::~CVertexBuffer() bool CVertexBuffer::CompatibleVertexType( const size_t vertexSize, const Renderer::Backend::IBuffer::Type type, - const bool dynamic) const + const uint32_t usage) const { ENSURE(m_Buffer); - return type == m_Buffer->GetType() && dynamic == m_Buffer->IsDynamic() && vertexSize == m_VertexSize; + return type == m_Buffer->GetType() && usage == m_Buffer->GetUsage() && vertexSize == m_VertexSize; } /////////////////////////////////////////////////////////////////////////////// @@ -100,14 +100,14 @@ bool CVertexBuffer::CompatibleVertexType( // if no free chunks available CVertexBuffer::VBChunk* CVertexBuffer::Allocate( const size_t vertexSize, const size_t numberOfVertices, - const Renderer::Backend::IBuffer::Type type, const bool dynamic, + const Renderer::Backend::IBuffer::Type type, const uint32_t usage, void* backingStore) { // check this is the right kind of buffer - if (!CompatibleVertexType(vertexSize, type, dynamic)) + if (!CompatibleVertexType(vertexSize, type, usage)) return nullptr; - if (UseStreaming(dynamic)) + if (UseStreaming(usage)) ENSURE(backingStore != nullptr); // quick check there's enough vertices spare to allocate @@ -206,7 +206,7 @@ void CVertexBuffer::Release(VBChunk* chunk) void CVertexBuffer::UpdateChunkVertices(VBChunk* chunk, void* data) { ENSURE(m_Buffer); - if (UseStreaming(m_Buffer->IsDynamic())) + if (UseStreaming(m_Buffer->GetUsage())) { // The backend buffer is now out of sync with the backing store. chunk->m_Dirty = true; @@ -226,7 +226,7 @@ void CVertexBuffer::UpdateChunkVertices(VBChunk* chunk, void* data) void CVertexBuffer::UploadIfNeeded( Renderer::Backend::IDeviceCommandContext* deviceCommandContext) { - if (UseStreaming(m_Buffer->IsDynamic())) + if (UseStreaming(m_Buffer->GetUsage())) { if (!m_HasNeededChunks) return; @@ -310,9 +310,9 @@ void CVertexBuffer::DumpStatus() const debug_printf("max size = %d\n", static_cast(maxSize)); } -bool CVertexBuffer::UseStreaming(const bool dynamic) +bool CVertexBuffer::UseStreaming(const uint32_t usage) { - return dynamic; + return usage & Renderer::Backend::IBuffer::Usage::DYNAMIC; } void CVertexBuffer::PrepareForRendering(VBChunk* chunk) diff --git a/source/renderer/VertexBuffer.h b/source/renderer/VertexBuffer.h index d99562a847..f945165495 100644 --- a/source/renderer/VertexBuffer.h +++ b/source/renderer/VertexBuffer.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -93,11 +93,11 @@ public: CVertexBuffer( Renderer::Backend::IDevice* device, const char* name, const size_t vertexSize, - const Renderer::Backend::IBuffer::Type type, const bool dynamic); + const Renderer::Backend::IBuffer::Type type, const uint32_t usage); CVertexBuffer( Renderer::Backend::IDevice* device, const char* name, const size_t vertexSize, - const Renderer::Backend::IBuffer::Type type, const bool dynamic, + const Renderer::Backend::IBuffer::Type type, const uint32_t usage, const size_t maximumBufferSize); ~CVertexBuffer(); @@ -116,7 +116,7 @@ public: /// Returns true if this vertex buffer is compatible with the specified vertex type and intended usage. bool CompatibleVertexType( const size_t vertexSize, const Renderer::Backend::IBuffer::Type type, - const bool dynamic) const; + const uint32_t usage) const; void DumpStatus() const; @@ -130,7 +130,7 @@ public: * If false, we assume it will change rarely, and use direct upload to * update it incrementally. The backing store can be freed to save memory. */ - static bool UseStreaming(const bool dynamic); + static bool UseStreaming(const uint32_t usage); Renderer::Backend::IBuffer* GetBuffer() { return m_Buffer.get(); } @@ -141,7 +141,7 @@ private: /// and with the given type - return null if no free chunks available VBChunk* Allocate( const size_t vertexSize, const size_t numberOfVertices, - const Renderer::Backend::IBuffer::Type type, const bool dynamic, + const Renderer::Backend::IBuffer::Type type, const uint32_t usage, void* backingStore); /// Return given chunk to this buffer void Release(VBChunk* chunk); diff --git a/source/renderer/VertexBufferManager.cpp b/source/renderer/VertexBufferManager.cpp index b803a5668d..69b4e6aace 100644 --- a/source/renderer/VertexBufferManager.cpp +++ b/source/renderer/VertexBufferManager.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -112,14 +112,14 @@ void CVertexBufferManager::Handle::Reset() CVertexBufferManager::Handle CVertexBufferManager::AllocateChunk( const size_t vertexSize, const size_t numberOfVertices, const Renderer::Backend::IBuffer::Type type, - const bool dynamic, void* backingStore, Group group) + const uint32_t usage, void* backingStore, Group group) { ENSURE(vertexSize > 0); ENSURE(numberOfVertices > 0); CVertexBuffer::VBChunk* result = nullptr; - if (CVertexBuffer::UseStreaming(dynamic)) + if (CVertexBuffer::UseStreaming(usage)) ENSURE(backingStore != NULL); // TODO, RC - run some sanity checks on allocation request @@ -130,7 +130,7 @@ CVertexBufferManager::Handle CVertexBufferManager::AllocateChunk( debug_printf("\n============================\n# allocate vsize=%zu nverts=%zu\n\n", vertexSize, numVertices); for (const std::unique_ptr& buffer : buffers) { - if (buffer->CompatibleVertexType(vertexSize, type, dynamic)) + if (buffer->CompatibleVertexType(vertexSize, type, usage)) { debug_printf("%p\n", buffer.get()); buffer->DumpStatus(); @@ -142,7 +142,7 @@ CVertexBufferManager::Handle CVertexBufferManager::AllocateChunk( // satisfy the allocation for (const std::unique_ptr& buffer : buffers) { - result = buffer->Allocate(vertexSize, numberOfVertices, type, dynamic, backingStore); + result = buffer->Allocate(vertexSize, numberOfVertices, type, usage, backingStore); if (result) return Handle(result); } @@ -150,15 +150,15 @@ CVertexBufferManager::Handle CVertexBufferManager::AllocateChunk( char bufferName[64] = {0}; snprintf( bufferName, std::size(bufferName), "%s (%s, %zu%s)", - GetBufferTypeName(type), GetGroupName(group), vertexSize, (dynamic ? ", dynamic" : "")); + GetBufferTypeName(type), GetGroupName(group), vertexSize, ((usage & Renderer::Backend::IBuffer::Usage::DYNAMIC) ? ", dynamic" : "")); // got this far; need to allocate a new buffer buffers.emplace_back( group == Group::DEFAULT - ? std::make_unique(m_Device, bufferName, vertexSize, type, dynamic) + ? std::make_unique(m_Device, bufferName, vertexSize, type, usage) // Reduces the buffer size for not so frequent buffers. - : std::make_unique(m_Device, bufferName, vertexSize, type, dynamic, 1024 * 1024)); - result = buffers.back()->Allocate(vertexSize, numberOfVertices, type, dynamic, backingStore); + : std::make_unique(m_Device, bufferName, vertexSize, type, usage, 1024 * 1024)); + result = buffers.back()->Allocate(vertexSize, numberOfVertices, type, usage, backingStore); if (!result) { diff --git a/source/renderer/VertexBufferManager.h b/source/renderer/VertexBufferManager.h index 0621cb4b21..128448a3cd 100644 --- a/source/renderer/VertexBufferManager.h +++ b/source/renderer/VertexBufferManager.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -93,7 +93,7 @@ public: Handle AllocateChunk( const size_t vertexSize, const size_t numberOfVertices, const Renderer::Backend::IBuffer::Type type, - const bool dynamic, void* backingStore = nullptr, Group group = Group::DEFAULT); + const uint32_t usage, void* backingStore = nullptr, Group group = Group::DEFAULT); /// Returns the given @p chunk to its owning buffer void Release(CVertexBuffer::VBChunk* chunk); diff --git a/source/renderer/WaterManager.cpp b/source/renderer/WaterManager.cpp index d457c55d85..d770de131a 100644 --- a/source/renderer/WaterManager.cpp +++ b/source/renderer/WaterManager.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -649,7 +649,8 @@ void WaterManager::CreateWaveMeshes() // Generic indexes, max-length m_ShoreWavesVBIndices = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(u16), water_indices.size(), - Renderer::Backend::IBuffer::Type::INDEX, false, + Renderer::Backend::IBuffer::Type::INDEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::WATER); m_ShoreWavesVBIndices->m_Owner->UpdateChunkVertices(m_ShoreWavesVBIndices.Get(), &water_indices[0]); @@ -878,7 +879,8 @@ void WaterManager::CreateWaveMeshes() shoreWave->m_VBVertices = g_Renderer.GetVertexBufferManager().AllocateChunk( sizeof(SWavesVertex), vertices.size(), - Renderer::Backend::IBuffer::Type::VERTEX, false, + Renderer::Backend::IBuffer::Type::VERTEX, + Renderer::Backend::IBuffer::Usage::TRANSFER_DST, nullptr, CVertexBufferManager::Group::WATER); shoreWave->m_VBVertices->m_Owner->UpdateChunkVertices(shoreWave->m_VBVertices.Get(), &vertices[0]); diff --git a/source/renderer/backend/IBuffer.h b/source/renderer/backend/IBuffer.h index 6ef329d2be..8e7d29bd3b 100644 --- a/source/renderer/backend/IBuffer.h +++ b/source/renderer/backend/IBuffer.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -39,9 +39,20 @@ public: UNIFORM, }; + // Using a struct instead of a enum allows using the same syntax while + // avoiding adding operator overrides and additional checks on casts. + struct Usage + { + static constexpr uint32_t DYNAMIC = 1u << 0u; + static constexpr uint32_t TRANSFER_SRC = 1u << 1u; + static constexpr uint32_t TRANSFER_DST = 1u << 2u; + }; + virtual Type GetType() const = 0; virtual uint32_t GetSize() const = 0; - virtual bool IsDynamic() const = 0; + virtual uint32_t GetUsage() const = 0; + + bool IsDynamic() const { return GetUsage() & IBuffer::Usage::DYNAMIC; } }; } // namespace Backend diff --git a/source/renderer/backend/IDevice.h b/source/renderer/backend/IDevice.h index 1fe1185355..e50f523eaa 100644 --- a/source/renderer/backend/IDevice.h +++ b/source/renderer/backend/IDevice.h @@ -122,7 +122,7 @@ public: SDepthStencilAttachment* depthStencilAttachment) = 0; virtual std::unique_ptr CreateBuffer( - const char* name, const IBuffer::Type type, const uint32_t size, const bool dynamic) = 0; + const char* name, const IBuffer::Type type, const uint32_t size, const uint32_t usage) = 0; virtual std::unique_ptr CreateShaderProgram( const CStr& name, const CShaderDefines& defines) = 0; diff --git a/source/renderer/backend/dummy/Buffer.cpp b/source/renderer/backend/dummy/Buffer.cpp index d3f8f774b6..9a03130905 100644 --- a/source/renderer/backend/dummy/Buffer.cpp +++ b/source/renderer/backend/dummy/Buffer.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2022 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -32,13 +32,13 @@ namespace Dummy // static std::unique_ptr CBuffer::Create( - CDevice* device, const Type type, const uint32_t size, const bool dynamic) + CDevice* device, const Type type, const uint32_t size, const uint32_t usage) { std::unique_ptr buffer(new CBuffer()); buffer->m_Device = device; buffer->m_Type = type; buffer->m_Size = size; - buffer->m_Dynamic = dynamic; + buffer->m_Usage = usage; return buffer; } diff --git a/source/renderer/backend/dummy/Buffer.h b/source/renderer/backend/dummy/Buffer.h index f8ba678de5..d75a19dffc 100644 --- a/source/renderer/backend/dummy/Buffer.h +++ b/source/renderer/backend/dummy/Buffer.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2022 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -42,13 +42,13 @@ public: Type GetType() const override { return m_Type; } uint32_t GetSize() const override { return m_Size; } - bool IsDynamic() const override { return m_Dynamic; } + uint32_t GetUsage() const override { return m_Usage; } private: friend class CDevice; static std::unique_ptr Create( - CDevice* device, const Type type, const uint32_t size, const bool dynamic); + CDevice* device, const Type type, const uint32_t size, const uint32_t usage); CBuffer(); @@ -56,7 +56,7 @@ private: Type m_Type = Type::VERTEX; uint32_t m_Size = 0; - bool m_Dynamic = false; + uint32_t m_Usage = 0; }; } // namespace Dummy diff --git a/source/renderer/backend/dummy/Device.cpp b/source/renderer/backend/dummy/Device.cpp index cf2cc2da82..9bc48c3abb 100644 --- a/source/renderer/backend/dummy/Device.cpp +++ b/source/renderer/backend/dummy/Device.cpp @@ -116,9 +116,9 @@ std::unique_ptr CDevice::CreateFramebuffer( } std::unique_ptr CDevice::CreateBuffer( - const char*, const CBuffer::Type type, const uint32_t size, const bool dynamic) + const char*, const CBuffer::Type type, const uint32_t size, const uint32_t usage) { - return CBuffer::Create(this, type, size, dynamic); + return CBuffer::Create(this, type, size, usage); } std::unique_ptr CDevice::CreateShaderProgram( diff --git a/source/renderer/backend/dummy/Device.h b/source/renderer/backend/dummy/Device.h index 940123de19..fe06c2d989 100644 --- a/source/renderer/backend/dummy/Device.h +++ b/source/renderer/backend/dummy/Device.h @@ -79,7 +79,7 @@ public: SDepthStencilAttachment* depthStencilAttachment) override; std::unique_ptr CreateBuffer( - const char* name, const IBuffer::Type type, const uint32_t size, const bool dynamic) override; + const char* name, const IBuffer::Type type, const uint32_t size, const uint32_t usage) override; std::unique_ptr CreateShaderProgram( const CStr& name, const CShaderDefines& defines) override; diff --git a/source/renderer/backend/gl/Buffer.cpp b/source/renderer/backend/gl/Buffer.cpp index fd71ef52a9..b4fab48897 100644 --- a/source/renderer/backend/gl/Buffer.cpp +++ b/source/renderer/backend/gl/Buffer.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -38,18 +38,18 @@ namespace GL // static std::unique_ptr CBuffer::Create( CDevice* device, const char* name, - const Type type, const uint32_t size, const bool dynamic) + const Type type, const uint32_t size, const uint32_t usage) { ENSURE(type == Type::VERTEX || type == Type::INDEX); std::unique_ptr buffer(new CBuffer()); buffer->m_Device = device; buffer->m_Type = type; buffer->m_Size = size; - buffer->m_Dynamic = dynamic; + buffer->m_Usage = usage; glGenBuffersARB(1, &buffer->m_Handle); const GLenum target = type == Type::INDEX ? GL_ELEMENT_ARRAY_BUFFER : GL_ARRAY_BUFFER; glBindBufferARB(target, buffer->m_Handle); - glBufferDataARB(target, size, nullptr, dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + glBufferDataARB(target, size, nullptr, (usage & IBuffer::Usage::DYNAMIC) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); #if !CONFIG2_GLES if (buffer->m_Device->GetCapabilities().debugLabels) { diff --git a/source/renderer/backend/gl/Buffer.h b/source/renderer/backend/gl/Buffer.h index 5e587bb398..b59e7c5b16 100644 --- a/source/renderer/backend/gl/Buffer.h +++ b/source/renderer/backend/gl/Buffer.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2022 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -44,7 +44,7 @@ public: Type GetType() const override { return m_Type; } uint32_t GetSize() const override { return m_Size; } - bool IsDynamic() const override { return m_Dynamic; } + uint32_t GetUsage() const override { return m_Usage; } GLuint GetHandle() { return m_Handle; } @@ -53,14 +53,14 @@ private: static std::unique_ptr Create( CDevice* device, const char* name, - const Type type, const uint32_t size, const bool dynamic); + const Type type, const uint32_t size, const uint32_t usage); CBuffer(); CDevice* m_Device = nullptr; Type m_Type = Type::VERTEX; uint32_t m_Size = 0; - bool m_Dynamic = false; + uint32_t m_Usage = 0; GLuint m_Handle = 0; }; diff --git a/source/renderer/backend/gl/Device.cpp b/source/renderer/backend/gl/Device.cpp index f82bc33dad..d6d65e38a5 100644 --- a/source/renderer/backend/gl/Device.cpp +++ b/source/renderer/backend/gl/Device.cpp @@ -904,9 +904,9 @@ std::unique_ptr CDevice::CreateFramebuffer( } std::unique_ptr CDevice::CreateBuffer( - const char* name, const IBuffer::Type type, const uint32_t size, const bool dynamic) + const char* name, const IBuffer::Type type, const uint32_t size, const uint32_t usage) { - return CBuffer::Create(this, name, type, size, dynamic); + return CBuffer::Create(this, name, type, size, usage); } std::unique_ptr CDevice::CreateShaderProgram( diff --git a/source/renderer/backend/gl/Device.h b/source/renderer/backend/gl/Device.h index 19569f11bd..f07c65ca7b 100644 --- a/source/renderer/backend/gl/Device.h +++ b/source/renderer/backend/gl/Device.h @@ -94,7 +94,7 @@ public: SDepthStencilAttachment* depthStencilAttachment) override; std::unique_ptr CreateBuffer( - const char* name, const IBuffer::Type type, const uint32_t size, const bool dynamic) override; + const char* name, const IBuffer::Type type, const uint32_t size, const uint32_t usage) override; std::unique_ptr CreateShaderProgram( const CStr& name, const CShaderDefines& defines) override; diff --git a/source/renderer/backend/vulkan/Buffer.cpp b/source/renderer/backend/vulkan/Buffer.cpp index 17f5032b3d..3fe09ae851 100644 --- a/source/renderer/backend/vulkan/Buffer.cpp +++ b/source/renderer/backend/vulkan/Buffer.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -22,6 +22,8 @@ #include "renderer/backend/vulkan/Device.h" #include "renderer/backend/vulkan/Utilities.h" +#include + namespace Renderer { @@ -31,47 +33,69 @@ namespace Backend namespace Vulkan { +VkBufferUsageFlags ToVkBufferUsageFlags(const uint32_t usage) +{ + VkBufferUsageFlags usageFlags = 0; + if (usage & IBuffer::Usage::TRANSFER_SRC) + usageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + if (usage & IBuffer::Usage::TRANSFER_DST) + usageFlags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; + return usageFlags; +} + +std::tuple MakeCreationFlags( + const IBuffer::Type type, const uint32_t usage) +{ + const VkBufferUsageFlags commonFlags = ToVkBufferUsageFlags(usage); + + switch (type) + { + case IBuffer::Type::VERTEX: + ENSURE(usage & IBuffer::Usage::TRANSFER_DST); + return { + commonFlags | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE}; + case IBuffer::Type::INDEX: + ENSURE(usage & IBuffer::Usage::TRANSFER_DST); + return { + commonFlags | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE}; + case IBuffer::Type::UPLOAD: + ENSURE(usage & IBuffer::Usage::TRANSFER_SRC); + return { + 0, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + VMA_MEMORY_USAGE_AUTO}; + case IBuffer::Type::UNIFORM: + ENSURE(usage & IBuffer::Usage::TRANSFER_DST); + return { + commonFlags | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE}; + } + + return {0, 0, VMA_MEMORY_USAGE_AUTO}; +} + // static std::unique_ptr CBuffer::Create( CDevice* device, const char* name, const Type type, const uint32_t size, - const bool dynamic) + const uint32_t usage) { std::unique_ptr buffer(new CBuffer()); buffer->m_Device = device; buffer->m_Type = type; buffer->m_Size = size; - buffer->m_Dynamic = dynamic; + buffer->m_Usage = usage; - VkMemoryPropertyFlags properties = 0; - VkBufferUsageFlags usage = VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM; - VmaMemoryUsage memoryUsage = VMA_MEMORY_USAGE_AUTO; - switch (type) - { - case Type::VERTEX: - usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; - properties = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - memoryUsage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; - break; - case Type::INDEX: - usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; - properties = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - memoryUsage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; - break; - case Type::UPLOAD: - usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; - properties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - break; - case Type::UNIFORM: - usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; - properties = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - memoryUsage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; - break; - } + const auto [usageFlags, memoryProperties, memoryUsage] = MakeCreationFlags(type, usage); VkBufferCreateInfo bufferCreateInfo{}; bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; bufferCreateInfo.size = size; - bufferCreateInfo.usage = usage; + bufferCreateInfo.usage = usageFlags; bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; VmaAllocationCreateInfo allocationCreateInfo{}; @@ -81,7 +105,7 @@ std::unique_ptr CBuffer::Create( allocationCreateInfo.flags |= VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT; allocationCreateInfo.pUserData = const_cast(name); #endif - allocationCreateInfo.requiredFlags = properties; + allocationCreateInfo.requiredFlags = memoryProperties; allocationCreateInfo.usage = memoryUsage; const VkResult createBufferResult = vmaCreateBuffer( device->GetVMAAllocator(), &bufferCreateInfo, &allocationCreateInfo, diff --git a/source/renderer/backend/vulkan/Buffer.h b/source/renderer/backend/vulkan/Buffer.h index e5b35e06f0..6ba5333273 100644 --- a/source/renderer/backend/vulkan/Buffer.h +++ b/source/renderer/backend/vulkan/Buffer.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2023 Wildfire Games. +/* Copyright (C) 2024 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -44,7 +44,7 @@ public: Type GetType() const override { return m_Type; } uint32_t GetSize() const override { return m_Size; } - bool IsDynamic() const override { return m_Dynamic; } + uint32_t GetUsage() const override { return m_Usage; } VkBuffer GetVkBuffer() { return m_Buffer; } @@ -58,7 +58,7 @@ private: static std::unique_ptr Create( CDevice* device, const char* name, const Type type, const uint32_t size, - const bool dynamic); + const uint32_t usage); CBuffer(); @@ -66,7 +66,7 @@ private: Type m_Type = Type::VERTEX; uint32_t m_Size = 0; - bool m_Dynamic = false; + uint32_t m_Usage = 0; VkBuffer m_Buffer = VK_NULL_HANDLE; VmaAllocation m_Allocation = VK_NULL_HANDLE; diff --git a/source/renderer/backend/vulkan/Device.cpp b/source/renderer/backend/vulkan/Device.cpp index d8bfabd9ed..bb8a462f63 100644 --- a/source/renderer/backend/vulkan/Device.cpp +++ b/source/renderer/backend/vulkan/Device.cpp @@ -749,15 +749,15 @@ std::unique_ptr CDevice::CreateFramebuffer( } std::unique_ptr CDevice::CreateBuffer( - const char* name, const IBuffer::Type type, const uint32_t size, const bool dynamic) + const char* name, const IBuffer::Type type, const uint32_t size, const uint32_t usage) { - return CreateCBuffer(name, type, size, dynamic); + return CreateCBuffer(name, type, size, usage); } std::unique_ptr CDevice::CreateCBuffer( - const char* name, const IBuffer::Type type, const uint32_t size, const bool dynamic) + const char* name, const IBuffer::Type type, const uint32_t size, const uint32_t usage) { - return CBuffer::Create(this, name, type, size, dynamic); + return CBuffer::Create(this, name, type, size, usage); } std::unique_ptr CDevice::CreateShaderProgram( diff --git a/source/renderer/backend/vulkan/Device.h b/source/renderer/backend/vulkan/Device.h index 2e99af8b50..ede13bcd6b 100644 --- a/source/renderer/backend/vulkan/Device.h +++ b/source/renderer/backend/vulkan/Device.h @@ -101,10 +101,10 @@ public: SDepthStencilAttachment* depthStencilAttachment) override; std::unique_ptr CreateBuffer( - const char* name, const IBuffer::Type type, const uint32_t size, const bool dynamic) override; + const char* name, const IBuffer::Type type, const uint32_t size, const uint32_t usage) override; std::unique_ptr CreateCBuffer( - const char* name, const IBuffer::Type type, const uint32_t size, const bool dynamic); + const char* name, const IBuffer::Type type, const uint32_t size, const uint32_t usage); std::unique_ptr CreateShaderProgram( const CStr& name, const CShaderDefines& defines) override; diff --git a/source/renderer/backend/vulkan/DeviceCommandContext.cpp b/source/renderer/backend/vulkan/DeviceCommandContext.cpp index d185388b60..1f4318281a 100644 --- a/source/renderer/backend/vulkan/DeviceCommandContext.cpp +++ b/source/renderer/backend/vulkan/DeviceCommandContext.cpp @@ -242,9 +242,9 @@ void CDeviceCommandContext::CUploadRing::ResizeIfNeeded( m_Capacity = std::max(m_Capacity * 2, round_up_to_pow2(dataSize)); m_Buffer = m_Device->CreateCBuffer( - "UploadRingBuffer", m_Type, m_Capacity, true); + "UploadRingBuffer", m_Type, m_Capacity, IBuffer::Usage::DYNAMIC | IBuffer::Usage::TRANSFER_DST); m_StagingBuffer = m_Device->CreateCBuffer( - "UploadRingStagingBuffer", IBuffer::Type::UPLOAD, NUMBER_OF_FRAMES_IN_FLIGHT * m_Capacity, true); + "UploadRingStagingBuffer", IBuffer::Type::UPLOAD, NUMBER_OF_FRAMES_IN_FLIGHT * m_Capacity, IBuffer::Usage::DYNAMIC | IBuffer::Usage::TRANSFER_SRC); ENSURE(m_Buffer && m_StagingBuffer); m_StagingBufferMappedData = static_cast(m_StagingBuffer->GetMappedData()); ENSURE(m_StagingBufferMappedData); diff --git a/source/renderer/backend/vulkan/RingCommandContext.cpp b/source/renderer/backend/vulkan/RingCommandContext.cpp index a7b16e0088..4eda35fc4c 100644 --- a/source/renderer/backend/vulkan/RingCommandContext.cpp +++ b/source/renderer/backend/vulkan/RingCommandContext.cpp @@ -356,7 +356,7 @@ uint32_t CRingCommandContext::AcquireFreeSpace( std::max(m_StagingBuffer ? m_StagingBuffer->GetSize() * 2 : INITIAL_STAGING_BUFFER_CAPACITY, minimumRequiredCapacity), m_MaxStagingBufferCapacity); m_StagingBuffer = m_Device->CreateCBuffer( - "UploadRingBuffer", IBuffer::Type::UPLOAD, newCapacity, false); + "UploadRingBuffer", IBuffer::Type::UPLOAD, newCapacity, IBuffer::Usage::TRANSFER_SRC); ENSURE(m_StagingBuffer); m_StagingBufferFirst = 0; m_StagingBufferCurrentFirst = 0;