No more shared pointers

This commit is contained in:
Dynamitos
2023-11-01 23:12:30 +01:00
parent 5a9cb13e74
commit 4746c0f838
69 changed files with 524 additions and 681 deletions
+4 -4
View File
@@ -55,8 +55,8 @@ void FontLoader::import(FontImportArgs args, PFontAsset asset)
imageData.format = Gfx::SE_FORMAT_R8_UINT; imageData.format = Gfx::SE_FORMAT_R8_UINT;
imageData.width = face->glyph->bitmap.width; imageData.width = face->glyph->bitmap.width;
imageData.height = face->glyph->bitmap.rows; imageData.height = face->glyph->bitmap.rows;
imageData.resourceData.data = face->glyph->bitmap.buffer; imageData.sourceData.data = face->glyph->bitmap.buffer;
imageData.resourceData.size = imageData.width * imageData.height; imageData.sourceData.size = imageData.width * imageData.height;
if(imageData.width == 0 || imageData.height == 0) if(imageData.width == 0 || imageData.height == 0)
{ {
glyph.size.x = 1; glyph.size.x = 1;
@@ -65,8 +65,8 @@ void FontLoader::import(FontImportArgs args, PFontAsset asset)
glyph.bearing.y = 0; glyph.bearing.y = 0;
imageData.width = 1; imageData.width = 1;
imageData.height = 1; imageData.height = 1;
imageData.resourceData.size = sizeof(uint8); imageData.sourceData.size = sizeof(uint8);
imageData.resourceData.data = &transparentPixel; imageData.sourceData.data = &transparentPixel;
} }
glyph.texture = graphics->createTexture2D(imageData); glyph.texture = graphics->createTexture2D(imageData);
} }
+3 -3
View File
@@ -245,9 +245,9 @@ void MeshLoader::loadGlobalMeshes(const aiScene* scene, const Array<PMaterialAss
IndexBufferCreateInfo idxInfo; IndexBufferCreateInfo idxInfo;
idxInfo.indexType = Gfx::SE_INDEX_TYPE_UINT32; idxInfo.indexType = Gfx::SE_INDEX_TYPE_UINT32;
idxInfo.resourceData.data = (uint8 *)indices.data(); idxInfo.sourceData.data = (uint8 *)indices.data();
idxInfo.resourceData.owner = Gfx::QueueType::DEDICATED_TRANSFER; idxInfo.sourceData.owner = Gfx::QueueType::DEDICATED_TRANSFER;
idxInfo.resourceData.size = sizeof(uint32) * indices.size(); idxInfo.sourceData.size = sizeof(uint32) * indices.size();
Gfx::PIndexBuffer indexBuffer = graphics->createIndexBuffer(idxInfo); Gfx::PIndexBuffer indexBuffer = graphics->createIndexBuffer(idxInfo);
indexBuffer->transferOwnership(Gfx::QueueType::GRAPHICS); indexBuffer->transferOwnership(Gfx::QueueType::GRAPHICS);
+1 -1
View File
@@ -102,7 +102,7 @@ void FontAsset::load(ArchiveBuffer& buffer)
ktxTexture2_TranscodeBasis(kTexture, KTX_TTF_BC7_RGBA, 0); ktxTexture2_TranscodeBasis(kTexture, KTX_TTF_BC7_RGBA, 0);
TextureCreateInfo createInfo = { TextureCreateInfo createInfo = {
.resourceData = { .sourceData = {
.size = ktxTexture_GetDataSize(ktxTexture(kTexture)), .size = ktxTexture_GetDataSize(ktxTexture(kTexture)),
.data = ktxTexture_GetData(ktxTexture(kTexture)), .data = ktxTexture_GetData(ktxTexture(kTexture)),
.owner = Gfx::QueueType::GRAPHICS, .owner = Gfx::QueueType::GRAPHICS,
+1 -1
View File
@@ -18,7 +18,7 @@ public:
struct Glyph struct Glyph
{ {
Gfx::PTexture2D texture; Gfx::OTexture2D texture;
IVector2 size; IVector2 size;
IVector2 bearing; IVector2 bearing;
uint32 advance; uint32 advance;
+1 -1
View File
@@ -84,7 +84,7 @@ void TextureAsset::load(ArchiveBuffer& buffer)
assert(e == ktx_error_code_e::KTX_SUCCESS); assert(e == ktx_error_code_e::KTX_SUCCESS);
TextureCreateInfo createInfo = { TextureCreateInfo createInfo = {
.resourceData = { .sourceData = {
.size = ktxTexture_GetDataSize(ktxTexture(kTexture)), .size = ktxTexture_GetDataSize(ktxTexture(kTexture)),
.data = ktxTexture_GetData(ktxTexture(kTexture)), .data = ktxTexture_GetData(ktxTexture(kTexture)),
.owner = Gfx::QueueType::DEDICATED_TRANSFER, .owner = Gfx::QueueType::DEDICATED_TRANSFER,
+1 -2
View File
@@ -3,8 +3,7 @@ target_sources(Engine
Concepts.h Concepts.h
EngineTypes.h EngineTypes.h
Game.h Game.h
MinimalEngine.h MinimalEngine.h)
MinimalEngine.cpp)
target_sources(Engine target_sources(Engine
PUBLIC FILE_SET HEADERS PUBLIC FILE_SET HEADERS
+1 -1
View File
@@ -319,7 +319,7 @@ public:
{ {
if (pred(_data[i])) if (pred(_data[i]))
{ {
return const_iterator(&_data[i]); return iterator(&_data[i]);
} }
} }
return end(); return end();
+18 -18
View File
@@ -12,13 +12,13 @@ Buffer::~Buffer()
{ {
} }
UniformBuffer::UniformBuffer(QueueFamilyMapping mapping, const BulkResourceData& resourceData) UniformBuffer::UniformBuffer(QueueFamilyMapping mapping, const DataSource& sourceData)
: Buffer(mapping, resourceData.owner) : Buffer(mapping, sourceData.owner)
, contents(resourceData.size) , contents(sourceData.size)
{ {
if (resourceData.data != nullptr) if (sourceData.data != nullptr)
{ {
std::memcpy(contents.data(), resourceData.data, contents.size()); std::memcpy(contents.data(), sourceData.data, contents.size());
} }
} }
@@ -26,40 +26,40 @@ UniformBuffer::~UniformBuffer()
{ {
} }
bool UniformBuffer::updateContents(const BulkResourceData& resourceData) bool UniformBuffer::updateContents(const DataSource& sourceData)
{ {
assert(contents.size() == resourceData.size); assert(contents.size() == sourceData.size);
if (std::memcmp(contents.data(), resourceData.data, contents.size()) == 0) if (std::memcmp(contents.data(), sourceData.data, contents.size()) == 0)
{ {
return false; return false;
} }
std::memcpy(contents.data(), resourceData.data, contents.size()); std::memcpy(contents.data(), sourceData.data, contents.size());
return true; return true;
} }
ShaderBuffer::ShaderBuffer(QueueFamilyMapping mapping, uint32 stride, uint32 numElements, const BulkResourceData& resourceData) ShaderBuffer::ShaderBuffer(QueueFamilyMapping mapping, uint32 stride, uint32 numElements, const DataSource& sourceData)
: Buffer(mapping, resourceData.owner) : Buffer(mapping, sourceData.owner)
, contents(resourceData.size) , contents(sourceData.size)
, numElements(numElements) , numElements(numElements)
, stride(stride) , stride(stride)
{ {
if (resourceData.data != nullptr) if (sourceData.data != nullptr)
{ {
std::memcpy(contents.data(), resourceData.data, resourceData.size); std::memcpy(contents.data(), sourceData.data, sourceData.size);
} }
} }
ShaderBuffer::~ShaderBuffer() ShaderBuffer::~ShaderBuffer()
{ {
} }
bool ShaderBuffer::updateContents(const BulkResourceData& resourceData) bool ShaderBuffer::updateContents(const DataSource& sourceData)
{ {
assert(contents.size() >= resourceData.size); assert(contents.size() >= sourceData.size);
if (std::memcmp(contents.data(), resourceData.data, resourceData.size) == 0) if (std::memcmp(contents.data(), sourceData.data, sourceData.size) == 0)
{ {
return false; return false;
} }
std::memcpy(contents.data(), resourceData.data, resourceData.size); std::memcpy(contents.data(), sourceData.data, sourceData.size);
return true; return true;
} }
VertexBuffer::VertexBuffer(QueueFamilyMapping mapping, uint32 numVertices, uint32 vertexSize, QueueType startQueueType) VertexBuffer::VertexBuffer(QueueFamilyMapping mapping, uint32 numVertices, uint32 vertexSize, QueueType startQueueType)
+5 -5
View File
@@ -26,10 +26,10 @@ protected:
class UniformBuffer : public Buffer class UniformBuffer : public Buffer
{ {
public: public:
UniformBuffer(QueueFamilyMapping mapping, const BulkResourceData& resourceData); UniformBuffer(QueueFamilyMapping mapping, const DataSource& sourceData);
virtual ~UniformBuffer(); virtual ~UniformBuffer();
// returns true if an update was performed, false if the old contents == new contents // returns true if an update was performed, false if the old contents == new contents
virtual bool updateContents(const BulkResourceData& resourceData); virtual bool updateContents(const DataSource& sourceData);
bool isDataEquals(UniformBuffer* other) bool isDataEquals(UniformBuffer* other)
{ {
if(other == nullptr) if(other == nullptr)
@@ -70,7 +70,7 @@ public:
return vertexSize; return vertexSize;
} }
virtual void updateRegion(BulkResourceData update) = 0; virtual void updateRegion(DataSource update) = 0;
virtual void download(Array<uint8>& buffer) = 0; virtual void download(Array<uint8>& buffer) = 0;
protected: protected:
// Inherited via QueueOwnedResource // Inherited via QueueOwnedResource
@@ -110,9 +110,9 @@ DEFINE_REF(IndexBuffer)
class ShaderBuffer : public Buffer class ShaderBuffer : public Buffer
{ {
public: public:
ShaderBuffer(QueueFamilyMapping mapping, uint32 stride, uint32 numElements, const BulkResourceData& bulkResourceData); ShaderBuffer(QueueFamilyMapping mapping, uint32 stride, uint32 numElements, const DataSource& bulkResourceData);
virtual ~ShaderBuffer(); virtual ~ShaderBuffer();
virtual bool updateContents(const BulkResourceData& resourceData); virtual bool updateContents(const DataSource& sourceData);
bool isDataEquals(ShaderBuffer* other) bool isDataEquals(ShaderBuffer* other)
{ {
if(other == nullptr) if(other == nullptr)
+1 -3
View File
@@ -20,9 +20,7 @@ void DescriptorLayout::addDescriptorBinding(uint32 bindingIndex, SeDescriptorTyp
PDescriptorSet DescriptorLayout::allocateDescriptorSet() PDescriptorSet DescriptorLayout::allocateDescriptorSet()
{ {
std::scoped_lock lock(allocatorLock); std::scoped_lock lock(allocatorLock);
PDescriptorSet result; return allocator->allocateDescriptorSet();
allocator->allocateDescriptorSet(result);
return result;
} }
void DescriptorLayout::reset() void DescriptorLayout::reset()
+8 -4
View File
@@ -43,7 +43,7 @@ class DescriptorAllocator
public: public:
DescriptorAllocator() {} DescriptorAllocator() {}
virtual ~DescriptorAllocator() {} virtual ~DescriptorAllocator() {}
virtual void allocateDescriptorSet(PDescriptorSet& descriptorSet) = 0; virtual PDescriptorSet allocateDescriptorSet() = 0;
virtual void reset() = 0; virtual void reset() = 0;
}; };
DEFINE_REF(DescriptorAllocator) DEFINE_REF(DescriptorAllocator)
@@ -54,6 +54,7 @@ DECLARE_REF(SamplerState)
class DescriptorSet class DescriptorSet
{ {
public: public:
DescriptorSet() {}
virtual ~DescriptorSet() {} virtual ~DescriptorSet() {}
virtual void writeChanges() = 0; virtual void writeChanges() = 0;
virtual void updateBuffer(uint32 binding, PUniformBuffer uniformBuffer) = 0; virtual void updateBuffer(uint32 binding, PUniformBuffer uniformBuffer) = 0;
@@ -106,7 +107,7 @@ public:
protected: protected:
Array<DescriptorBinding> descriptorBindings; Array<DescriptorBinding> descriptorBindings;
PDescriptorAllocator allocator; ODescriptorAllocator allocator;
std::mutex allocatorLock; std::mutex allocatorLock;
uint32 setIndex; uint32 setIndex;
std::string name; std::string name;
@@ -117,6 +118,9 @@ DEFINE_REF(DescriptorLayout)
class PipelineLayout class PipelineLayout
{ {
public: public:
PipelineLayout()
{
}
PipelineLayout(PPipelineLayout baseLayout) PipelineLayout(PPipelineLayout baseLayout)
{ {
if (baseLayout != nullptr) if (baseLayout != nullptr)
@@ -128,12 +132,12 @@ public:
virtual ~PipelineLayout() {} virtual ~PipelineLayout() {}
virtual void create() = 0; virtual void create() = 0;
virtual void reset() = 0; virtual void reset() = 0;
void addDescriptorLayout(uint32 setIndex, PDescriptorLayout layout); void addDescriptorLayout(uint32 setIndex, const PDescriptorLayout layout);
void addPushConstants(const SePushConstantRange& pushConstants); void addPushConstants(const SePushConstantRange& pushConstants);
virtual uint32 getHash() const = 0; virtual uint32 getHash() const = 0;
protected: protected:
Array<PDescriptorLayout> descriptorSetLayouts; Array<const PDescriptorLayout> descriptorSetLayouts;
Array<SePushConstantRange> pushConstants; Array<SePushConstantRange> pushConstants;
}; };
DEFINE_REF(PipelineLayout) DEFINE_REF(PipelineLayout)
-15
View File
@@ -11,18 +11,3 @@ Graphics::Graphics()
Graphics::~Graphics() Graphics::~Graphics()
{ {
} }
PVertexBuffer Graphics::getNullVertexBuffer()
{
if(nullVertexBuffer == nullptr)
{
VertexBufferCreateInfo createInfo;
createInfo.numVertices = 1;
createInfo.vertexSize = sizeof(Vector4);
Vector4 data = Vector4(1, 1, 1, 1);
createInfo.resourceData.data = reinterpret_cast<uint8*>(&data);
createInfo.resourceData.size = sizeof(Vector4);
nullVertexBuffer = createVertexBuffer(createInfo);
}
return nullVertexBuffer;
}
+26 -27
View File
@@ -38,52 +38,51 @@ public:
return queueMapping; return queueMapping;
} }
PShaderCompiler getShaderCompiler() const PShaderCompiler getShaderCompiler()
{ {
return shaderCompiler; return shaderCompiler;
} }
virtual PWindow createWindow(const WindowCreateInfo &createInfo) = 0; virtual OWindow createWindow(const WindowCreateInfo &createInfo) = 0;
virtual PViewport createViewport(PWindow owner, const ViewportCreateInfo &createInfo) = 0; virtual OViewport createViewport(PWindow owner, const ViewportCreateInfo &createInfo) = 0;
virtual PRenderPass createRenderPass(PRenderTargetLayout layout, PViewport renderArea) = 0; virtual ORenderPass createRenderPass(ORenderTargetLayout layout, PViewport renderArea) = 0;
virtual void beginRenderPass(PRenderPass renderPass) = 0; virtual void beginRenderPass(PRenderPass renderPass) = 0;
virtual void endRenderPass() = 0; virtual void endRenderPass() = 0;
virtual void executeCommands(const Array<PRenderCommand>& commands) = 0; virtual void executeCommands(const Array<PRenderCommand>& commands) = 0;
virtual void executeCommands(const Array<PComputeCommand>& commands) = 0; virtual void executeCommands(const Array<PComputeCommand>& commands) = 0;
virtual PTexture2D createTexture2D(const TextureCreateInfo &createInfo) = 0; virtual OTexture2D createTexture2D(const TextureCreateInfo &createInfo) = 0;
virtual PTexture3D createTexture3D(const TextureCreateInfo &createInfo) = 0; virtual OTexture3D createTexture3D(const TextureCreateInfo &createInfo) = 0;
virtual PTextureCube createTextureCube(const TextureCreateInfo &createInfo) = 0; virtual OTextureCube createTextureCube(const TextureCreateInfo &createInfo) = 0;
virtual PUniformBuffer createUniformBuffer(const UniformBufferCreateInfo &bulkData) = 0; virtual OUniformBuffer createUniformBuffer(const UniformBufferCreateInfo &bulkData) = 0;
virtual PShaderBuffer createShaderBuffer(const ShaderBufferCreateInfo &bulkData) = 0; virtual OShaderBuffer createShaderBuffer(const ShaderBufferCreateInfo &bulkData) = 0;
virtual PVertexBuffer createVertexBuffer(const VertexBufferCreateInfo &bulkData) = 0; virtual OVertexBuffer createVertexBuffer(const VertexBufferCreateInfo &bulkData) = 0;
virtual PIndexBuffer createIndexBuffer(const IndexBufferCreateInfo &bulkData) = 0; virtual OIndexBuffer createIndexBuffer(const IndexBufferCreateInfo &bulkData) = 0;
virtual PRenderCommand createRenderCommand(const std::string& name = "") = 0; virtual PRenderCommand createRenderCommand(const std::string& name = "") = 0;
virtual PComputeCommand createComputeCommand(const std::string& name = "") = 0; virtual PComputeCommand createComputeCommand(const std::string& name = "") = 0;
virtual PVertexDeclaration createVertexDeclaration(const Array<VertexElement>& element) = 0;
virtual PVertexShader createVertexShader(const ShaderCreateInfo& createInfo) = 0;
virtual PFragmentShader createFragmentShader(const ShaderCreateInfo& createInfo) = 0;
virtual PComputeShader createComputeShader(const ShaderCreateInfo& createInfo) = 0;
virtual PMeshShader createMeshShader(const ShaderCreateInfo& createInfo) = 0;
virtual PTaskShader createTaskShader(const ShaderCreateInfo& createInfo) = 0;
virtual PGraphicsPipeline createGraphicsPipeline(const LegacyPipelineCreateInfo& createInfo) = 0;
virtual PGraphicsPipeline createGraphicsPipeline(const MeshPipelineCreateInfo& createInfo) = 0;
virtual PComputePipeline createComputePipeline(const ComputePipelineCreateInfo& createInfo) = 0;
virtual PSamplerState createSamplerState(const SamplerCreateInfo& createInfo) = 0;
virtual PDescriptorLayout createDescriptorLayout(const std::string& name = "") = 0; virtual OVertexDeclaration createVertexDeclaration(const Array<VertexElement>& element) = 0;
virtual PPipelineLayout createPipelineLayout(PPipelineLayout baseLayout = nullptr) = 0; virtual OVertexShader createVertexShader(const ShaderCreateInfo& createInfo) = 0;
virtual OFragmentShader createFragmentShader(const ShaderCreateInfo& createInfo) = 0;
virtual OComputeShader createComputeShader(const ShaderCreateInfo& createInfo) = 0;
virtual OMeshShader createMeshShader(const ShaderCreateInfo& createInfo) = 0;
virtual OTaskShader createTaskShader(const ShaderCreateInfo& createInfo) = 0;
virtual OGraphicsPipeline createGraphicsPipeline(const LegacyPipelineCreateInfo& createInfo) = 0;
virtual OGraphicsPipeline createGraphicsPipeline(const MeshPipelineCreateInfo& createInfo) = 0;
virtual OComputePipeline createComputePipeline(const ComputePipelineCreateInfo& createInfo) = 0;
virtual OSamplerState createSamplerState(const SamplerCreateInfo& createInfo) = 0;
virtual ODescriptorLayout createDescriptorLayout(const std::string& name = "") = 0;
virtual OPipelineLayout createPipelineLayout(PPipelineLayout baseLayout = nullptr) = 0;
virtual void copyTexture(Gfx::PTexture srcTexture, Gfx::PTexture dstTexture) = 0; virtual void copyTexture(Gfx::PTexture srcTexture, Gfx::PTexture dstTexture) = 0;
PVertexBuffer getNullVertexBuffer();
protected: protected:
PVertexBuffer nullVertexBuffer;
QueueFamilyMapping queueMapping; QueueFamilyMapping queueMapping;
PShaderCompiler shaderCompiler; OShaderCompiler shaderCompiler;
friend class Window; friend class Window;
}; };
DEFINE_REF(Graphics) DEFINE_REF(Graphics)
+6 -6
View File
@@ -48,7 +48,7 @@ struct ViewportCreateInfo
float fieldOfView = 1.222f; // 70 deg float fieldOfView = 1.222f; // 70 deg
}; };
// doesnt own the data, only proxy it // doesnt own the data, only proxy it
struct BulkResourceData struct DataSource
{ {
uint64 size = 0; uint64 size = 0;
uint64 offset = 0; uint64 offset = 0;
@@ -57,7 +57,7 @@ struct BulkResourceData
}; };
struct TextureCreateInfo struct TextureCreateInfo
{ {
BulkResourceData resourceData = BulkResourceData(); DataSource sourceData = DataSource();
uint32 width = 1; uint32 width = 1;
uint32 height = 1; uint32 height = 1;
uint32 depth = 1; uint32 depth = 1;
@@ -89,24 +89,24 @@ struct SamplerCreateInfo
}; };
struct VertexBufferCreateInfo struct VertexBufferCreateInfo
{ {
BulkResourceData resourceData = BulkResourceData(); DataSource sourceData = DataSource();
// bytes per vertex // bytes per vertex
uint32 vertexSize = 0; uint32 vertexSize = 0;
uint32 numVertices = 0; uint32 numVertices = 0;
}; };
struct IndexBufferCreateInfo struct IndexBufferCreateInfo
{ {
BulkResourceData resourceData = BulkResourceData(); DataSource sourceData = DataSource();
Gfx::SeIndexType indexType = Gfx::SeIndexType::SE_INDEX_TYPE_UINT16; Gfx::SeIndexType indexType = Gfx::SeIndexType::SE_INDEX_TYPE_UINT16;
}; };
struct UniformBufferCreateInfo struct UniformBufferCreateInfo
{ {
BulkResourceData resourceData = BulkResourceData(); DataSource sourceData = DataSource();
uint8 bDynamic = 0; uint8 bDynamic = 0;
}; };
struct ShaderBufferCreateInfo struct ShaderBufferCreateInfo
{ {
BulkResourceData resourceData; DataSource sourceData = DataSource();
uint32 stride; uint32 stride;
uint8 bDynamic = 0; uint8 bDynamic = 0;
}; };
+3 -3
View File
@@ -36,8 +36,8 @@ BasePass::BasePass(Gfx::PGraphics graphics, PScene scene)
viewLayout = graphics->createDescriptorLayout("ViewLayout"); viewLayout = graphics->createDescriptorLayout("ViewLayout");
viewLayout->addDescriptorBinding(0, Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER); viewLayout->addDescriptorBinding(0, Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
uniformInitializer.resourceData.size = sizeof(ViewParameter); uniformInitializer.sourceData.size = sizeof(ViewParameter);
uniformInitializer.resourceData.data = (uint8*)&viewParams; uniformInitializer.sourceData.data = (uint8*)&viewParams;
uniformInitializer.bDynamic = true; uniformInitializer.bDynamic = true;
viewParamBuffer = graphics->createUniformBuffer(uniformInitializer); viewParamBuffer = graphics->createUniformBuffer(uniformInitializer);
viewLayout->create(); viewLayout->create();
@@ -62,7 +62,7 @@ BasePass::~BasePass()
void BasePass::beginFrame(const Component::Camera& cam) void BasePass::beginFrame(const Component::Camera& cam)
{ {
BulkResourceData uniformUpdate; DataSource uniformUpdate;
viewParams.viewMatrix = cam.getViewMatrix(); viewParams.viewMatrix = cam.getViewMatrix();
viewParams.projectionMatrix = viewport->getProjectionMatrix(); viewParams.projectionMatrix = viewport->getProjectionMatrix();
+7 -7
View File
@@ -22,21 +22,21 @@ private:
Array<Gfx::PDescriptorSet> descriptorSets; Array<Gfx::PDescriptorSet> descriptorSets;
PCameraActor source; PCameraActor source;
Gfx::PPipelineLayout basePassLayout; Gfx::OPipelineLayout basePassLayout;
// Set 0: Light environment // Set 0: Light environment
static constexpr uint32 INDEX_LIGHT_ENV = 0; static constexpr uint32 INDEX_LIGHT_ENV = 0;
Gfx::PShaderBuffer oLightIndexList; Gfx::OShaderBuffer oLightIndexList;
Gfx::PTexture oLightGrid; Gfx::OTexture oLightGrid;
Gfx::PDescriptorLayout lightLayout; Gfx::ODescriptorLayout lightLayout;
// Set 1: viewParameter // Set 1: viewParameter
static constexpr uint32 INDEX_VIEW_PARAMS = 1; static constexpr uint32 INDEX_VIEW_PARAMS = 1;
Gfx::PDescriptorLayout viewLayout; Gfx::ODescriptorLayout viewLayout;
Gfx::PUniformBuffer viewParamBuffer; Gfx::OUniformBuffer viewParamBuffer;
// Set 2: materials, generated // Set 2: materials, generated
static constexpr uint32 INDEX_MATERIAL = 2; static constexpr uint32 INDEX_MATERIAL = 2;
// Set 3: primitive scene data // Set 3: primitive scene data
static constexpr uint32 INDEX_SCENE_DATA = 3; static constexpr uint32 INDEX_SCENE_DATA = 3;
Gfx::PDescriptorLayout sceneLayout; Gfx::ODescriptorLayout sceneLayout;
}; };
DEFINE_REF(BasePass) DEFINE_REF(BasePass)
} // namespace Seele } // namespace Seele
+3 -3
View File
@@ -28,7 +28,7 @@ DebugPass::~DebugPass()
void DebugPass::beginFrame(const Component::Camera& cam) void DebugPass::beginFrame(const Component::Camera& cam)
{ {
BulkResourceData uniformUpdate; DataSource uniformUpdate;
viewParams.viewMatrix = cam.getViewMatrix(); viewParams.viewMatrix = cam.getViewMatrix();
viewParams.projectionMatrix = viewport->getProjectionMatrix(); viewParams.projectionMatrix = viewport->getProjectionMatrix();
@@ -43,7 +43,7 @@ void DebugPass::beginFrame(const Component::Camera& cam)
descriptorSet->writeChanges(); descriptorSet->writeChanges();
VertexBufferCreateInfo vertexBufferInfo = { VertexBufferCreateInfo vertexBufferInfo = {
.resourceData = { .sourceData = {
.size = sizeof(DebugVertex) * passData.vertices.size(), .size = sizeof(DebugVertex) * passData.vertices.size(),
.data = (uint8*)passData.vertices.data(), .data = (uint8*)passData.vertices.data(),
}, },
@@ -75,7 +75,7 @@ void DebugPass::endFrame()
void DebugPass::publishOutputs() void DebugPass::publishOutputs()
{ {
UniformBufferCreateInfo viewCreateInfo = { UniformBufferCreateInfo viewCreateInfo = {
.resourceData = BulkResourceData { .sourceData = DataSource {
.size = sizeof(ViewParameter), .size = sizeof(ViewParameter),
.data = nullptr, .data = nullptr,
}, },
@@ -19,8 +19,8 @@ DepthPrepass::DepthPrepass(Gfx::PGraphics graphics, PScene scene)
viewLayout = graphics->createDescriptorLayout("ViewLayout"); viewLayout = graphics->createDescriptorLayout("ViewLayout");
viewLayout->addDescriptorBinding(0, Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER); viewLayout->addDescriptorBinding(0, Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
uniformInitializer.resourceData.size = sizeof(ViewParameter); uniformInitializer.sourceData.size = sizeof(ViewParameter);
uniformInitializer.resourceData.data = (uint8*)&viewParams; uniformInitializer.sourceData.data = (uint8*)&viewParams;
uniformInitializer.bDynamic = true; uniformInitializer.bDynamic = true;
viewParamBuffer = graphics->createUniformBuffer(uniformInitializer); viewParamBuffer = graphics->createUniformBuffer(uniformInitializer);
viewLayout->create(); viewLayout->create();
@@ -33,7 +33,7 @@ DepthPrepass::~DepthPrepass()
void DepthPrepass::beginFrame(const Component::Camera& cam) void DepthPrepass::beginFrame(const Component::Camera& cam)
{ {
BulkResourceData uniformUpdate; DataSource uniformUpdate;
viewParams.viewMatrix = cam.getViewMatrix(); viewParams.viewMatrix = cam.getViewMatrix();
viewParams.projectionMatrix = viewport->getProjectionMatrix(); viewParams.projectionMatrix = viewport->getProjectionMatrix();
@@ -70,7 +70,7 @@ void DepthPrepass::render()
// VertexData => per meshtype // VertexData => per meshtype
// SceneData => per material instance // SceneData => per material instance
Gfx::PRenderCommand command = graphics->createRenderCommand("DepthRender"); Gfx::PRenderCommand command = graphics->createRenderCommand("DepthRender");
Gfx::PPipelineLayout layout = graphics->createPipelineLayout(depthPrepassLayout); Gfx::OPipelineLayout layout = graphics->createPipelineLayout(depthPrepassLayout);
layout->addDescriptorLayout(INDEX_MATERIAL, materialData.material->getDescriptorLayout()); layout->addDescriptorLayout(INDEX_MATERIAL, materialData.material->getDescriptorLayout());
layout->addDescriptorLayout(INDEX_VERTEX_DATA, vertexData->getVertexDataLayout()); layout->addDescriptorLayout(INDEX_VERTEX_DATA, vertexData->getVertexDataLayout());
layout->addDescriptorLayout(INDEX_SCENE_DATA, vertexData->getInstanceDataLayout()); layout->addDescriptorLayout(INDEX_SCENE_DATA, vertexData->getInstanceDataLayout());
@@ -21,18 +21,18 @@ private:
Array<Gfx::PDescriptorSet> descriptorSets; Array<Gfx::PDescriptorSet> descriptorSets;
Gfx::PPipelineLayout depthPrepassLayout; Gfx::OPipelineLayout depthPrepassLayout;
// Set 0: viewParameter // Set 0: viewParameter
static constexpr uint32 INDEX_VIEW_PARAMS = 0; static constexpr uint32 INDEX_VIEW_PARAMS = 0;
Gfx::PDescriptorLayout viewLayout; Gfx::ODescriptorLayout viewLayout;
Gfx::PUniformBuffer viewParamBuffer; Gfx::OUniformBuffer viewParamBuffer;
// Set 1: materials, generated // Set 1: materials, generated
static constexpr uint32 INDEX_MATERIAL = 1; static constexpr uint32 INDEX_MATERIAL = 1;
// Set 2: vertices, from VertexData // Set 2: vertices, from VertexData
static constexpr uint32 INDEX_VERTEX_DATA = 2; static constexpr uint32 INDEX_VERTEX_DATA = 2;
// Set 3: mesh data, either index buffer or meshlet data // Set 3: mesh data, either index buffer or meshlet data
static constexpr uint32 INDEX_SCENE_DATA = 3; static constexpr uint32 INDEX_SCENE_DATA = 3;
Gfx::PDescriptorLayout sceneDataLayout; Gfx::ODescriptorLayout sceneDataLayout;
}; };
DEFINE_REF(DepthPrepass) DEFINE_REF(DepthPrepass)
} // namespace Seele } // namespace Seele
@@ -22,7 +22,7 @@ void LightCullingPass::beginFrame(const Component::Camera& cam)
uint32_t viewportWidth = viewport->getSizeX(); uint32_t viewportWidth = viewport->getSizeX();
uint32_t viewportHeight = viewport->getSizeY(); uint32_t viewportHeight = viewport->getSizeY();
BulkResourceData uniformUpdate; DataSource uniformUpdate;
viewParams.viewMatrix = cam.getViewMatrix(); viewParams.viewMatrix = cam.getViewMatrix();
viewParams.projectionMatrix = viewport->getProjectionMatrix(); viewParams.projectionMatrix = viewport->getProjectionMatrix();
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 1); viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 1);
@@ -31,7 +31,7 @@ void LightCullingPass::beginFrame(const Component::Camera& cam)
uniformUpdate.data = (uint8*)&viewParams; uniformUpdate.data = (uint8*)&viewParams;
viewParamsBuffer->updateContents(uniformUpdate); viewParamsBuffer->updateContents(uniformUpdate);
BulkResourceData counterReset; DataSource counterReset;
uint32 reset = 0; uint32 reset = 0;
counterReset.data = (uint8*)&reset; counterReset.data = (uint8*)&reset;
counterReset.size = sizeof(uint32); counterReset.size = sizeof(uint32);
@@ -161,7 +161,7 @@ void LightCullingPass::publishOutputs()
uint32 counterReset = 0; uint32 counterReset = 0;
ShaderBufferCreateInfo structInfo = ShaderBufferCreateInfo structInfo =
{ {
.resourceData = { .sourceData = {
.size = sizeof(uint32), .size = sizeof(uint32),
.data = (uint8*)&counterReset, .data = (uint8*)&counterReset,
.owner = Gfx::QueueType::COMPUTE, .owner = Gfx::QueueType::COMPUTE,
@@ -172,7 +172,7 @@ void LightCullingPass::publishOutputs()
oLightIndexCounter = graphics->createShaderBuffer(structInfo); oLightIndexCounter = graphics->createShaderBuffer(structInfo);
tLightIndexCounter = graphics->createShaderBuffer(structInfo); tLightIndexCounter = graphics->createShaderBuffer(structInfo);
structInfo = { structInfo = {
.resourceData = { .sourceData = {
.size = (uint32)sizeof(uint32) .size = (uint32)sizeof(uint32)
* dispatchParams.numThreadGroups.x * dispatchParams.numThreadGroups.x
* dispatchParams.numThreadGroups.y * dispatchParams.numThreadGroups.y
@@ -248,23 +248,23 @@ void LightCullingPass::setupFrustums()
pipelineInfo.pipelineLayout = frustumLayout; pipelineInfo.pipelineLayout = frustumLayout;
frustumPipeline = graphics->createComputePipeline(pipelineInfo); frustumPipeline = graphics->createComputePipeline(pipelineInfo);
BulkResourceData resourceInfo; DataSource resourceInfo;
UniformBufferCreateInfo uniformInfo; UniformBufferCreateInfo uniformInfo;
resourceInfo.size = sizeof(ViewParameter); resourceInfo.size = sizeof(ViewParameter);
resourceInfo.data = (uint8*)&viewParams; resourceInfo.data = (uint8*)&viewParams;
resourceInfo.owner = Gfx::QueueType::COMPUTE; resourceInfo.owner = Gfx::QueueType::COMPUTE;
uniformInfo.resourceData = resourceInfo; uniformInfo.sourceData = resourceInfo;
uniformInfo.bDynamic = false; uniformInfo.bDynamic = false;
viewParamsBuffer = graphics->createUniformBuffer(uniformInfo); viewParamsBuffer = graphics->createUniformBuffer(uniformInfo);
resourceInfo.size = sizeof(DispatchParams); resourceInfo.size = sizeof(DispatchParams);
resourceInfo.data = (uint8*)&dispatchParams; resourceInfo.data = (uint8*)&dispatchParams;
uniformInfo.resourceData = resourceInfo; uniformInfo.sourceData = resourceInfo;
uniformInfo.bDynamic = false; uniformInfo.bDynamic = false;
dispatchParamsBuffer = graphics->createUniformBuffer(uniformInfo); dispatchParamsBuffer = graphics->createUniformBuffer(uniformInfo);
ShaderBufferCreateInfo structuredInfo = { ShaderBufferCreateInfo structuredInfo = {
.resourceData = { .sourceData = {
.size = sizeof(Frustum) * numThreads.x * numThreads.y * numThreads.z, .size = sizeof(Frustum) * numThreads.x * numThreads.y * numThreads.z,
.data = nullptr, .data = nullptr,
}, },
@@ -70,7 +70,7 @@ SkyboxRenderPass::SkyboxRenderPass(Gfx::PGraphics graphics, PScene scene)
}; };
VertexBufferCreateInfo vertexBufferInfo = { VertexBufferCreateInfo vertexBufferInfo = {
.resourceData = { .sourceData = {
.size = sizeof(Vector) * vertices.size(), .size = sizeof(Vector) * vertices.size(),
.data = (uint8*)vertices.data(), .data = (uint8*)vertices.data(),
}, },
@@ -86,7 +86,7 @@ SkyboxRenderPass::~SkyboxRenderPass()
void SkyboxRenderPass::beginFrame(const Component::Camera& cam) void SkyboxRenderPass::beginFrame(const Component::Camera& cam)
{ {
BulkResourceData uniformUpdate; DataSource uniformUpdate;
viewParams.viewMatrix = cam.getViewMatrix(); viewParams.viewMatrix = cam.getViewMatrix();
viewParams.projectionMatrix = viewport->getProjectionMatrix(); viewParams.projectionMatrix = viewport->getProjectionMatrix();
@@ -127,7 +127,7 @@ void SkyboxRenderPass::endFrame()
void SkyboxRenderPass::publishOutputs() void SkyboxRenderPass::publishOutputs()
{ {
UniformBufferCreateInfo viewCreateInfo = { UniformBufferCreateInfo viewCreateInfo = {
.resourceData = BulkResourceData { .sourceData = DataSource {
.size = sizeof(ViewParameter), .size = sizeof(ViewParameter),
.data = nullptr, .data = nullptr,
}, },
+3 -3
View File
@@ -43,7 +43,7 @@ void TextPass::beginFrame(const Component::Camera&)
x += (glyph.advance >> 6) * render.scale; x += (glyph.advance >> 6) * render.scale;
} }
VertexBufferCreateInfo vbInfo = { VertexBufferCreateInfo vbInfo = {
.resourceData = { .sourceData = {
.size = static_cast<uint32>(instanceData.size() * sizeof(GlyphInstanceData)), .size = static_cast<uint32>(instanceData.size() * sizeof(GlyphInstanceData)),
.data = reinterpret_cast<uint8*>(instanceData.data()), .data = reinterpret_cast<uint8*>(instanceData.data()),
}, },
@@ -60,7 +60,7 @@ void TextPass::beginFrame(const Component::Camera&)
}; };
} }
auto proj = viewport->getProjectionMatrix(); auto proj = viewport->getProjectionMatrix();
BulkResourceData projectionUpdate = { DataSource projectionUpdate = {
.size = sizeof(Matrix4), .size = sizeof(Matrix4),
.data = (uint8*)&proj, .data = (uint8*)&proj,
}; };
@@ -156,7 +156,7 @@ void TextPass::createRenderPass()
textureArrayLayout->create(); textureArrayLayout->create();
projectionBuffer = graphics->createUniformBuffer({ projectionBuffer = graphics->createUniformBuffer({
.resourceData = { .sourceData = {
.size = sizeof(Matrix4), .size = sizeof(Matrix4),
.data = nullptr, .data = nullptr,
}, },
+3 -3
View File
@@ -18,7 +18,7 @@ UIPass::~UIPass()
void UIPass::beginFrame(const Component::Camera&) void UIPass::beginFrame(const Component::Camera&)
{ {
VertexBufferCreateInfo info = { VertexBufferCreateInfo info = {
.resourceData = { .sourceData = {
.size = (uint32)(sizeof(UI::RenderElementStyle) * renderElements.size()), .size = (uint32)(sizeof(UI::RenderElementStyle) * renderElements.size()),
.data = (uint8*)renderElements.data() .data = (uint8*)renderElements.data()
}, },
@@ -148,7 +148,7 @@ void UIPass::createRenderPass()
Matrix4 projectionMatrix = glm::ortho(0, 1, 1, 0); Matrix4 projectionMatrix = glm::ortho(0, 1, 1, 0);
UniformBufferCreateInfo info = { UniformBufferCreateInfo info = {
.resourceData = { .sourceData = {
.size = sizeof(Matrix4), .size = sizeof(Matrix4),
.data = (uint8*)&projectionMatrix, .data = (uint8*)&projectionMatrix,
}, },
@@ -158,7 +158,7 @@ void UIPass::createRenderPass()
Gfx::PSamplerState backgroundSampler = graphics->createSamplerState({}); Gfx::PSamplerState backgroundSampler = graphics->createSamplerState({});
info = { info = {
.resourceData = { .sourceData = {
.size = sizeof(uint32), .size = sizeof(uint32),
.data = nullptr .data = nullptr
}, },
+13 -13
View File
@@ -18,22 +18,22 @@ public:
virtual void publishOutputs() override; virtual void publishOutputs() override;
virtual void createRenderPass() override; virtual void createRenderPass() override;
private: private:
Gfx::PRenderTargetAttachment renderTarget; Gfx::ORenderTargetAttachment renderTarget;
Gfx::PTexture2D colorBuffer; Gfx::OTexture2D colorBuffer;
Gfx::PRenderTargetAttachment depthAttachment; Gfx::ORenderTargetAttachment depthAttachment;
Gfx::PTexture2D depthBuffer; Gfx::OTexture2D depthBuffer;
Gfx::PDescriptorLayout descriptorLayout; Gfx::ODescriptorLayout descriptorLayout;
Gfx::PDescriptorSet descriptorSet; Gfx::ODescriptorSet descriptorSet;
Gfx::PUniformBuffer numTexturesBuffer; Gfx::OUniformBuffer numTexturesBuffer;
Gfx::PVertexBuffer elementBuffer; Gfx::OVertexBuffer elementBuffer;
Gfx::PVertexDeclaration declaration; Gfx::OVertexDeclaration declaration;
Gfx::PVertexShader vertexShader; Gfx::OVertexShader vertexShader;
Gfx::PFragmentShader fragmentShader; Gfx::OFragmentShader fragmentShader;
Gfx::PPipelineLayout pipelineLayout; Gfx::OPipelineLayout pipelineLayout;
Gfx::PGraphicsPipeline pipeline; Gfx::OGraphicsPipeline pipeline;
Array<UI::RenderElementStyle> renderElements; Array<UI::RenderElementStyle> renderElements;
Array<Gfx::PTexture> usedTextures; Array<Gfx::PTexture> usedTextures;
+11 -11
View File
@@ -11,35 +11,35 @@ RenderTargetLayout::RenderTargetLayout()
{ {
} }
RenderTargetLayout::RenderTargetLayout(PRenderTargetAttachment depthAttachment) RenderTargetLayout::RenderTargetLayout(ORenderTargetAttachment depthAttachment)
: inputAttachments() : inputAttachments()
, colorAttachments() , colorAttachments()
, depthAttachment(depthAttachment) , depthAttachment(std::move(depthAttachment))
, width(depthAttachment->getTexture()->getSizeX()) , width(depthAttachment->getTexture()->getSizeX())
, height(depthAttachment->getTexture()->getSizeY()) , height(depthAttachment->getTexture()->getSizeY())
{ {
} }
RenderTargetLayout::RenderTargetLayout(PRenderTargetAttachment colorAttachment, PRenderTargetAttachment depthAttachment) RenderTargetLayout::RenderTargetLayout(ORenderTargetAttachment colorAttachment, ORenderTargetAttachment depthAttachment)
: inputAttachments() : inputAttachments()
, depthAttachment(depthAttachment) , depthAttachment(std::move(depthAttachment))
, width(depthAttachment->getTexture()->getSizeX()) , width(depthAttachment->getTexture()->getSizeX())
, height(depthAttachment->getTexture()->getSizeY()) , height(depthAttachment->getTexture()->getSizeY())
{ {
colorAttachments.add(colorAttachment); colorAttachments.add(colorAttachment);
} }
RenderTargetLayout::RenderTargetLayout(Array<PRenderTargetAttachment> colorAttachments, PRenderTargetAttachment depthAttachment) RenderTargetLayout::RenderTargetLayout(Array<ORenderTargetAttachment> colorAttachments, ORenderTargetAttachment depthAttachment)
: inputAttachments() : inputAttachments()
, colorAttachments(colorAttachments) , colorAttachments(std::move(colorAttachments))
, depthAttachment(depthAttachment) , depthAttachment(std::move(depthAttachment))
, width(depthAttachment->getTexture()->getSizeX()) , width(depthAttachment->getTexture()->getSizeX())
, height(depthAttachment->getTexture()->getSizeY()) , height(depthAttachment->getTexture()->getSizeY())
{ {
} }
RenderTargetLayout::RenderTargetLayout(Array<PRenderTargetAttachment> inputAttachments, Array<PRenderTargetAttachment> colorAttachments, PRenderTargetAttachment depthAttachment) RenderTargetLayout::RenderTargetLayout(Array<ORenderTargetAttachment> inputAttachments, Array<ORenderTargetAttachment> colorAttachments, ORenderTargetAttachment depthAttachment)
: inputAttachments(inputAttachments) : inputAttachments(std::move(inputAttachments))
, colorAttachments(colorAttachments) , colorAttachments(std::move(colorAttachments))
, depthAttachment(depthAttachment) , depthAttachment(std::move(depthAttachment))
, width(depthAttachment->getTexture()->getSizeX()) , width(depthAttachment->getTexture()->getSizeX())
, height(depthAttachment->getTexture()->getSizeY()) , height(depthAttachment->getTexture()->getSizeY())
{ {
+11 -11
View File
@@ -15,7 +15,7 @@ public:
virtual void beginFrame() = 0; virtual void beginFrame() = 0;
virtual void endFrame() = 0; virtual void endFrame() = 0;
virtual void onWindowCloseEvent() = 0; virtual void onWindowCloseEvent() = 0;
virtual PTexture2D getBackBuffer() const = 0; virtual PTexture2D getBackBuffer() = 0;
virtual void setKeyCallback(std::function<void(KeyCode, InputAction, KeyModifier)> callback) = 0; virtual void setKeyCallback(std::function<void(KeyCode, InputAction, KeyModifier)> callback) = 0;
virtual void setMouseMoveCallback(std::function<void(double, double)> callback) = 0; virtual void setMouseMoveCallback(std::function<void(double, double)> callback) = 0;
virtual void setMouseButtonCallback(std::function<void(MouseButton, InputAction, KeyModifier)> callback) = 0; virtual void setMouseButtonCallback(std::function<void(MouseButton, InputAction, KeyModifier)> callback) = 0;
@@ -167,13 +167,13 @@ class RenderTargetLayout
{ {
public: public:
RenderTargetLayout(); RenderTargetLayout();
RenderTargetLayout(PRenderTargetAttachment depthAttachment); RenderTargetLayout(ORenderTargetAttachment depthAttachment);
RenderTargetLayout(PRenderTargetAttachment colorAttachment, PRenderTargetAttachment depthAttachment); RenderTargetLayout(ORenderTargetAttachment colorAttachment, ORenderTargetAttachment depthAttachment);
RenderTargetLayout(Array<PRenderTargetAttachment> colorAttachments, PRenderTargetAttachment depthAttachmet); RenderTargetLayout(Array<ORenderTargetAttachment> colorAttachments, ORenderTargetAttachment depthAttachmet);
RenderTargetLayout(Array<PRenderTargetAttachment> inputAttachments, Array<PRenderTargetAttachment> colorAttachments, PRenderTargetAttachment depthAttachment); RenderTargetLayout(Array<ORenderTargetAttachment> inputAttachments, Array<ORenderTargetAttachment> colorAttachments, ORenderTargetAttachment depthAttachment);
Array<PRenderTargetAttachment> inputAttachments; Array<ORenderTargetAttachment> inputAttachments;
Array<PRenderTargetAttachment> colorAttachments; Array<ORenderTargetAttachment> colorAttachments;
PRenderTargetAttachment depthAttachment; ORenderTargetAttachment depthAttachment;
uint32 width; uint32 width;
uint32 height; uint32 height;
}; };
@@ -182,12 +182,12 @@ DEFINE_REF(RenderTargetLayout)
class RenderPass class RenderPass
{ {
public: public:
RenderPass(PRenderTargetLayout layout) : layout(layout) {} RenderPass(ORenderTargetLayout layout) : layout(std::move(layout)) {}
virtual ~RenderPass() {} virtual ~RenderPass() {}
inline PRenderTargetLayout getLayout() const { return layout; } inline PRenderTargetLayout getLayout() { return layout; }
protected: protected:
PRenderTargetLayout layout; ORenderTargetLayout layout;
}; };
DEFINE_REF(RenderPass) DEFINE_REF(RenderPass)
} }
+2 -1
View File
@@ -1,4 +1,6 @@
#include "Shader.h" #include "Shader.h"
#include "Graphics/RenderPass/DepthPrepass.h"
#include "Graphics/RenderPass/BasePass.h"
using namespace Seele; using namespace Seele;
using namespace Seele::Gfx; using namespace Seele::Gfx;
@@ -51,7 +53,6 @@ ShaderCollection& ShaderMap::createShaders(
PGraphics graphics, PGraphics graphics,
RenderPassType renderPass, RenderPassType renderPass,
PMaterial material, PMaterial material,
VertexInputType* vertexInput,
bool /*bPositionOnly*/) bool /*bPositionOnly*/)
{ {
std::scoped_lock lock(shadersLock); std::scoped_lock lock(shadersLock);
+7 -3
View File
@@ -1,6 +1,7 @@
#pragma once #pragma once
#include "Enums.h" #include "Enums.h"
#include "CRC.h" #include "CRC.h"
#include "Resources.h"
namespace Seele namespace Seele
{ {
@@ -86,9 +87,12 @@ struct PermutationId
struct ShaderCollection struct ShaderCollection
{ {
PermutationId id; PermutationId id;
//PVertexDeclaration vertexDeclaration;
PVertexShader vertexShader; OVertexDeclaration vertexDeclaration;
PFragmentShader fragmentShader; OVertexShader vertexShader;
OTaskShader taskShader;
OMeshShader meshShader;
OFragmentShader fragmentShader;
}; };
class ShaderMap class ShaderMap
{ {
+7 -7
View File
@@ -131,7 +131,7 @@ Gfx::PDescriptorSet StaticMeshVertexData::getVertexDataSet()
void StaticMeshVertexData::resizeBuffers() void StaticMeshVertexData::resizeBuffers()
{ {
ShaderBufferCreateInfo createInfo = { ShaderBufferCreateInfo createInfo = {
.resourceData = { .sourceData = {
.size = verticesAllocated * sizeof(Vector), .size = verticesAllocated * sizeof(Vector),
}, },
.stride = sizeof(Vector), .stride = sizeof(Vector),
@@ -141,7 +141,7 @@ void StaticMeshVertexData::resizeBuffers()
normals = graphics->createShaderBuffer(createInfo); normals = graphics->createShaderBuffer(createInfo);
tangents = graphics->createShaderBuffer(createInfo); tangents = graphics->createShaderBuffer(createInfo);
biTangents = graphics->createShaderBuffer(createInfo); biTangents = graphics->createShaderBuffer(createInfo);
createInfo.resourceData.size = verticesAllocated * sizeof(Vector2); createInfo.sourceData.size = verticesAllocated * sizeof(Vector2);
createInfo.stride = sizeof(Vector2); createInfo.stride = sizeof(Vector2);
texCoords = graphics->createShaderBuffer(createInfo); texCoords = graphics->createShaderBuffer(createInfo);
@@ -154,23 +154,23 @@ void StaticMeshVertexData::resizeBuffers()
void StaticMeshVertexData::updateBuffers() void StaticMeshVertexData::updateBuffers()
{ {
positions->updateContents(BulkResourceData{ positions->updateContents(DataSource{
.size = positionData.size() * sizeof(Vector), .size = positionData.size() * sizeof(Vector),
.data = (uint8*)positionData.data(), .data = (uint8*)positionData.data(),
}); });
texCoords->updateContents(BulkResourceData{ texCoords->updateContents(DataSource{
.size = texCoordsData.size() * sizeof(Vector2), .size = texCoordsData.size() * sizeof(Vector2),
.data = (uint8*)texCoordsData.data(), .data = (uint8*)texCoordsData.data(),
}); });
normals->updateContents(BulkResourceData{ normals->updateContents(DataSource{
.size = normalData.size() * sizeof(Vector), .size = normalData.size() * sizeof(Vector),
.data = (uint8*)normalData.data(), .data = (uint8*)normalData.data(),
}); });
tangents->updateContents(BulkResourceData{ tangents->updateContents(DataSource{
.size = tangentData.size() * sizeof(Vector), .size = tangentData.size() * sizeof(Vector),
.data = (uint8*)tangentData.data(), .data = (uint8*)tangentData.data(),
}); });
biTangents->updateContents(BulkResourceData{ biTangents->updateContents(DataSource{
.size = biTangentData.size() * sizeof(Vector), .size = biTangentData.size() * sizeof(Vector),
.data = (uint8*)biTangentData.data(), .data = (uint8*)biTangentData.data(),
}); });
+7 -7
View File
@@ -24,17 +24,17 @@ public:
private: private:
virtual void resizeBuffers() override; virtual void resizeBuffers() override;
virtual void updateBuffers() override; virtual void updateBuffers() override;
Gfx::PShaderBuffer positions; Gfx::OShaderBuffer positions;
Array<Vector> positionData; Array<Vector> positionData;
Gfx::PShaderBuffer texCoords; Gfx::OShaderBuffer texCoords;
Array<Vector2> texCoordsData; Array<Vector2> texCoordsData;
Gfx::PShaderBuffer normals; Gfx::OShaderBuffer normals;
Array<Vector> normalData; Array<Vector> normalData;
Gfx::PShaderBuffer tangents; Gfx::OShaderBuffer tangents;
Array<Vector> tangentData; Array<Vector> tangentData;
Gfx::PShaderBuffer biTangents; Gfx::OShaderBuffer biTangents;
Array<Vector> biTangentData; Array<Vector> biTangentData;
Gfx::PDescriptorLayout descriptorLayout; Gfx::ODescriptorLayout descriptorLayout;
Gfx::PDescriptorSet descriptorSet; Gfx::ODescriptorSet descriptorSet;
}; };
} }
+5 -5
View File
@@ -65,7 +65,7 @@ void VertexData::loadMesh(MeshId id, Array<Meshlet> loadedMeshlets)
currentMesh += numMeshlets; currentMesh += numMeshlets;
} }
meshletBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo { meshletBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo {
.resourceData = { .sourceData = {
.size = sizeof(MeshletDescription) * meshlets.size(), .size = sizeof(MeshletDescription) * meshlets.size(),
.data = (uint8*)meshlets.data() .data = (uint8*)meshlets.data()
}, },
@@ -73,7 +73,7 @@ void VertexData::loadMesh(MeshId id, Array<Meshlet> loadedMeshlets)
.bDynamic = true, .bDynamic = true,
}); });
vertexIndicesBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo { vertexIndicesBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo {
.resourceData = { .sourceData = {
.size = sizeof(uint32) * vertexIndices.size(), .size = sizeof(uint32) * vertexIndices.size(),
.data = (uint8*)vertexIndices.data(), .data = (uint8*)vertexIndices.data(),
}, },
@@ -81,7 +81,7 @@ void VertexData::loadMesh(MeshId id, Array<Meshlet> loadedMeshlets)
.bDynamic = true, .bDynamic = true,
}); });
primitiveIndicesBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo { primitiveIndicesBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo {
.resourceData = { .sourceData = {
.size = sizeof(uint8) * primitiveIndices.size(), .size = sizeof(uint8) * primitiveIndices.size(),
.data = (uint8*)primitiveIndices.data(), .data = (uint8*)primitiveIndices.data(),
}, },
@@ -108,7 +108,7 @@ void VertexData::createDescriptors()
} }
} }
Gfx::PShaderBuffer instanceBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{ Gfx::PShaderBuffer instanceBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{
.resourceData = { .sourceData = {
.size = sizeof(InstanceData) * instanceData.size(), .size = sizeof(InstanceData) * instanceData.size(),
.data = (uint8*)instanceData.data(), .data = (uint8*)instanceData.data(),
}, },
@@ -119,7 +119,7 @@ void VertexData::createDescriptors()
if (Gfx::useMeshShading) if (Gfx::useMeshShading)
{ {
Gfx::PShaderBuffer meshDataBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{ Gfx::PShaderBuffer meshDataBuffer = graphics->createShaderBuffer(ShaderBufferCreateInfo{
.resourceData = { .sourceData = {
.size = sizeof(MeshData) * meshes.size(), .size = sizeof(MeshData) * meshes.size(),
.data = (uint8*)meshes.data(), .data = (uint8*)meshes.data(),
}, },
+6 -6
View File
@@ -101,14 +101,14 @@ protected:
Array<MeshletDescription> meshlets; Array<MeshletDescription> meshlets;
Array<uint8> primitiveIndices; Array<uint8> primitiveIndices;
Array<uint32> vertexIndices; Array<uint32> vertexIndices;
Gfx::PGraphics graphics; Gfx::OGraphics graphics;
Gfx::PDescriptorLayout instanceDataLayout; Gfx::ODescriptorLayout instanceDataLayout;
// for mesh shading // for mesh shading
Gfx::PShaderBuffer meshletBuffer; Gfx::OShaderBuffer meshletBuffer;
Gfx::PShaderBuffer vertexIndicesBuffer; Gfx::OShaderBuffer vertexIndicesBuffer;
Gfx::PShaderBuffer primitiveIndicesBuffer; Gfx::OShaderBuffer primitiveIndicesBuffer;
// for legacy pipeline // for legacy pipeline
Gfx::PIndexBuffer indexBuffer; Gfx::OIndexBuffer indexBuffer;
uint64 idCounter; uint64 idCounter;
uint64 head; uint64 head;
uint64 verticesAllocated; uint64 verticesAllocated;
+1 -1
View File
@@ -43,7 +43,7 @@ void SubAllocation::invalidateMemory()
owner->invalidateMemory(); owner->invalidateMemory();
} }
Allocation::Allocation(PGraphics graphics, Allocator *allocator, VkDeviceSize size, uint8 memoryTypeIndex, Allocation::Allocation(PGraphics graphics, PAllocator allocator, VkDeviceSize size, uint8 memoryTypeIndex,
VkMemoryPropertyFlags properties, VkMemoryDedicatedAllocateInfo *dedicatedInfo) VkMemoryPropertyFlags properties, VkMemoryDedicatedAllocateInfo *dedicatedInfo)
: device(graphics->getDevice()) : device(graphics->getDevice())
, allocator(allocator) , allocator(allocator)
+5 -5
View File
@@ -95,11 +95,11 @@ public:
private: private:
VkDevice device; VkDevice device;
Allocator *allocator; PAllocator allocator;
VkDeviceSize bytesAllocated; VkDeviceSize bytesAllocated;
VkDeviceSize bytesUsed; VkDeviceSize bytesUsed;
VkDeviceMemory allocatedMemory; VkDeviceMemory allocatedMemory;
std::map<VkDeviceSize, SubAllocation *> activeAllocations; std::map<VkDeviceSize, PSubAllocation> activeAllocations;
std::map<VkDeviceSize, PSubAllocation> freeRanges; std::map<VkDeviceSize, PSubAllocation> freeRanges;
std::mutex lock; std::mutex lock;
void *mappedPointer; void *mappedPointer;
@@ -118,9 +118,9 @@ class Allocator
public: public:
Allocator(PGraphics graphics); Allocator(PGraphics graphics);
~Allocator(); ~Allocator();
PSubAllocation allocate(const VkMemoryRequirements2 &requirements, VkMemoryPropertyFlags props, OSubAllocation allocate(const VkMemoryRequirements2 &requirements, VkMemoryPropertyFlags props,
VkMemoryDedicatedAllocateInfo *dedicatedInfo = nullptr); VkMemoryDedicatedAllocateInfo *dedicatedInfo = nullptr);
inline PSubAllocation allocate(const VkMemoryRequirements2 &requirements, VkMemoryPropertyFlags props, OSubAllocation allocate(const VkMemoryRequirements2 &requirements, VkMemoryPropertyFlags props,
VkBuffer buffer) VkBuffer buffer)
{ {
VkMemoryDedicatedAllocateInfo allocInfo; VkMemoryDedicatedAllocateInfo allocInfo;
@@ -130,7 +130,7 @@ public:
allocInfo.image = VK_NULL_HANDLE; allocInfo.image = VK_NULL_HANDLE;
return allocate(requirements, props, &allocInfo); return allocate(requirements, props, &allocInfo);
} }
inline PSubAllocation allocate(const VkMemoryRequirements2 &requirements, VkMemoryPropertyFlags props, OSubAllocation allocate(const VkMemoryRequirements2 &requirements, VkMemoryPropertyFlags props,
VkImage image) VkImage image)
{ {
VkMemoryDedicatedAllocateInfo allocInfo; VkMemoryDedicatedAllocateInfo allocInfo;
+48 -48
View File
@@ -12,9 +12,9 @@ struct PendingBuffer
bool bWriteOnly; bool bWriteOnly;
}; };
static std::map<Vulkan::ShaderBuffer *, PendingBuffer> pendingBuffers; static std::map<Vulkan::Buffer*, PendingBuffer> pendingBuffers;
ShaderBuffer::ShaderBuffer(PGraphics graphics, uint64 size, VkBufferUsageFlags usage, Gfx::QueueType& queueType, bool bDynamic) Buffer::Buffer(PGraphics graphics, uint64 size, VkBufferUsageFlags usage, Gfx::QueueType& queueType, bool bDynamic)
: graphics(graphics) : graphics(graphics)
, currentBuffer(0) , currentBuffer(0)
, size(size) , size(size)
@@ -57,7 +57,7 @@ ShaderBuffer::ShaderBuffer(PGraphics graphics, uint64 size, VkBufferUsageFlags u
} }
} }
ShaderBuffer::~ShaderBuffer() Buffer::~Buffer()
{ {
//PCmdBuffer cmdBuffer = graphics->getQueueCommands(owner)->getCommands(); //PCmdBuffer cmdBuffer = graphics->getQueueCommands(owner)->getCommands();
//VkDevice device = graphics->getDevice(); //VkDevice device = graphics->getDevice();
@@ -75,12 +75,12 @@ ShaderBuffer::~ShaderBuffer()
graphics = nullptr; graphics = nullptr;
} }
VkDeviceSize ShaderBuffer::getOffset() const VkDeviceSize Buffer::getOffset() const
{ {
return buffers[currentBuffer].allocation->getOffset(); return buffers[currentBuffer].allocation->getOffset();
} }
void ShaderBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner) void Buffer::executeOwnershipBarrier(Gfx::QueueType newOwner)
{ {
VkBufferMemoryBarrier barrier = VkBufferMemoryBarrier barrier =
init::BufferMemoryBarrier(); init::BufferMemoryBarrier();
@@ -146,7 +146,7 @@ void ShaderBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner)
sourceManager->submitCommands(); sourceManager->submitCommands();
} }
void ShaderBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage, void Buffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage) VkAccessFlags dstAccess, VkPipelineStageFlags dstStage)
{ {
PCmdBuffer commandBuffer = graphics->getQueueCommands(owner)->getCommands(); PCmdBuffer commandBuffer = graphics->getQueueCommands(owner)->getCommands();
@@ -166,12 +166,12 @@ void ShaderBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineSta
vkCmdPipelineBarrier(commandBuffer->getHandle(), srcStage, dstStage, 0, 0, nullptr, numBuffers, dynamicBarriers, 0, nullptr); vkCmdPipelineBarrier(commandBuffer->getHandle(), srcStage, dstStage, 0, 0, nullptr, numBuffers, dynamicBarriers, 0, nullptr);
} }
void *ShaderBuffer::lock(bool bWriteOnly) void * Buffer::lock(bool bWriteOnly)
{ {
return lockRegion(0, size, bWriteOnly); return lockRegion(0, size, bWriteOnly);
} }
void *ShaderBuffer::lockRegion(uint64 regionOffset, uint64 regionSize, bool bWriteOnly) void * Buffer::lockRegion(uint64 regionOffset, uint64 regionSize, bool bWriteOnly)
{ {
void *data = nullptr; void *data = nullptr;
@@ -243,7 +243,7 @@ void *ShaderBuffer::lockRegion(uint64 regionOffset, uint64 regionSize, bool bWri
return data; return data;
} }
void ShaderBuffer::unlock() void Buffer::unlock()
{ {
auto found = pendingBuffers.find(this); auto found = pendingBuffers.find(this);
if (found != pendingBuffers.end()) if (found != pendingBuffers.end())
@@ -270,18 +270,18 @@ void ShaderBuffer::unlock()
} }
UniformBuffer::UniformBuffer(PGraphics graphics, const UniformBufferCreateInfo &createInfo) UniformBuffer::UniformBuffer(PGraphics graphics, const UniformBufferCreateInfo &createInfo)
: Gfx::UniformBuffer(graphics->getFamilyMapping(), createInfo.resourceData) : Gfx::UniformBuffer(graphics->getFamilyMapping(), createInfo.sourceData)
, Vulkan::ShaderBuffer(graphics, createInfo.resourceData.size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, currentOwner, createInfo.bDynamic) , Vulkan::Buffer(graphics, createInfo.sourceData.size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, currentOwner, createInfo.bDynamic)
, dedicatedStagingBuffer(nullptr) , dedicatedStagingBuffer(nullptr)
{ {
if(createInfo.bDynamic) if(createInfo.bDynamic)
{ {
dedicatedStagingBuffer = graphics->getStagingManager()->allocateStagingBuffer(createInfo.resourceData.size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT); dedicatedStagingBuffer = graphics->getStagingManager()->allocateStagingBuffer(createInfo.sourceData.size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
} }
if (createInfo.resourceData.data != nullptr) if (createInfo.sourceData.data != nullptr)
{ {
void *data = lock(); void *data = lock();
std::memcpy(data, createInfo.resourceData.data, createInfo.resourceData.size); std::memcpy(data, createInfo.sourceData.data, createInfo.sourceData.size);
unlock(); unlock();
} }
} }
@@ -290,15 +290,15 @@ UniformBuffer::~UniformBuffer()
{ {
} }
bool UniformBuffer::updateContents(const BulkResourceData &resourceData) bool UniformBuffer::updateContents(const DataSource &sourceData)
{ {
if(!Gfx::UniformBuffer::updateContents(resourceData)) if(!Gfx::UniformBuffer::updateContents(sourceData))
{ {
// no update was performed, skip // no update was performed, skip
return false; return false;
} }
void* data = lock(); void* data = lock();
std::memcpy(data, resourceData.data, resourceData.size); std::memcpy(data, sourceData.data, sourceData.size);
unlock(); unlock();
return true; return true;
} }
@@ -308,7 +308,7 @@ void* UniformBuffer::lock(bool bWriteOnly)
{ {
return dedicatedStagingBuffer->getMappedPointer(); return dedicatedStagingBuffer->getMappedPointer();
} }
return ShaderBuffer::lock(bWriteOnly); return Vulkan::Buffer::lock(bWriteOnly);
} }
void UniformBuffer::unlock() void UniformBuffer::unlock()
@@ -321,13 +321,13 @@ void UniformBuffer::unlock()
VkBufferCopy region; VkBufferCopy region;
std::memset(&region, 0, sizeof(VkBufferCopy)); std::memset(&region, 0, sizeof(VkBufferCopy));
region.size = ShaderBuffer::size; region.size = Vulkan::Buffer::size;
vkCmdCopyBuffer(cmdHandle, dedicatedStagingBuffer->getHandle(), buffers[currentBuffer].buffer, 1, &region); vkCmdCopyBuffer(cmdHandle, dedicatedStagingBuffer->getHandle(), buffers[currentBuffer].buffer, 1, &region);
graphics->getQueueCommands(currentOwner)->submitCommands(); graphics->getQueueCommands(currentOwner)->submitCommands();
} }
else else
{ {
ShaderBuffer::unlock(); Vulkan::Buffer::unlock();
} }
} }
@@ -338,13 +338,13 @@ void UniformBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
void UniformBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner) void UniformBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner)
{ {
Vulkan::ShaderBuffer::executeOwnershipBarrier(newOwner); Vulkan::Buffer::executeOwnershipBarrier(newOwner);
} }
void UniformBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage, void UniformBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage) VkAccessFlags dstAccess, VkPipelineStageFlags dstStage)
{ {
Vulkan::ShaderBuffer::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage); Vulkan::Buffer::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
} }
VkAccessFlags UniformBuffer::getSourceAccessMask() VkAccessFlags UniformBuffer::getSourceAccessMask()
@@ -357,14 +357,14 @@ VkAccessFlags UniformBuffer::getDestAccessMask()
return VK_ACCESS_UNIFORM_READ_BIT; return VK_ACCESS_UNIFORM_READ_BIT;
} }
ShaderBuffer::ShaderBuffer(PGraphics graphics, const ShaderBufferCreateInfo &resourceData) ShaderBuffer::ShaderBuffer(PGraphics graphics, const ShaderBufferCreateInfo &sourceData)
: Gfx::ShaderBuffer(graphics->getFamilyMapping(), resourceData.stride, resourceData.resourceData.size / resourceData.stride, resourceData.resourceData) : Gfx::ShaderBuffer(graphics->getFamilyMapping(), sourceData.stride, sourceData.sourceData.size / sourceData.stride, sourceData.sourceData)
, Vulkan::ShaderBuffer(graphics, resourceData.resourceData.size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, currentOwner, resourceData.bDynamic) , Vulkan::Buffer(graphics, sourceData.sourceData.size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, currentOwner, sourceData.bDynamic)
{ {
if (resourceData.resourceData.data != nullptr) if (sourceData.sourceData.data != nullptr)
{ {
void *data = lock(); void *data = lock();
std::memcpy(data, resourceData.resourceData.data, resourceData.resourceData.size); std::memcpy(data, sourceData.sourceData.data, sourceData.sourceData.size);
unlock(); unlock();
} }
} }
@@ -373,13 +373,13 @@ ShaderBuffer::~ShaderBuffer()
{ {
} }
bool ShaderBuffer::updateContents(const BulkResourceData &resourceData) bool ShaderBuffer::updateContents(const DataSource &sourceData)
{ {
assert(resourceData.size <= getSize()); assert(sourceData.size <= getSize());
Gfx::ShaderBuffer::updateContents(resourceData); Gfx::ShaderBuffer::updateContents(sourceData);
//We always want to update, as the contents could be different on the GPU //We always want to update, as the contents could be different on the GPU
void* data = lock(); void* data = lock();
std::memcpy(data, resourceData.data, resourceData.size); std::memcpy(data, sourceData.data, sourceData.size);
unlock(); unlock();
return true; return true;
} }
@@ -402,13 +402,13 @@ void ShaderBuffer::unlock()
VkBufferCopy region; VkBufferCopy region;
std::memset(&region, 0, sizeof(VkBufferCopy)); std::memset(&region, 0, sizeof(VkBufferCopy));
region.size = ShaderBuffer::size; region.size = Vulkan::Buffer::size;
vkCmdCopyBuffer(cmdHandle, dedicatedStagingBuffer->getHandle(), buffers[currentBuffer].buffer, 1, &region); vkCmdCopyBuffer(cmdHandle, dedicatedStagingBuffer->getHandle(), buffers[currentBuffer].buffer, 1, &region);
graphics->getQueueCommands(currentOwner)->submitCommands(); graphics->getQueueCommands(currentOwner)->submitCommands();
} }
else else
{ {
ShaderBuffer::unlock(); Vulkan::Buffer::unlock();
} }
} }
@@ -438,14 +438,14 @@ VkAccessFlags ShaderBuffer::getDestAccessMask()
return VK_ACCESS_MEMORY_READ_BIT; return VK_ACCESS_MEMORY_READ_BIT;
} }
VertexBuffer::VertexBuffer(PGraphics graphics, const VertexBufferCreateInfo &resourceData) VertexBuffer::VertexBuffer(PGraphics graphics, const VertexBufferCreateInfo &sourceData)
: Gfx::VertexBuffer(graphics->getFamilyMapping(), resourceData.numVertices, resourceData.vertexSize, resourceData.resourceData.owner) : Gfx::VertexBuffer(graphics->getFamilyMapping(), sourceData.numVertices, sourceData.vertexSize, sourceData.sourceData.owner)
, Vulkan::ShaderBuffer(graphics, resourceData.resourceData.size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, currentOwner) , Vulkan::Buffer(graphics, sourceData.sourceData.size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, currentOwner)
{ {
if (resourceData.resourceData.data != nullptr) if (sourceData.sourceData.data != nullptr)
{ {
void *data = lock(); void *data = lock();
std::memcpy(data, resourceData.resourceData.data, resourceData.resourceData.size); std::memcpy(data, sourceData.sourceData.data, sourceData.sourceData.size);
unlock(); unlock();
} }
} }
@@ -454,7 +454,7 @@ VertexBuffer::~VertexBuffer()
{ {
} }
void VertexBuffer::updateRegion(BulkResourceData update) void VertexBuffer::updateRegion(DataSource update)
{ {
void* data = lockRegion(update.offset, update.size); void* data = lockRegion(update.offset, update.size);
std::memcpy(data, update.data, update.size); std::memcpy(data, update.data, update.size);
@@ -476,13 +476,13 @@ void VertexBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
void VertexBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner) void VertexBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner)
{ {
Vulkan::ShaderBuffer::executeOwnershipBarrier(newOwner); Vulkan::Buffer::executeOwnershipBarrier(newOwner);
} }
void VertexBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage, void VertexBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage) VkAccessFlags dstAccess, VkPipelineStageFlags dstStage)
{ {
Vulkan::ShaderBuffer::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage); Vulkan::Buffer::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
} }
VkAccessFlags VertexBuffer::getSourceAccessMask() VkAccessFlags VertexBuffer::getSourceAccessMask()
@@ -495,14 +495,14 @@ VkAccessFlags VertexBuffer::getDestAccessMask()
return VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; return VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
} }
IndexBuffer::IndexBuffer(PGraphics graphics, const IndexBufferCreateInfo &resourceData) IndexBuffer::IndexBuffer(PGraphics graphics, const IndexBufferCreateInfo &sourceData)
: Gfx::IndexBuffer(graphics->getFamilyMapping(), resourceData.resourceData.size, resourceData.indexType, resourceData.resourceData.owner) : Gfx::IndexBuffer(graphics->getFamilyMapping(), sourceData.sourceData.size, sourceData.indexType, sourceData.sourceData.owner)
, Vulkan::ShaderBuffer(graphics, resourceData.resourceData.size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, currentOwner) , Vulkan::Buffer(graphics, sourceData.sourceData.size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, currentOwner)
{ {
if (resourceData.resourceData.data != nullptr) if (sourceData.sourceData.data != nullptr)
{ {
void *data = lock(); void *data = lock();
std::memcpy(data, resourceData.resourceData.data, resourceData.resourceData.size); std::memcpy(data, sourceData.sourceData.data, sourceData.sourceData.size);
unlock(); unlock();
} }
} }
@@ -526,13 +526,13 @@ void IndexBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
void IndexBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner) void IndexBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner)
{ {
Vulkan::ShaderBuffer::executeOwnershipBarrier(newOwner); Vulkan::Buffer::executeOwnershipBarrier(newOwner);
} }
void IndexBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage, void IndexBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage) VkAccessFlags dstAccess, VkPipelineStageFlags dstStage)
{ {
Vulkan::ShaderBuffer::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage); Vulkan::Buffer::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
} }
VkAccessFlags IndexBuffer::getSourceAccessMask() VkAccessFlags IndexBuffer::getSourceAccessMask()
+15 -15
View File
@@ -8,11 +8,11 @@ namespace Seele
namespace Vulkan namespace Vulkan
{ {
class ShaderBuffer class Buffer
{ {
public: public:
ShaderBuffer(PGraphics graphics, uint64 size, VkBufferUsageFlags usage, Gfx::QueueType& queueType, bool bDynamic = false); Buffer(PGraphics graphics, uint64 size, VkBufferUsageFlags usage, Gfx::QueueType& queueType, bool bDynamic = false);
virtual ~ShaderBuffer(); virtual ~Buffer();
VkBuffer getHandle() const VkBuffer getHandle() const
{ {
return buffers[currentBuffer].buffer; return buffers[currentBuffer].buffer;
@@ -52,15 +52,15 @@ protected:
virtual VkAccessFlags getSourceAccessMask() = 0; virtual VkAccessFlags getSourceAccessMask() = 0;
virtual VkAccessFlags getDestAccessMask() = 0; virtual VkAccessFlags getDestAccessMask() = 0;
}; };
DEFINE_REF(ShaderBuffer) DEFINE_REF(Buffer)
DECLARE_REF(StagingBuffer) DECLARE_REF(StagingBuffer)
class UniformBuffer : public Gfx::UniformBuffer, public ShaderBuffer class UniformBuffer : public Gfx::UniformBuffer, public Buffer
{ {
public: public:
UniformBuffer(PGraphics graphics, const UniformBufferCreateInfo &resourceData); UniformBuffer(PGraphics graphics, const UniformBufferCreateInfo &sourceData);
virtual ~UniformBuffer(); virtual ~UniformBuffer();
virtual bool updateContents(const BulkResourceData &resourceData); virtual bool updateContents(const DataSource &sourceData);
virtual void* lock(bool bWriteOnly = true) override; virtual void* lock(bool bWriteOnly = true) override;
virtual void unlock() override; virtual void unlock() override;
@@ -79,12 +79,12 @@ private:
}; };
DEFINE_REF(UniformBuffer) DEFINE_REF(UniformBuffer)
class ShaderBuffer : public Gfx::ShaderBuffer, public ShaderBuffer class ShaderBuffer : public Gfx::ShaderBuffer, public Buffer
{ {
public: public:
ShaderBuffer(PGraphics graphics, const ShaderBufferCreateInfo &resourceData); ShaderBuffer(PGraphics graphics, const ShaderBufferCreateInfo &sourceData);
virtual ~ShaderBuffer(); virtual ~ShaderBuffer();
virtual bool updateContents(const BulkResourceData &resourceData); virtual bool updateContents(const DataSource &sourceData);
virtual void* lock(bool bWriteOnly = true) override; virtual void* lock(bool bWriteOnly = true) override;
virtual void unlock() override; virtual void unlock() override;
@@ -102,13 +102,13 @@ private:
}; };
DEFINE_REF(ShaderBuffer) DEFINE_REF(ShaderBuffer)
class VertexBuffer : public Gfx::VertexBuffer, public ShaderBuffer class VertexBuffer : public Gfx::VertexBuffer, public Buffer
{ {
public: public:
VertexBuffer(PGraphics graphics, const VertexBufferCreateInfo &resourceData); VertexBuffer(PGraphics graphics, const VertexBufferCreateInfo &sourceData);
virtual ~VertexBuffer(); virtual ~VertexBuffer();
virtual void updateRegion(BulkResourceData update) override; virtual void updateRegion(DataSource update) override;
virtual void download(Array<uint8>& buffer) override; virtual void download(Array<uint8>& buffer) override;
protected: protected:
// Inherited via Vulkan::Buffer // Inherited via Vulkan::Buffer
@@ -122,10 +122,10 @@ protected:
}; };
DEFINE_REF(VertexBuffer) DEFINE_REF(VertexBuffer)
class IndexBuffer : public Gfx::IndexBuffer, public ShaderBuffer class IndexBuffer : public Gfx::IndexBuffer, public Buffer
{ {
public: public:
IndexBuffer(PGraphics graphics, const IndexBufferCreateInfo &resourceData); IndexBuffer(PGraphics graphics, const IndexBufferCreateInfo &sourceData);
virtual ~IndexBuffer(); virtual ~IndexBuffer();
virtual void download(Array<uint8>& buffer) override; virtual void download(Array<uint8>& buffer) override;
+16 -12
View File
@@ -7,6 +7,7 @@
#include "RenderPass.h" #include "RenderPass.h"
#include "Pipeline.h" #include "Pipeline.h"
#include "DescriptorSets.h" #include "DescriptorSets.h"
#include "RenderTarget.h"
using namespace Seele; using namespace Seele;
using namespace Seele::Vulkan; using namespace Seele::Vulkan;
@@ -277,16 +278,16 @@ void RenderCommand::bindDescriptor(const Array<Gfx::PDescriptorSet>& descriptorS
vkCmdBindDescriptorSets(handle, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->getLayout(), 0, (uint32)descriptorSets.size(), sets, 0, nullptr); vkCmdBindDescriptorSets(handle, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->getLayout(), 0, (uint32)descriptorSets.size(), sets, 0, nullptr);
delete[] sets; delete[] sets;
} }
void RenderCommand::bindVertexBuffer(const Array<VertexInputStream>& streams) void RenderCommand::bindVertexBuffer(const Array<Gfx::PVertexBuffer>& streams)
{ {
assert(threadId == std::this_thread::get_id()); assert(threadId == std::this_thread::get_id());
Array<VkBuffer> buffers(streams.size()); Array<VkBuffer> buffers(streams.size());
Array<VkDeviceSize> offsets(streams.size()); Array<VkDeviceSize> offsets(streams.size());
for(uint32 i = 0; i < streams.size(); ++i) for(uint32 i = 0; i < streams.size(); ++i)
{ {
PVertexBuffer buf = streams[i].vertexBuffer.cast<VertexBuffer>(); PVertexBuffer buf = streams[i].cast<VertexBuffer>();
buffers[i] = buf->getHandle(); buffers[i] = buf->getHandle();
offsets[i] = streams[i].offset; offsets[i] = 0;
}; };
vkCmdBindVertexBuffers(handle, 0, (uint32)streams.size(), buffers.data(), offsets.data()); vkCmdBindVertexBuffers(handle, 0, (uint32)streams.size(), buffers.data(), offsets.data());
} }
@@ -424,10 +425,13 @@ CommandBufferManager::CommandBufferManager(PGraphics graphics, PQueue queue)
VK_CHECK(vkCreateCommandPool(graphics->getDevice(), &info, nullptr, &commandPool)); VK_CHECK(vkCreateCommandPool(graphics->getDevice(), &info, nullptr, &commandPool));
activeCmdBuffer = new CmdBuffer(graphics, commandPool, this); {
activeCmdBuffer->begin();
std::scoped_lock lock(allocatedBufferLock); std::scoped_lock lock(allocatedBufferLock);
allocatedBuffers.add(activeCmdBuffer); allocatedBuffers.add(new CmdBuffer(graphics, commandPool, this));
}
activeCmdBuffer = allocatedBuffers.back();
activeCmdBuffer->begin();
} }
CommandBufferManager::~CommandBufferManager() CommandBufferManager::~CommandBufferManager()
@@ -455,10 +459,10 @@ PRenderCommand CommandBufferManager::createRenderCommand(PRenderPass renderPass,
return cmdBuffer; return cmdBuffer;
} }
} }
PRenderCommand result = new RenderCommand(graphics, commandPool); allocatedRenderCommands.add(new RenderCommand(graphics, commandPool));
PRenderCommand result = allocatedRenderCommands.back();
result->name = name; result->name = name;
result->begin(renderPass, framebuffer); result->begin(renderPass, framebuffer);
allocatedRenderCommands.add(result);
return result; return result;
} }
@@ -475,10 +479,10 @@ PComputeCommand CommandBufferManager::createComputeCommand(const std::string& na
return cmdBuffer; return cmdBuffer;
} }
} }
PComputeCommand result = new ComputeCommand(graphics, commandPool); allocatedComputeCommands.add(new ComputeCommand(graphics, commandPool));
PComputeCommand result = allocatedComputeCommands.back();
result->name = name; result->name = name;
result->begin(activeCmdBuffer); result->begin(activeCmdBuffer);
allocatedComputeCommands.add(result);
return result; return result;
} }
@@ -517,7 +521,7 @@ void CommandBufferManager::submitCommands(PSemaphore signalSemaphore)
assert(cmdBuffer->state == CmdBuffer::State::Submitted); assert(cmdBuffer->state == CmdBuffer::State::Submitted);
} }
} }
activeCmdBuffer = new CmdBuffer(graphics, commandPool, this); allocatedBuffers.add(new CmdBuffer(graphics, commandPool, this));
allocatedBuffers.add(activeCmdBuffer); activeCmdBuffer = allocatedBuffers.back();
activeCmdBuffer->begin(); activeCmdBuffer->begin();
} }
+7 -11
View File
@@ -33,10 +33,6 @@ public:
void addWaitSemaphore(VkPipelineStageFlags stages, PSemaphore waitSemaphore); void addWaitSemaphore(VkPipelineStageFlags stages, PSemaphore waitSemaphore);
void refreshFence(); void refreshFence();
void waitForCommand(uint32 timeToWait = 1000000u); void waitForCommand(uint32 timeToWait = 1000000u);
Fence* operator co_await()
{
return fence.getHandle();
}
PFence getFence(); PFence getFence();
PCommandBufferManager getManager(); PCommandBufferManager getManager();
enum State enum State
@@ -51,7 +47,7 @@ public:
private: private:
PGraphics graphics; PGraphics graphics;
PCommandBufferManager manager; PCommandBufferManager manager;
PFence fence; OFence fence;
State state; State state;
VkViewport currentViewport; VkViewport currentViewport;
VkRect2D currentScissor; VkRect2D currentScissor;
@@ -62,7 +58,7 @@ private:
Array<VkPipelineStageFlags> waitFlags; Array<VkPipelineStageFlags> waitFlags;
Array<PRenderCommand> executingRenders; Array<PRenderCommand> executingRenders;
Array<PComputeCommand> executingComputes; Array<PComputeCommand> executingComputes;
Array<DescriptorSet*> boundDescriptors; Array<PDescriptorSet> boundDescriptors;
friend class RenderCommand; friend class RenderCommand;
friend class CommandBufferManager; friend class CommandBufferManager;
friend class Queue; friend class Queue;
@@ -88,7 +84,7 @@ public:
virtual void bindPipeline(Gfx::PGraphicsPipeline pipeline) override; virtual void bindPipeline(Gfx::PGraphicsPipeline pipeline) override;
virtual void bindDescriptor(Gfx::PDescriptorSet descriptorSet) override; virtual void bindDescriptor(Gfx::PDescriptorSet descriptorSet) override;
virtual void bindDescriptor(const Array<Gfx::PDescriptorSet>& descriptorSets) override; virtual void bindDescriptor(const Array<Gfx::PDescriptorSet>& descriptorSets) override;
virtual void bindVertexBuffer(const Array<PVertexBuffer>& buffers) override; virtual void bindVertexBuffer(const Array<Gfx::PVertexBuffer>& buffers) override;
virtual void bindIndexBuffer(Gfx::PIndexBuffer indexBuffer) override; virtual void bindIndexBuffer(Gfx::PIndexBuffer indexBuffer) override;
virtual void pushConstants(Gfx::PPipelineLayout layout, Gfx::SeShaderStageFlags stage, uint32 offset, uint32 size, const void* data) override; virtual void pushConstants(Gfx::PPipelineLayout layout, Gfx::SeShaderStageFlags stage, uint32 offset, uint32 size, const void* data) override;
virtual void draw(uint32 vertexCount, uint32 instanceCount, int32 firstVertex, uint32 firstInstance) override; virtual void draw(uint32 vertexCount, uint32 instanceCount, int32 firstVertex, uint32 firstInstance) override;
@@ -96,7 +92,7 @@ public:
private: private:
PGraphicsPipeline pipeline; PGraphicsPipeline pipeline;
bool ready; bool ready;
Array<DescriptorSet*> boundDescriptors; Array<PDescriptorSet> boundDescriptors;
VkViewport currentViewport; VkViewport currentViewport;
VkRect2D currentScissor; VkRect2D currentScissor;
PGraphics graphics; PGraphics graphics;
@@ -163,11 +159,11 @@ private:
uint32 queueFamilyIndex; uint32 queueFamilyIndex;
PCmdBuffer activeCmdBuffer; PCmdBuffer activeCmdBuffer;
std::mutex allocatedBufferLock; std::mutex allocatedBufferLock;
Array<PCmdBuffer> allocatedBuffers; Array<OCmdBuffer> allocatedBuffers;
std::mutex allocatedRenderLock; std::mutex allocatedRenderLock;
std::mutex allocatedComputeLock; std::mutex allocatedComputeLock;
Array<PRenderCommand> allocatedRenderCommands; Array<ORenderCommand> allocatedRenderCommands;
Array<PComputeCommand> allocatedComputeCommands; Array<OComputeCommand> allocatedComputeCommands;
}; };
DEFINE_REF(CommandBufferManager) DEFINE_REF(CommandBufferManager)
} // namespace Vulkan } // namespace Vulkan
@@ -312,7 +312,7 @@ DescriptorAllocator::~DescriptorAllocator()
} }
} }
void DescriptorAllocator::allocateDescriptorSet(Gfx::PDescriptorSet &descriptorSet) Gfx::PDescriptorSet DescriptorAllocator::allocateDescriptorSet()
{ {
VkDescriptorSetLayout layoutHandle = layout.getHandle(); VkDescriptorSetLayout layoutHandle = layout.getHandle();
VkDescriptorSetAllocateInfo allocInfo = VkDescriptorSetAllocateInfo allocInfo =
+2 -2
View File
@@ -131,7 +131,7 @@ class DescriptorAllocator : public Gfx::DescriptorAllocator
public: public:
DescriptorAllocator(PGraphics graphics, DescriptorLayout &layout); DescriptorAllocator(PGraphics graphics, DescriptorLayout &layout);
virtual ~DescriptorAllocator(); virtual ~DescriptorAllocator();
virtual void allocateDescriptorSet(Gfx::PDescriptorSet &descriptorSet); virtual Gfx::PDescriptorSet allocateDescriptorSet() override;
virtual void reset(); virtual void reset();
inline VkDescriptorPool getHandle() const inline VkDescriptorPool getHandle() const
@@ -147,7 +147,7 @@ private:
PGraphics graphics; PGraphics graphics;
DescriptorLayout &layout; DescriptorLayout &layout;
const static int maxSets = 64; const static int maxSets = 64;
StaticArray<PDescriptorSet, maxSets> cachedHandles; StaticArray<ODescriptorSet, maxSets> cachedHandles;
VkDescriptorPool poolHandle; VkDescriptorPool poolHandle;
DescriptorAllocator* nextAlloc = nullptr; DescriptorAllocator* nextAlloc = nullptr;
}; };
+42 -44
View File
@@ -1,24 +1,22 @@
#include "Containers/Array.h" #include "Containers/Array.h"
#include "VulkanGraphics.h" #include "Graphics.h"
#include "VulkanAllocator.h" #include "Allocator.h"
#include "VulkanQueue.h" #include "Buffer.h"
#include "VulkanInitializer.h" #include "PipelineCache.h"
#include "VulkanCommandBuffer.h" #include "CommandBuffer.h"
#include "VulkanRenderPass.h" #include "Initializer.h"
#include "VulkanFramebuffer.h" #include "RenderTarget.h"
#include "VulkanPipelineCache.h" #include "RenderPass.h"
#include "VulkanDescriptorSets.h" #include "Framebuffer.h"
#include "VulkanShader.h"
#include "Graphics/GraphicsResources.h"
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
using namespace Seele; using namespace Seele;
using namespace Seele::Vulkan; using namespace Seele::Vulkan;
thread_local PCommandBufferManager Seele::Vulkan::Graphics::graphicsCommands = nullptr; thread_local OCommandBufferManager Seele::Vulkan::Graphics::graphicsCommands = nullptr;
thread_local PCommandBufferManager Seele::Vulkan::Graphics::computeCommands = nullptr; thread_local OCommandBufferManager Seele::Vulkan::Graphics::computeCommands = nullptr;
thread_local PCommandBufferManager Seele::Vulkan::Graphics::transferCommands = nullptr; thread_local OCommandBufferManager Seele::Vulkan::Graphics::transferCommands = nullptr;
thread_local PCommandBufferManager Seele::Vulkan::Graphics::dedicatedTransferCommands = nullptr; thread_local OCommandBufferManager Seele::Vulkan::Graphics::dedicatedTransferCommands = nullptr;
Graphics::Graphics() Graphics::Graphics()
: instance(VK_NULL_HANDLE) : instance(VK_NULL_HANDLE)
@@ -49,22 +47,22 @@ void Graphics::init(GraphicsInitializer initInfo)
pipelineCache = new PipelineCache(this, "pipeline.cache"); pipelineCache = new PipelineCache(this, "pipeline.cache");
} }
Gfx::PWindow Graphics::createWindow(const WindowCreateInfo &createInfo) Gfx::OWindow Graphics::createWindow(const WindowCreateInfo &createInfo)
{ {
PWindow result = new Window(this, createInfo); OWindow result = new Window(this, createInfo);
return result; return result;
} }
Gfx::PViewport Graphics::createViewport(Gfx::PWindow owner, const ViewportCreateInfo &viewportInfo) Gfx::OViewport Graphics::createViewport(Gfx::PWindow owner, const ViewportCreateInfo &viewportInfo)
{ {
PViewport result = new Viewport(this, owner, viewportInfo); OViewport result = new Viewport(this, owner, viewportInfo);
std::scoped_lock lock(viewportLock); std::scoped_lock lock(viewportLock);
viewports.add(result); viewports.add(result);
return result; return result;
} }
Gfx::PRenderPass Graphics::createRenderPass(Gfx::PRenderTargetLayout layout, Gfx::PViewport renderArea) Gfx::ORenderPass Graphics::createRenderPass(Gfx::ORenderTargetLayout layout, Gfx::PViewport renderArea)
{ {
PRenderPass result = new RenderPass(this, layout, renderArea); ORenderPass result = new RenderPass(this, std::move(layout), renderArea);
return result; return result;
} }
void Graphics::beginRenderPass(Gfx::PRenderPass renderPass) void Graphics::beginRenderPass(Gfx::PRenderPass renderPass)
@@ -77,12 +75,12 @@ void Graphics::beginRenderPass(Gfx::PRenderPass renderPass)
auto found = allocatedFramebuffers.find(framebufferHash); auto found = allocatedFramebuffers.find(framebufferHash);
if (found == allocatedFramebuffers.end()) if (found == allocatedFramebuffers.end())
{ {
framebuffer = new Framebuffer(this, rp, rp->getLayout()); allocatedFramebuffers[framebufferHash] = new Framebuffer(this, rp, rp->getLayout());
allocatedFramebuffers[framebufferHash] = framebuffer; framebuffer = allocatedFramebuffers[framebufferHash];
} }
else else
{ {
framebuffer = found->value; framebuffer = std::move(found->value);
} }
} }
getGraphicsCommands()->getCommands()->beginRenderPass(rp, framebuffer); getGraphicsCommands()->getCommands()->beginRenderPass(rp, framebuffer);
@@ -110,67 +108,67 @@ void Graphics::executeCommands(const Array<Gfx::PComputeCommand>& commands)
getComputeCommands()->getCommands()->executeCommands(commands); getComputeCommands()->getCommands()->executeCommands(commands);
} }
Gfx::PTexture2D Graphics::createTexture2D(const TextureCreateInfo &createInfo) Gfx::OTexture2D Graphics::createTexture2D(const TextureCreateInfo &createInfo)
{ {
PTexture2D result = new Texture2D(this, createInfo); OTexture2D result = new Texture2D(this, createInfo);
return result; return result;
} }
Gfx::PTexture3D Graphics::createTexture3D(const TextureCreateInfo &createInfo) Gfx::OTexture3D Graphics::createTexture3D(const TextureCreateInfo &createInfo)
{ {
PTexture3D result = new Texture3D(this, createInfo); OTexture3D result = new Texture3D(this, createInfo);
return result; return result;
} }
Gfx::PTextureCube Graphics::createTextureCube(const TextureCreateInfo &createInfo) Gfx::OTextureCube Graphics::createTextureCube(const TextureCreateInfo &createInfo)
{ {
PTextureCube result = new TextureCube(this, createInfo); OTextureCube result = new TextureCube(this, createInfo);
return result; return result;
} }
Gfx::PUniformBuffer Graphics::createUniformBuffer(const UniformBufferCreateInfo &bulkData) Gfx::OUniformBuffer Graphics::createUniformBuffer(const UniformBufferCreateInfo &bulkData)
{ {
PUniformBuffer uniformBuffer = new UniformBuffer(this, bulkData); OUniformBuffer uniformBuffer = new UniformBuffer(this, bulkData);
return uniformBuffer; return uniformBuffer;
} }
Gfx::PShaderBuffer Graphics::createShaderBuffer(const ShaderBufferCreateInfo &bulkData) Gfx::OShaderBuffer Graphics::createShaderBuffer(const ShaderBufferCreateInfo &bulkData)
{ {
PShaderBuffer ShaderBuffer = new ShaderBuffer(this, bulkData); OShaderBuffer ShaderBuffer = new ShaderBuffer(this, bulkData);
return ShaderBuffer; return ShaderBuffer;
} }
Gfx::PVertexBuffer Graphics::createVertexBuffer(const VertexBufferCreateInfo &bulkData) Gfx::OVertexBuffer Graphics::createVertexBuffer(const VertexBufferCreateInfo &bulkData)
{ {
PVertexBuffer vertexBuffer = new VertexBuffer(this, bulkData); OVertexBuffer vertexBuffer = new VertexBuffer(this, bulkData);
return vertexBuffer; return vertexBuffer;
} }
Gfx::PIndexBuffer Graphics::createIndexBuffer(const IndexBufferCreateInfo &bulkData) Gfx::OIndexBuffer Graphics::createIndexBuffer(const IndexBufferCreateInfo &bulkData)
{ {
PIndexBuffer indexBuffer = new IndexBuffer(this, bulkData); OIndexBuffer indexBuffer = new IndexBuffer(this, bulkData);
return indexBuffer; return indexBuffer;
} }
Gfx::PRenderCommand Graphics::createRenderCommand(const std::string& name) Gfx::PRenderCommand Graphics::createRenderCommand(const std::string& name)
{ {
PRenderCommand cmdBuffer = getGraphicsCommands()->createRenderCommand(activeRenderPass, activeFramebuffer, name); ORenderCommand cmdBuffer = getGraphicsCommands()->createRenderCommand(activeRenderPass, activeFramebuffer, name);
return cmdBuffer; return cmdBuffer;
} }
Gfx::PComputeCommand Graphics::createComputeCommand(const std::string& name) Gfx::PComputeCommand Graphics::createComputeCommand(const std::string& name)
{ {
PComputeCommand cmdBuffer = getComputeCommands()->createComputeCommand(name); OComputeCommand cmdBuffer = getComputeCommands()->createComputeCommand(name);
return cmdBuffer; return cmdBuffer;
} }
Gfx::PVertexDeclaration Graphics::createVertexDeclaration(const Array<Gfx::VertexElement>& element) Gfx::OVertexDeclaration Graphics::createVertexDeclaration(const Array<Gfx::VertexElement>& element)
{ {
PVertexDeclaration declaration = new VertexDeclaration(element); OVertexDeclaration declaration = new VertexDeclaration(element);
return declaration; return declaration;
} }
Gfx::PVertexShader Graphics::createVertexShader(const ShaderCreateInfo& createInfo) Gfx::OVertexShader Graphics::createVertexShader(const ShaderCreateInfo& createInfo)
{ {
PVertexShader shader = new VertexShader(this); OVertexShader shader = new VertexShader(this);
shader->create(createInfo); shader->create(createInfo);
return shader; return shader;
} }
+35 -33
View File
@@ -37,38 +37,40 @@ public:
// Inherited via Graphics // Inherited via Graphics
virtual void init(GraphicsInitializer initializer) override; virtual void init(GraphicsInitializer initializer) override;
virtual Gfx::PWindow createWindow(const WindowCreateInfo &createInfo) override; virtual Gfx::OWindow createWindow(const WindowCreateInfo &createInfo) override;
virtual Gfx::PViewport createViewport(Gfx::PWindow owner, const ViewportCreateInfo &createInfo) override; virtual Gfx::OViewport createViewport(Gfx::PWindow owner, const ViewportCreateInfo &createInfo) override;
virtual Gfx::PRenderPass createRenderPass(Gfx::PRenderTargetLayout layout, Gfx::PViewport renderArea) override; virtual Gfx::ORenderPass createRenderPass(Gfx::ORenderTargetLayout layout, Gfx::PViewport renderArea) override;
virtual void beginRenderPass(Gfx::PRenderPass renderPass) override; virtual void beginRenderPass(Gfx::PRenderPass renderPass) override;
virtual void endRenderPass() override; virtual void endRenderPass() override;
virtual void executeCommands(const Array<Gfx::PRenderCommand>& commands) override; virtual void executeCommands(const Array<Gfx::PRenderCommand>& commands) override;
virtual void executeCommands(const Array<Gfx::PComputeCommand>& commands) override; virtual void executeCommands(const Array<Gfx::PComputeCommand>& commands) override;
virtual Gfx::PTexture2D createTexture2D(const TextureCreateInfo &createInfo) override; virtual Gfx::OTexture2D createTexture2D(const TextureCreateInfo &createInfo) override;
virtual Gfx::PTexture3D createTexture3D(const TextureCreateInfo &createInfo) override; virtual Gfx::OTexture3D createTexture3D(const TextureCreateInfo &createInfo) override;
virtual Gfx::PTextureCube createTextureCube(const TextureCreateInfo &createInfo) override; virtual Gfx::OTextureCube createTextureCube(const TextureCreateInfo &createInfo) override;
virtual Gfx::PUniformBuffer createUniformBuffer(const UniformBufferCreateInfo &bulkData) override; virtual Gfx::OUniformBuffer createUniformBuffer(const UniformBufferCreateInfo &bulkData) override;
virtual Gfx::PShaderBuffer createShaderBuffer(const ShaderBufferCreateInfo &bulkData) override; virtual Gfx::OShaderBuffer createShaderBuffer(const ShaderBufferCreateInfo &bulkData) override;
virtual Gfx::PVertexBuffer createVertexBuffer(const VertexBufferCreateInfo &bulkData) override; virtual Gfx::OVertexBuffer createVertexBuffer(const VertexBufferCreateInfo &bulkData) override;
virtual Gfx::PIndexBuffer createIndexBuffer(const IndexBufferCreateInfo &bulkData) override; virtual Gfx::OIndexBuffer createIndexBuffer(const IndexBufferCreateInfo &bulkData) override;
virtual Gfx::PRenderCommand createRenderCommand(const std::string& name) override; virtual Gfx::PRenderCommand createRenderCommand(const std::string& name) override;
virtual Gfx::PComputeCommand createComputeCommand(const std::string& name) override; virtual Gfx::PComputeCommand createComputeCommand(const std::string& name) override;
virtual Gfx::PVertexDeclaration createVertexDeclaration(const Array<Gfx::VertexElement>& element) override;
virtual Gfx::PVertexShader createVertexShader(const ShaderCreateInfo& createInfo) override;
virtual Gfx::PFragmentShader createFragmentShader(const ShaderCreateInfo& createInfo) override;
virtual Gfx::PComputeShader createComputeShader(const ShaderCreateInfo& createInfo) override;
virtual Gfx::PTaskShader createTaskShader(const ShaderCreateInfo& createInfo) override;
virtual Gfx::PMeshShader createMeshShader(const ShaderCreateInfo& createInfo) override;
virtual Gfx::PGraphicsPipeline createGraphicsPipeline(const Gfx::LegacyPipelineCreateInfo& createInfo) override;
virtual Gfx::PGraphicsPipeline createGraphicsPipeline(const Gfx::MeshPipelineCreateInfo& createInfo) override;
virtual Gfx::PComputePipeline createComputePipeline(const Gfx::ComputePipelineCreateInfo& createInfo) override;
virtual Gfx::PSamplerState createSamplerState(const SamplerCreateInfo& createInfo) override;
virtual Gfx::PDescriptorLayout createDescriptorLayout(const std::string& name = "") override; virtual Gfx::OVertexDeclaration createVertexDeclaration(const Array<Gfx::VertexElement>& element) override;
virtual Gfx::PPipelineLayout createPipelineLayout(Gfx::PPipelineLayout baseLayout = nullptr) override; virtual Gfx::OVertexShader createVertexShader(const ShaderCreateInfo& createInfo) override;
virtual Gfx::OFragmentShader createFragmentShader(const ShaderCreateInfo& createInfo) override;
virtual Gfx::OComputeShader createComputeShader(const ShaderCreateInfo& createInfo) override;
virtual Gfx::OTaskShader createTaskShader(const ShaderCreateInfo& createInfo) override;
virtual Gfx::OMeshShader createMeshShader(const ShaderCreateInfo& createInfo) override;
virtual Gfx::OGraphicsPipeline createGraphicsPipeline(const Gfx::LegacyPipelineCreateInfo& createInfo) override;
virtual Gfx::OGraphicsPipeline createGraphicsPipeline(const Gfx::MeshPipelineCreateInfo& createInfo) override;
virtual Gfx::OComputePipeline createComputePipeline(const Gfx::ComputePipelineCreateInfo& createInfo) override;
virtual Gfx::OSamplerState createSamplerState(const SamplerCreateInfo& createInfo) override;
virtual Gfx::ODescriptorLayout createDescriptorLayout(const std::string& name = "") override;
virtual Gfx::OPipelineLayout createPipelineLayout(Gfx::PPipelineLayout baseLayout = nullptr) override;
virtual void copyTexture(Gfx::PTexture srcTexture, Gfx::PTexture dstTexture) override; virtual void copyTexture(Gfx::PTexture srcTexture, Gfx::PTexture dstTexture) override;
protected: protected:
@@ -82,18 +84,18 @@ protected:
VkDevice handle; VkDevice handle;
VkPhysicalDevice physicalDevice; VkPhysicalDevice physicalDevice;
PQueue graphicsQueue; OQueue graphicsQueue;
PQueue computeQueue; OQueue computeQueue;
PQueue transferQueue; OQueue transferQueue;
PQueue dedicatedTransferQueue; OQueue dedicatedTransferQueue;
PPipelineCache pipelineCache; OPipelineCache pipelineCache;
std::mutex renderPassLock; std::mutex renderPassLock;
PRenderPass activeRenderPass; PRenderPass activeRenderPass;
PFramebuffer activeFramebuffer; PFramebuffer activeFramebuffer;
thread_local static PCommandBufferManager graphicsCommands; thread_local static OCommandBufferManager graphicsCommands;
thread_local static PCommandBufferManager computeCommands; thread_local static OCommandBufferManager computeCommands;
thread_local static PCommandBufferManager transferCommands; thread_local static OCommandBufferManager transferCommands;
thread_local static PCommandBufferManager dedicatedTransferCommands; thread_local static OCommandBufferManager dedicatedTransferCommands;
VkPhysicalDeviceProperties props; VkPhysicalDeviceProperties props;
VkPhysicalDeviceFeatures features; VkPhysicalDeviceFeatures features;
VkDebugReportCallbackEXT callback; VkDebugReportCallbackEXT callback;
@@ -101,8 +103,8 @@ protected:
Array<PViewport> viewports; Array<PViewport> viewports;
std::mutex allocatedFrameBufferLock; std::mutex allocatedFrameBufferLock;
Map<uint32, PFramebuffer> allocatedFramebuffers; Map<uint32, PFramebuffer> allocatedFramebuffers;
PAllocator allocator; OAllocator allocator;
PStagingManager stagingManager; OStagingManager stagingManager;
friend class Window; friend class Window;
}; };
+6 -6
View File
@@ -7,8 +7,8 @@
using namespace Seele; using namespace Seele;
using namespace Seele::Vulkan; using namespace Seele::Vulkan;
RenderPass::RenderPass(PGraphics graphics, Gfx::PRenderTargetLayout layout, Gfx::PViewport viewport) RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout layout, Gfx::PViewport viewport)
: Gfx::RenderPass(layout) : Gfx::RenderPass(std::move(layout))
, graphics(graphics) , graphics(graphics)
{ {
renderArea.extent.width = viewport->getSizeX(); renderArea.extent.width = viewport->getSizeX();
@@ -21,7 +21,7 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::PRenderTargetLayout layout, Gfx:
Array<VkAttachmentReference> colorRefs; Array<VkAttachmentReference> colorRefs;
VkAttachmentReference depthRef; VkAttachmentReference depthRef;
uint32 attachmentCounter = 0; uint32 attachmentCounter = 0;
for (auto inputAttachment : layout->inputAttachments) for (auto& inputAttachment : this->layout->inputAttachments)
{ {
PTexture2D image = inputAttachment->getTexture().cast<Texture2D>(); PTexture2D image = inputAttachment->getTexture().cast<Texture2D>();
VkAttachmentDescription& desc = attachments.add(); VkAttachmentDescription& desc = attachments.add();
@@ -39,7 +39,7 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::PRenderTargetLayout layout, Gfx:
ref.attachment = attachmentCounter; ref.attachment = attachmentCounter;
attachmentCounter++; attachmentCounter++;
} }
for (auto colorAttachment : layout->colorAttachments) for (auto& colorAttachment : this->layout->colorAttachments)
{ {
VkAttachmentDescription& desc = attachments.add(); VkAttachmentDescription& desc = attachments.add();
desc.flags = 0; desc.flags = 0;
@@ -127,12 +127,12 @@ uint32 RenderPass::getFramebufferHash()
{ {
FramebufferDescription description; FramebufferDescription description;
std::memset(&description, 0, sizeof(FramebufferDescription)); std::memset(&description, 0, sizeof(FramebufferDescription));
for (auto inputAttachment : layout->inputAttachments) for (auto& inputAttachment : layout->inputAttachments)
{ {
PTexture2D tex = inputAttachment->getTexture().cast<Texture2D>(); PTexture2D tex = inputAttachment->getTexture().cast<Texture2D>();
description.inputAttachments[description.numInputAttachments++] = tex->getView(); description.inputAttachments[description.numInputAttachments++] = tex->getView();
} }
for (auto colorAttachment : layout->colorAttachments) for (auto& colorAttachment : layout->colorAttachments)
{ {
PTexture2D tex = colorAttachment->getTexture().cast<Texture2D>(); PTexture2D tex = colorAttachment->getTexture().cast<Texture2D>();
description.colorAttachments[description.numColorAttachments++] = tex->getView(); description.colorAttachments[description.numColorAttachments++] = tex->getView();
+1 -1
View File
@@ -9,7 +9,7 @@ namespace Vulkan
class RenderPass : public Gfx::RenderPass class RenderPass : public Gfx::RenderPass
{ {
public: public:
RenderPass(PGraphics graphics, Gfx::PRenderTargetLayout layout, Gfx::PViewport viewport); RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout layout, Gfx::PViewport viewport);
virtual ~RenderPass(); virtual ~RenderPass();
uint32 getFramebufferHash(); uint32 getFramebufferHash();
inline VkRenderPass getHandle() const inline VkRenderPass getHandle() const
+9 -8
View File
@@ -1,8 +1,9 @@
#include "VulkanGraphicsResources.h" #include "RenderTarget.h"
#include "VulkanGraphics.h" #include "Resources.h"
#include "VulkanInitializer.h" #include "Graphics.h"
#include "VulkanGraphicsEnums.h" #include "Initializer.h"
#include "VulkanCommandBuffer.h" #include "Enums.h"
#include "CommandBuffer.h"
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
using namespace Seele; using namespace Seele;
@@ -116,9 +117,9 @@ void Window::onWindowCloseEvent()
{ {
} }
Gfx::PTexture2D Window::getBackBuffer() const Gfx::PTexture2D Window::getBackBuffer()
{ {
return backBufferImages[currentImageIndex]; return PTexture2D(backBufferImages[currentImageIndex]);
} }
void Window::setKeyCallback(std::function<void(KeyCode, InputAction, KeyModifier)> callback) void Window::setKeyCallback(std::function<void(KeyCode, InputAction, KeyModifier)> callback)
@@ -289,7 +290,7 @@ void Window::createSwapchain()
backBufferCreateInfo.width = getSizeX(); backBufferCreateInfo.width = getSizeX();
backBufferCreateInfo.height = getSizeY(); backBufferCreateInfo.height = getSizeY();
backBufferCreateInfo.usage = Gfx::SE_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; backBufferCreateInfo.usage = Gfx::SE_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
backBufferCreateInfo.resourceData.owner = Gfx::QueueType::GRAPHICS; backBufferCreateInfo.sourceData.owner = Gfx::QueueType::GRAPHICS;
backBufferCreateInfo.format = cast(surfaceFormat.format); backBufferCreateInfo.format = cast(surfaceFormat.format);
for (uint32 i = 0; i < numSwapchainImages; ++i) for (uint32 i = 0; i < numSwapchainImages; ++i)
{ {
+4 -4
View File
@@ -16,7 +16,7 @@ public:
virtual ~Window(); virtual ~Window();
virtual void beginFrame() override; virtual void beginFrame() override;
virtual void endFrame() override; virtual void endFrame() override;
virtual Gfx::PTexture2D getBackBuffer() const override; virtual Gfx::PTexture2D getBackBuffer() override;
virtual void onWindowCloseEvent() override; virtual void onWindowCloseEvent() override;
virtual void setKeyCallback(std::function<void(KeyCode, InputAction, KeyModifier)> callback) override; virtual void setKeyCallback(std::function<void(KeyCode, InputAction, KeyModifier)> callback) override;
virtual void setMouseMoveCallback(std::function<void(double, double)> callback) override; virtual void setMouseMoveCallback(std::function<void(double, double)> callback) override;
@@ -45,9 +45,9 @@ protected:
void chooseSurfaceFormat(const Array<VkSurfaceFormatKHR> &available, Gfx::SeFormat preferred); void chooseSurfaceFormat(const Array<VkSurfaceFormatKHR> &available, Gfx::SeFormat preferred);
void choosePresentMode(const Array<VkPresentModeKHR> &modes); void choosePresentMode(const Array<VkPresentModeKHR> &modes);
PTexture2D backBufferImages[Gfx::numFramesBuffered]; OTexture2D backBufferImages[Gfx::numFramesBuffered];
PSemaphore renderFinished[Gfx::numFramesBuffered]; OSemaphore renderFinished[Gfx::numFramesBuffered];
PSemaphore imageAcquired[Gfx::numFramesBuffered]; OSemaphore imageAcquired[Gfx::numFramesBuffered];
PSemaphore imageAcquiredSemaphore; PSemaphore imageAcquiredSemaphore;
PGraphics graphics; PGraphics graphics;
+4 -5
View File
@@ -1,8 +1,7 @@
#include "VulkanGraphicsResources.h" #include "Resources.h"
#include "VulkanInitializer.h" #include "Enums.h"
#include "VulkanGraphics.h" #include "Initializer.h"
#include "VulkanGraphicsEnums.h" #include "Graphics.h"
#include "VulkanCommandBuffer.h"
using namespace Seele; using namespace Seele;
using namespace Seele::Vulkan; using namespace Seele::Vulkan;
+2 -8
View File
@@ -1,6 +1,5 @@
#include "VulkanShader.h" #include "Shader.h"
#include "VulkanGraphics.h" #include "Graphics.h"
#include "VulkanDescriptorSets.h"
#include "slang.h" #include "slang.h"
#include "slang-com-ptr.h" #include "slang-com-ptr.h"
#include "stdlib.h" #include "stdlib.h"
@@ -23,11 +22,6 @@ Shader::~Shader()
} }
} }
Map<uint32, PDescriptorLayout> Shader::getDescriptorLayouts()
{
return descriptorSets;
}
uint32 Seele::Vulkan::Shader::getShaderHash() const uint32 Seele::Vulkan::Shader::getShaderHash() const
{ {
return hash; return hash;
+2 -3
View File
@@ -26,11 +26,11 @@ public:
//SLang renames all entry points to main, so we dont need that //SLang renames all entry points to main, so we dont need that
return "main";//entryPointName.c_str(); return "main";//entryPointName.c_str();
} }
Map<uint32, PDescriptorLayout> getDescriptorLayouts(); //Map<uint32, PDescriptorLayout> getDescriptorLayouts();
uint32 getShaderHash() const; uint32 getShaderHash() const;
private: private:
PGraphics graphics; PGraphics graphics;
Map<uint32, PDescriptorLayout> descriptorSets; //Map<uint32, PDescriptorLayout> descriptorSets;
VkShaderModule module; VkShaderModule module;
ShaderType type; ShaderType type;
VkShaderStageFlags stage; VkShaderStageFlags stage;
@@ -62,6 +62,5 @@ DEFINE_REF(FragmentShader)
DEFINE_REF(ComputeShader) DEFINE_REF(ComputeShader)
DEFINE_REF(TaskShader) DEFINE_REF(TaskShader)
DEFINE_REF(MeshShader) DEFINE_REF(MeshShader)
} // namespace Vulkan } // namespace Vulkan
} }
+7 -7
View File
@@ -110,13 +110,13 @@ TextureHandle::TextureHandle(PGraphics graphics, VkImageViewType viewType,
vkBindImageMemory(graphics->getDevice(), image, allocation->getHandle(), allocation->getOffset()); vkBindImageMemory(graphics->getDevice(), image, allocation->getHandle(), allocation->getOffset());
} }
const BulkResourceData& resourceData = createInfo.resourceData; const DataSource& sourceData = createInfo.sourceData;
if(resourceData.size > 0) if(sourceData.size > 0)
{ {
changeLayout(Gfx::SE_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); changeLayout(Gfx::SE_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
PStagingBuffer staging = graphics->getStagingManager()->allocateStagingBuffer(resourceData.size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT); PStagingBuffer staging = graphics->getStagingManager()->allocateStagingBuffer(sourceData.size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
void* data = staging->getMappedPointer(); void* data = staging->getMappedPointer();
std::memcpy(data, resourceData.data, resourceData.size); std::memcpy(data, sourceData.data, sourceData.size);
staging->flushMappedMemory(); staging->flushMappedMemory();
PCommandBufferManager cmdBufferManager = graphics->getQueueCommands(currentOwner); PCommandBufferManager cmdBufferManager = graphics->getQueueCommands(currentOwner);
@@ -322,7 +322,7 @@ void TextureHandle::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineSt
} }
Texture2D::Texture2D(PGraphics graphics, const TextureCreateInfo& createInfo, VkImage existingImage) Texture2D::Texture2D(PGraphics graphics, const TextureCreateInfo& createInfo, VkImage existingImage)
: Gfx::Texture2D(graphics->getFamilyMapping(), createInfo.resourceData.owner) : Gfx::Texture2D(graphics->getFamilyMapping(), createInfo.sourceData.owner)
{ {
textureHandle = new TextureHandle(graphics, createInfo.bArray ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D, textureHandle = new TextureHandle(graphics, createInfo.bArray ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D,
createInfo, currentOwner, existingImage); createInfo, currentOwner, existingImage);
@@ -354,7 +354,7 @@ void Texture2D::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageF
} }
Texture3D::Texture3D(PGraphics graphics, const TextureCreateInfo& createInfo, VkImage existingImage) Texture3D::Texture3D(PGraphics graphics, const TextureCreateInfo& createInfo, VkImage existingImage)
: Gfx::Texture3D(graphics->getFamilyMapping(), createInfo.resourceData.owner) : Gfx::Texture3D(graphics->getFamilyMapping(), createInfo.sourceData.owner)
{ {
textureHandle = new TextureHandle(graphics, VK_IMAGE_VIEW_TYPE_3D, textureHandle = new TextureHandle(graphics, VK_IMAGE_VIEW_TYPE_3D,
createInfo, currentOwner, existingImage); createInfo, currentOwner, existingImage);
@@ -385,7 +385,7 @@ void Texture3D::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageF
} }
TextureCube::TextureCube(PGraphics graphics, const TextureCreateInfo& createInfo, VkImage existingImage) TextureCube::TextureCube(PGraphics graphics, const TextureCreateInfo& createInfo, VkImage existingImage)
: Gfx::TextureCube(graphics->getFamilyMapping(), createInfo.resourceData.owner) : Gfx::TextureCube(graphics->getFamilyMapping(), createInfo.sourceData.owner)
{ {
textureHandle = new TextureHandle(graphics, createInfo.bArray ? VK_IMAGE_VIEW_TYPE_CUBE_ARRAY : VK_IMAGE_VIEW_TYPE_CUBE, textureHandle = new TextureHandle(graphics, createInfo.bArray ? VK_IMAGE_VIEW_TYPE_CUBE_ARRAY : VK_IMAGE_VIEW_TYPE_CUBE,
createInfo, currentOwner, existingImage); createInfo, currentOwner, existingImage);
+1 -1
View File
@@ -61,7 +61,7 @@ private:
//Updates via reference //Updates via reference
Gfx::QueueType& currentOwner; Gfx::QueueType& currentOwner;
PGraphics graphics; PGraphics graphics;
PSubAllocation allocation; OSubAllocation allocation;
uint32 sizeX; uint32 sizeX;
uint32 sizeY; uint32 sizeY;
uint32 sizeZ; uint32 sizeZ;
+12 -6
View File
@@ -10,20 +10,20 @@ Material::Material()
} }
Material::Material(Gfx::PGraphics graphics, Material::Material(Gfx::PGraphics graphics,
Array<PShaderParameter> parameter, Array<OShaderParameter> parameter,
Gfx::PDescriptorLayout layout, Gfx::ODescriptorLayout layout,
uint32 uniformDataSize, uint32 uniformDataSize,
uint32 uniformBinding, uint32 uniformBinding,
std::string materialName, std::string materialName,
Array<PShaderExpression> expressions, Array<OShaderExpression> expressions,
MaterialNode brdf) MaterialNode brdf)
: graphics(graphics) : graphics(graphics)
, parameters(parameter) , parameters(std::move(parameter))
, uniformDataSize(uniformDataSize) , uniformDataSize(uniformDataSize)
, uniformBinding(uniformBinding) , uniformBinding(uniformBinding)
, layout(layout) , layout(std::move(layout))
, materialName(materialName) , materialName(materialName)
, codeExpressions(expressions) , codeExpressions(std::move(expressions))
, brdf(brdf) , brdf(brdf)
, instanceId(0) , instanceId(0)
{ {
@@ -59,6 +59,7 @@ void Material::save(ArchiveBuffer& buffer) const
Serialization::save(buffer, binding.descriptorType); Serialization::save(buffer, binding.descriptorType);
Serialization::save(buffer, binding.shaderStages); Serialization::save(buffer, binding.shaderStages);
} }
Serialization::save(buffer, instances);
} }
void Material::load(ArchiveBuffer& buffer) void Material::load(ArchiveBuffer& buffer)
@@ -97,6 +98,11 @@ void Material::load(ArchiveBuffer& buffer)
layout->addDescriptorBinding(binding, descriptorType, descriptorCount, bindingFlags, shaderStages); layout->addDescriptorBinding(binding, descriptorType, descriptorCount, bindingFlags, shaderStages);
} }
layout->create(); layout->create();
Serialization::load(buffer, instances);
for (auto& instance : instances)
{
instance->setBaseMaterial(this);
}
} }
void Material::compile() void Material::compile()
+10 -8
View File
@@ -10,17 +10,18 @@ class Material
public: public:
Material(); Material();
Material(Gfx::PGraphics graphics, Material(Gfx::PGraphics graphics,
Array<PShaderParameter> parameter, Array<OShaderParameter> parameter,
Gfx::PDescriptorLayout layout, Gfx::ODescriptorLayout layout,
uint32 uniformDataSize, uint32 uniformDataSize,
uint32 uniformBinding, uint32 uniformBinding,
std::string materialName, std::string materialName,
Array<PShaderExpression> expressions, Array<OShaderExpression> expressions,
MaterialNode brdf); MaterialNode brdf);
~Material(); ~Material();
Gfx::PDescriptorLayout getDescriptorLayout() const { return layout; } const Gfx::PDescriptorLayout getDescriptorLayout() const { return layout; }
PMaterialInstance instantiate(); PMaterialInstance instantiate();
const std::string& getName() { return materialName; } PMaterialInstance getInstance(uint64 instance) { return instances[instance]; }
const std::string& getName() const { return materialName; }
void save(ArchiveBuffer& buffer) const; void save(ArchiveBuffer& buffer) const;
void load(ArchiveBuffer& buffer); void load(ArchiveBuffer& buffer);
@@ -33,10 +34,11 @@ private:
uint32 uniformDataSize; uint32 uniformDataSize;
uint32 uniformBinding; uint32 uniformBinding;
uint64 instanceId; uint64 instanceId;
Gfx::PDescriptorLayout layout; Gfx::ODescriptorLayout layout;
std::string materialName; std::string materialName;
Array<PShaderExpression> codeExpressions; Array<OShaderExpression> codeExpressions;
Array<PShaderParameter> parameters; Array<OShaderParameter> parameters;
Array<OMaterialInstance> instances;
MaterialNode brdf; MaterialNode brdf;
}; };
DEFINE_REF(Material) DEFINE_REF(Material)
+20 -9
View File
@@ -4,11 +4,15 @@
using namespace Seele; using namespace Seele;
MaterialInstance::MaterialInstance(uint64 id, Gfx::PGraphics graphics, PMaterial baseMaterial, Gfx::PDescriptorLayout descriptor, Array<PShaderParameter> params, uint32 uniformBinding, uint32 uniformSize) MaterialInstance::MaterialInstance()
{
}
MaterialInstance::MaterialInstance(uint64 id, Gfx::PGraphics graphics, PMaterial baseMaterial, Gfx::PDescriptorLayout layout, Array<OShaderParameter> params, uint32 uniformBinding, uint32 uniformSize)
: id(id), graphics(graphics), baseMaterial(baseMaterial), layout(layout), parameters(params), uniformBinding(uniformBinding) : id(id), graphics(graphics), baseMaterial(baseMaterial), layout(layout), parameters(params), uniformBinding(uniformBinding)
{ {
uniformBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{ uniformBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{
.resourceData = { .sourceData = {
.size = uniformSize, .size = uniformSize,
}, },
.bDynamic = true, .bDynamic = true,
@@ -25,7 +29,7 @@ MaterialInstance::~MaterialInstance()
void MaterialInstance::updateDescriptor() void MaterialInstance::updateDescriptor()
{ {
descriptor = layout->allocateDescriptorSet(); descriptor = layout->allocateDescriptorSet();
for (auto param : parameters) for (auto& param : parameters)
{ {
param->updateDescriptorSet(descriptor, uniformData.data()); param->updateDescriptorSet(descriptor, uniformData.data());
} }
@@ -43,20 +47,27 @@ void MaterialInstance::save(ArchiveBuffer& buffer) const
Serialization::save(buffer, uniformBinding); Serialization::save(buffer, uniformBinding);
Serialization::save(buffer, uniformBuffer); Serialization::save(buffer, uniformBuffer);
Serialization::save(buffer, parameters); Serialization::save(buffer, parameters);
Serialization::save(buffer, layout);
Serialization::save(buffer, descriptor);
Serialization::save(buffer, baseMaterial);
Serialization::save(buffer, id); Serialization::save(buffer, id);
} }
void MaterialInstance::load(ArchiveBuffer& buffer) void MaterialInstance::load(ArchiveBuffer& buffer)
{ {
graphics = buffer.getGraphics();
Serialization::load(buffer, uniformData); Serialization::load(buffer, uniformData);
Serialization::load(buffer, uniformBinding); Serialization::load(buffer, uniformBinding);
Serialization::load(buffer, uniformBuffer); Serialization::load(buffer, uniformBuffer);
Serialization::load(buffer, parameters); Serialization::load(buffer, parameters);
Serialization::load(buffer, layout);
Serialization::load(buffer, descriptor);
Serialization::load(buffer, baseMaterial);
Serialization::load(buffer, id); Serialization::load(buffer, id);
} }
void MaterialInstance::setBaseMaterial(PMaterial material)
{
layout = material->getDescriptorLayout();
baseMaterial = material;
descriptor = layout->allocateDescriptorSet();
for (auto& param : parameters)
{
param->updateDescriptorSet(descriptor, uniformData.data());
}
descriptor->writeChanges();
}
+5 -3
View File
@@ -7,7 +7,8 @@ namespace Seele
class MaterialInstance class MaterialInstance
{ {
public: public:
MaterialInstance(uint64 id, Gfx::PGraphics graphics, PMaterial baseMaterial, Gfx::PDescriptorLayout descriptor, Array<PShaderParameter> params, uint32 uniformBinding, uint32 uniformSize); MaterialInstance();
MaterialInstance(uint64 id, Gfx::PGraphics graphics, PMaterial baseMaterial, Gfx::PDescriptorLayout descriptor, Array<OShaderParameter> params, uint32 uniformBinding, uint32 uniformSize);
~MaterialInstance(); ~MaterialInstance();
void updateDescriptor(); void updateDescriptor();
Gfx::PDescriptorSet getDescriptorSet() const; Gfx::PDescriptorSet getDescriptorSet() const;
@@ -16,13 +17,14 @@ public:
void save(ArchiveBuffer& buffer) const; void save(ArchiveBuffer& buffer) const;
void load(ArchiveBuffer& buffer); void load(ArchiveBuffer& buffer);
void setBaseMaterial(PMaterial material);
private: private:
Gfx::PGraphics graphics; Gfx::PGraphics graphics;
Array<uint8> uniformData; Array<uint8> uniformData;
uint32 uniformBinding; uint32 uniformBinding;
Gfx::PUniformBuffer uniformBuffer; Gfx::OUniformBuffer uniformBuffer;
Array<PShaderParameter> parameters; Array<OShaderParameter> parameters;
Gfx::PDescriptorLayout layout; Gfx::PDescriptorLayout layout;
Gfx::PDescriptorSet descriptor; Gfx::PDescriptorSet descriptor;
PMaterial baseMaterial; PMaterial baseMaterial;
+5 -5
View File
@@ -208,21 +208,21 @@ DEFINE_REF(SampleExpression)
struct MaterialNode struct MaterialNode
{ {
std::string profile; std::string profile;
Map<std::string, PShaderExpression> variables; Map<std::string, OShaderExpression> variables;
MaterialNode() {} MaterialNode() {}
~MaterialNode() {} ~MaterialNode() {}
void save(ArchiveBuffer& buffer) const; void save(ArchiveBuffer& buffer) const;
void load(ArchiveBuffer& buffer); void load(ArchiveBuffer& buffer);
}; };
template<> template<>
static void Serialization::save(ArchiveBuffer& buffer, const PShaderExpression& parameter) static void Serialization::save(ArchiveBuffer& buffer, const OShaderExpression& parameter)
{ {
Serialization::save(buffer, parameter->getIdentifier()); Serialization::save(buffer, parameter->getIdentifier());
parameter->save(buffer); parameter->save(buffer);
} }
template<> template<>
static void Serialization::load(ArchiveBuffer& buffer, PShaderExpression& parameter) static void Serialization::load(ArchiveBuffer& buffer, OShaderExpression& parameter)
{ {
uint64 identifier = 0; uint64 identifier = 0;
Serialization::load(buffer, identifier); Serialization::load(buffer, identifier);
@@ -268,14 +268,14 @@ static void Serialization::load(ArchiveBuffer& buffer, PShaderExpression& parame
} }
template<> template<>
static void Serialization::save(ArchiveBuffer& buffer, const PShaderParameter& parameter) static void Serialization::save(ArchiveBuffer& buffer, const OShaderParameter& parameter)
{ {
Serialization::save(buffer, parameter->getIdentifier()); Serialization::save(buffer, parameter->getIdentifier());
parameter->save(buffer); parameter->save(buffer);
} }
template<> template<>
static void Serialization::load(ArchiveBuffer& buffer, PShaderParameter& parameter) static void Serialization::load(ArchiveBuffer& buffer, OShaderParameter& parameter)
{ {
uint64 identifier = 0; uint64 identifier = 0;
Serialization::load(buffer, identifier); Serialization::load(buffer, identifier);
-14
View File
@@ -1,14 +0,0 @@
#include "MinimalEngine.h"
#include <mutex>
std::map<void*, void*>& getRegisteredObjects()
{
static std::map<void*, void*> map;
return map;
}
std::mutex& getRegisteredObjectLock()
{
static std::mutex lock;
return lock;
}
+50 -167
View File
@@ -5,13 +5,13 @@
#define DEFINE_REF(x) \ #define DEFINE_REF(x) \
typedef ::Seele::RefPtr<x> P##x; \ typedef ::Seele::RefPtr<x> P##x; \
typedef ::Seele::UniquePtr<x> UP##x; \ typedef ::Seele::UniquePtr<x> UP##x; \
typedef ::Seele::WeakPtr<x> W##x; typedef ::Seele::OwningPtr<x> O##x;
#define DECLARE_REF(x) \ #define DECLARE_REF(x) \
class x; \ class x; \
typedef ::Seele::RefPtr<x> P##x; \ typedef ::Seele::RefPtr<x> P##x; \
typedef ::Seele::UniquePtr<x> UP##x; \ typedef ::Seele::UniquePtr<x> UP##x; \
typedef ::Seele::WeakPtr<x> W##x; typedef ::Seele::OwningPtr<x> O##x;
#define DECLARE_NAME_REF(nmsp, x) \ #define DECLARE_NAME_REF(nmsp, x) \
@@ -20,86 +20,63 @@
class x; \ class x; \
typedef RefPtr<x> P##x; \ typedef RefPtr<x> P##x; \
typedef UniquePtr<x> UP##x; \ typedef UniquePtr<x> UP##x; \
typedef WeakPtr<x> W##x; \ typedef OwningPtr<x> O##x; \
} }
std::map<void*, void*>& getRegisteredObjects();
std::mutex& getRegisteredObjectLock();
namespace Seele namespace Seele
{ {
template <typename T, typename Deleter> template <typename T, typename Deleter = std::default_delete<T>>
class RefPtr; class OwningPtr
template <typename T, typename Deleter>
class RefObject
{ {
public: public:
RefObject(T *ptr, Deleter&& deleter) OwningPtr()
: handle(ptr) : pointer(nullptr)
, deleter(std::move(deleter))
, refCount(1)
{ {
} }
RefObject(const RefObject &rhs) = delete; OwningPtr(T* ptr)
RefObject(RefObject &&rhs) : pointer(ptr)
: handle(std::move(rhs.handle)), refCount(std::move(rhs.refCount)) {}
template<typename F>
OwningPtr(OwningPtr<F>&& other)
{ {
pointer = static_cast<T*>(other.pointer);
} }
~RefObject() OwningPtr(const OwningPtr& other) = delete;
OwningPtr(OwningPtr&& other)
{ {
{ pointer = other.pointer;
std::scoped_lock lock(getRegisteredObjectLock()); other.pointer = nullptr;
getRegisteredObjects().erase(handle);
} }
// #pragma warning( disable: 4150) OwningPtr& operator=(const OwningPtr& other) = delete;
deleter(handle); OwningPtr& operator=(OwningPtr&& other)
handle = nullptr;
// #pragma warning( default: 4150)
}
RefObject &operator=(const RefObject &rhs) = delete;
RefObject &operator=(RefObject &&rhs)
{ {
if (*this != rhs) if (this != &other)
{ {
handle = std::move(rhs.handle); pointer = other.pointer;
refCount = std::move(rhs.refCount);
rhs.handle = nullptr;
rhs.refCount = 0;
} }
return *this; return *this;
} }
bool operator==(const RefObject &rhs) const constexpr T* operator->()
{ {
return handle == rhs.handle; return pointer;
} }
auto operator<=>(const RefObject& rhs) const constexpr const T* operator->() const
{ {
return handle <=> rhs.handle; return pointer;
} }
void addRef() constexpr bool operator==(const OwningPtr& rhs) const noexcept
{ {
refCount++; return pointer == rhs.pointer;
} }
void removeRef() constexpr auto operator<=>(const OwningPtr& rhs) const noexcept
{ {
refCount--; return pointer <=> rhs.pointer;
if (refCount == 0)
{
delete this;
}
}
T *getHandle() const
{
return handle;
} }
private: private:
T *handle; T* pointer;
Deleter deleter;
std::atomic_uint64_t refCount;
friend class RefPtr<T, Deleter>;
}; };
template <typename T>
template <typename T, typename Deleter = std::default_delete<T>>
class RefPtr class RefPtr
{ {
public: public:
@@ -111,97 +88,48 @@ public:
: object(nullptr) : object(nullptr)
{ {
} }
RefPtr(T *ptr, Deleter deleter = Deleter()) RefPtr(T *ptr)
: object(ptr)
{ {
std::scoped_lock l(getRegisteredObjectLock());
auto registeredObj = getRegisteredObjects().find(ptr);
// get here for thread safetly
auto registeredEnd = getRegisteredObjects().end();
if (registeredObj == registeredEnd)
{
object = new RefObject<T, Deleter>(ptr, std::move(deleter));
getRegisteredObjects()[ptr] = object;
}
else
{
object = (RefObject<T, Deleter> *)registeredObj->second;
object->addRef();
}
}
constexpr explicit RefPtr(RefObject<T, Deleter> *other) noexcept
: object(other)
{
if(object != nullptr)
{
object->addRef();
}
} }
constexpr RefPtr(const RefPtr &other) noexcept constexpr RefPtr(const RefPtr &other) noexcept
: object(other.object) : object(other.object)
{ {
if (object != nullptr)
{
object->addRef();
}
} }
constexpr RefPtr(RefPtr &&rhs) noexcept constexpr RefPtr(RefPtr &&rhs) noexcept
: object(std::move(rhs.object)) : object(std::move(rhs.object))
{ {
rhs.object = nullptr; rhs.object = nullptr;
//Dont change references, they stay the same
} }
template <typename F> template <typename F>
constexpr RefPtr(const RefPtr<F> &other) constexpr RefPtr(const RefPtr<F> &other)
{ {
if(other == nullptr) object = other.cast<T>();
{
return;
} }
F *f = other.getObject()->getHandle(); constexpr RefPtr(OwningPtr<T>& owning)
assert(static_cast<T *>(f));
object = (RefObject<T, Deleter> *)other.getObject();
object->addRef();
}
template <typename F, typename DeleterF = std::default_delete<F>>
constexpr RefPtr<F, DeleterF> cast()
{ {
T *t = object->getHandle(); object = owning.getHandle();
}
constexpr RefPtr(const OwningPtr<T>& owning)
{
object = owning.getHandle();
}
template <typename F>
constexpr const RefPtr<F> cast() const
{
T *t = object;
F *f = dynamic_cast<F *>(t); F *f = dynamic_cast<F *>(t);
if (f == nullptr) if (f == nullptr)
{ {
return nullptr; return nullptr;
} }
RefObject<F, DeleterF> *newObject = (RefObject<F, DeleterF> *)object; return RefPtr<F>(f);
return RefPtr<F, DeleterF>(newObject);
} }
template <typename F, typename DeleterF = std::default_delete<F>>
constexpr const RefPtr<F, DeleterF> cast() const
{
T *t = object->getHandle();
F *f = dynamic_cast<F *>(t);
if (f == nullptr)
{
return nullptr;
}
RefObject<F, DeleterF> *newObject = (RefObject<F, DeleterF> *)object;
return RefPtr<F, DeleterF>(newObject);
}
constexpr RefPtr &operator=(const RefPtr &other) constexpr RefPtr &operator=(const RefPtr &other)
{ {
if (this != &other) if (this != &other)
{ {
if (object != nullptr)
{
object->removeRef();
}
object = other.object; object = other.object;
if (object != nullptr)
{
object->addRef();
}
} }
return *this; return *this;
} }
@@ -209,10 +137,6 @@ public:
{ {
if (this != &rhs) if (this != &rhs)
{ {
if (object != nullptr)
{
object->removeRef();
}
object = std::move(rhs.object); object = std::move(rhs.object);
rhs.object = nullptr; rhs.object = nullptr;
} }
@@ -220,10 +144,6 @@ public:
} }
constexpr ~RefPtr() constexpr ~RefPtr()
{ {
if (object != nullptr)
{
object->removeRef();
}
} }
constexpr bool operator==(const RefPtr& rhs) const noexcept constexpr bool operator==(const RefPtr& rhs) const noexcept
{ {
@@ -235,32 +155,22 @@ public:
} }
constexpr T *operator->() constexpr T *operator->()
{ {
assert(object != nullptr); return object;
return object->handle;
} }
constexpr const T *operator->() const constexpr const T *operator->() const
{
assert(object != nullptr);
return object->handle;
}
constexpr RefObject<T, Deleter> *getObject() const noexcept
{ {
return object; return object;
} }
constexpr T* getHandle() constexpr T* getHandle()
{ {
return object->getHandle(); return object;
} }
constexpr const T* getHandle() const constexpr const T* getHandle() const
{ {
return object->getHandle(); return object;
}
constexpr RefPtr<T, Deleter> clone()
{
return RefPtr<T, Deleter>(new T(*getHandle()));
} }
private: private:
RefObject<T, Deleter> *object; T* object;
}; };
template <typename T> template <typename T>
class UniquePtr class UniquePtr
@@ -319,31 +229,4 @@ public:
private: private:
T *handle; T *handle;
}; };
//A weak pointer has no ownership over an object and thus cant delete it
template <typename T>
class WeakPtr
{
public:
WeakPtr()
: pointer(nullptr)
{
}
WeakPtr(RefPtr<T> &sharedPtr)
: pointer(sharedPtr)
{
}
WeakPtr &operator=(WeakPtr<T> &weakPtr)
{
pointer = weakPtr.pointer;
return *this;
}
WeakPtr &operator=(RefPtr<T> &sharedPtr)
{
pointer = sharedPtr;
return *this;
}
private:
RefPtr<T> pointer;
};
} // namespace Seele } // namespace Seele
+6 -6
View File
@@ -12,14 +12,14 @@ LightEnvironment::LightEnvironment(Gfx::PGraphics graphics)
layout->addDescriptorBinding(2, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER); layout->addDescriptorBinding(2, Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER);
layout->create(); layout->create();
lightEnvBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{ lightEnvBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{
.resourceData = { .sourceData = {
.size = sizeof(LightEnv), .size = sizeof(LightEnv),
.data = (uint8*) &lightEnv, .data = (uint8*) &lightEnv,
}, },
.bDynamic = true, .bDynamic = true,
}); });
directionalLights = graphics->createShaderBuffer(ShaderBufferCreateInfo{ directionalLights = graphics->createShaderBuffer(ShaderBufferCreateInfo{
.resourceData = { .sourceData = {
.size = sizeof(Component::DirectionalLight) * MAX_DIRECTIONAL_LIGHTS, .size = sizeof(Component::DirectionalLight) * MAX_DIRECTIONAL_LIGHTS,
.data = (uint8*)dirs.data(), .data = (uint8*)dirs.data(),
}, },
@@ -27,7 +27,7 @@ LightEnvironment::LightEnvironment(Gfx::PGraphics graphics)
.bDynamic = true, .bDynamic = true,
}); });
pointLights = graphics->createShaderBuffer(ShaderBufferCreateInfo{ pointLights = graphics->createShaderBuffer(ShaderBufferCreateInfo{
.resourceData = { .sourceData = {
.size = sizeof(Component::PointLight) * MAX_POINT_LIGHTS, .size = sizeof(Component::PointLight) * MAX_POINT_LIGHTS,
.data = (uint8*)dirs.data(), .data = (uint8*)dirs.data(),
}, },
@@ -62,15 +62,15 @@ void LightEnvironment::commit()
{ {
lightEnv.numDirectionalLights = dirs.size(); lightEnv.numDirectionalLights = dirs.size();
lightEnv.numPointLights = points.size(); lightEnv.numPointLights = points.size();
lightEnvBuffer->updateContents(BulkResourceData{ lightEnvBuffer->updateContents(DataSource{
.size = sizeof(LightEnv), .size = sizeof(LightEnv),
.data = (uint8*) & lightEnv, .data = (uint8*) & lightEnv,
}); });
directionalLights->updateContents(BulkResourceData{ directionalLights->updateContents(DataSource{
.size = sizeof(Component::DirectionalLight) * dirs.size(), .size = sizeof(Component::DirectionalLight) * dirs.size(),
.data = (uint8*)dirs.data(), .data = (uint8*)dirs.data(),
}); });
pointLights->updateContents(BulkResourceData{ pointLights->updateContents(DataSource{
.size = sizeof(Component::PointLight) * points.size(), .size = sizeof(Component::PointLight) * points.size(),
.data = (uint8*)points.data(), .data = (uint8*)points.data(),
}); });
+5 -5
View File
@@ -23,13 +23,13 @@ private:
uint32 numDirectionalLights; uint32 numDirectionalLights;
uint32 numPointLights; uint32 numPointLights;
} lightEnv; } lightEnv;
Gfx::PShaderBuffer directionalLights; Gfx::OShaderBuffer directionalLights;
Gfx::PUniformBuffer lightEnvBuffer; Gfx::OUniformBuffer lightEnvBuffer;
Gfx::PShaderBuffer pointLights; Gfx::OShaderBuffer pointLights;
Array<Component::DirectionalLight> dirs; Array<Component::DirectionalLight> dirs;
Array<Component::PointLight> points; Array<Component::PointLight> points;
Gfx::PDescriptorLayout layout; Gfx::ODescriptorLayout layout;
Gfx::PDescriptorSet set; Gfx::ODescriptorSet set;
Gfx::PGraphics graphics; Gfx::PGraphics graphics;
}; };
DEFINE_REF(LightEnvironment) DEFINE_REF(LightEnvironment)
+1 -1
View File
@@ -48,7 +48,7 @@ public:
Gfx::PGraphics getGraphics() const { return graphics; } Gfx::PGraphics getGraphics() const { return graphics; }
entt::registry registry; entt::registry registry;
private: private:
PLightEnvironment lightEnv; OLightEnvironment lightEnv;
PhysicsSystem physics; PhysicsSystem physics;
Gfx::PGraphics graphics; Gfx::PGraphics graphics;
}; };
+2 -2
View File
@@ -46,9 +46,9 @@ namespace Serialization
type.load(buffer); type.load(buffer);
} }
template<typename T> template<typename T>
static void save(ArchiveBuffer& buffer, const RefPtr<T>& ptr); static void save(ArchiveBuffer& buffer, const OwningPtr<T>& ptr);
template<typename T> template<typename T>
static void load(ArchiveBuffer& buffer, RefPtr<T>& ptr); static void load(ArchiveBuffer& buffer, OwningPtr<T>& ptr);
static void save(ArchiveBuffer& buffer, const std::string& type) static void save(ArchiveBuffer& buffer, const std::string& type)
{ {
uint64 length = type.size(); uint64 length = type.size();
+4
View File
@@ -8,6 +8,10 @@ MeshUpdater::MeshUpdater(PScene scene)
{ {
} }
MeshUpdater::~MeshUpdater()
{
}
void MeshUpdater::update(Component::Transform& transform, Component::Mesh& mesh) void MeshUpdater::update(Component::Transform& transform, Component::Mesh& mesh)
{ {
mesh.vertexData->updateMesh(transform, mesh); mesh.vertexData->updateMesh(transform, mesh);
-1
View File
@@ -56,7 +56,6 @@ void GameView::commitUpdate()
void GameView::prepareRender() void GameView::prepareRender()
{ {
renderGraph.updatePassData(depthPrepassData, lightCullingData, basePassData, skyboxData);
} }
void GameView::render() void GameView::render()
+1 -1
View File
@@ -28,7 +28,7 @@ public:
protected: protected:
Gfx::PGraphics graphics; Gfx::PGraphics graphics;
Gfx::PViewport viewport; Gfx::OViewport viewport;
PWindow owner; PWindow owner;
std::string name; std::string name;
-23
View File
@@ -16,10 +16,7 @@ Window::~Window()
void Window::addView(PView view) void Window::addView(PView view)
{ {
//WindowView* windowView = new WindowView(view);
//windowView->worker = std::thread(&Window::viewWorker, this, windowView);
views.add(view); views.add(view);
//viewWorker(views.size() - 1);
} }
void Window::render() void Window::render()
@@ -37,7 +34,6 @@ void Window::render()
} }
gfxHandle->endFrame(); gfxHandle->endFrame();
} }
//co_return;
} }
Gfx::PWindow Window::getGfxHandle() Gfx::PWindow Window::getGfxHandle()
@@ -61,22 +57,3 @@ void Window::setFocused(PView view)
owner->notifyWindowClosed(this); owner->notifyWindowClosed(this);
}); });
} }
/*void Window::viewWorker(size_t viewIndex)
{
WindowView* windowView = views[viewIndex];
co_await windowView->view->beginUpdate();
co_await windowView->view->update();
{
std::scoped_lock lock(windowView->workerMutex);
windowView->view->commitUpdate();
}
//std::cout << "Update completed" << std::endl;
//windowView->updateFinished.raise();
// enqueue next frame update
if(owner->isActive())
{
viewWorker(viewIndex);
}
//co_return;
}*/
-11
View File
@@ -4,17 +4,6 @@
namespace Seele namespace Seele
{ {
/*struct WindowView
{
PView view;
Event updateFinished;
std::mutex workerMutex;
WindowView(PView view)
: view(view)
, updateFinished(view->getName())
{}
};*/
//DEFINE_REF(WindowView)
DECLARE_REF(WindowManager) DECLARE_REF(WindowManager)
// The logical window, with the graphics proxy // The logical window, with the graphics proxy
class Window class Window
+6 -5
View File
@@ -13,15 +13,16 @@ WindowManager::~WindowManager()
PWindow WindowManager::addWindow(Gfx::PGraphics graphics, const WindowCreateInfo &createInfo) PWindow WindowManager::addWindow(Gfx::PGraphics graphics, const WindowCreateInfo &createInfo)
{ {
Gfx::PWindow handle = graphics->createWindow(createInfo); Gfx::OWindow handle = graphics->createWindow(createInfo);
PWindow window = new Window(this, handle); OWindow window = new Window(this, handle);
windows.add(window); PWindow ref = window;
return window; windows.add(std::move(window));
return ref;
} }
void WindowManager::notifyWindowClosed(PWindow window) void WindowManager::notifyWindowClosed(PWindow window)
{ {
windows.remove(windows.find(window)); windows.remove(windows.find([window] (OWindow w) { return window == w; }));
if(windows.empty()) if(windows.empty())
{ {
exit(0); exit(0);
+1 -1
View File
@@ -18,7 +18,7 @@ public:
} }
private: private:
Array<PWindow> windows; Array<OWindow> windows;
}; };
DEFINE_REF(WindowManager) DEFINE_REF(WindowManager)
} // namespace Seele } // namespace Seele