Cleanup 2/2

This commit is contained in:
Isuru Samarathunga
2025-11-05 16:23:50 +05:30
parent 7d6e8ef695
commit 80dc50d279
14 changed files with 275 additions and 74 deletions

View File

@ -26,19 +26,30 @@ namespace ia::iae
Mat4 RDC::s_projectionMatrix;
SDL_Window *RDC::s_windowHandle;
Handle RDC::s_quadGeometry;
RDC_Pipeline *RDC::s_primitiveDrawPipeline;
RDC_Pipeline *RDC::s_dynamicSpritePipeline;
SDL_GPUSampler *RDC::s_linearClampSampler;
SDL_GPUSampler *RDC::s_linearRepeatSampler;
Vec2 RDC::s_cameraPosition{};
IVec2 RDC::s_viewportExtent;
RDC_Texture *RDC::s_defaultTexture{};
RDC_TextureAtlas *RDC::s_staticSpriteAtlas{};
RDC_TextureAtlas *RDC::s_dynamicSpriteAtlas{};
INT32 RDC::s_spriteInstanceCount{};
RDC_HostVisibleBuffer *RDC::s_primitiveInstanceBuffer{};
RDC_HostVisibleBuffer *RDC::s_staticSpriteInstanceBuffer{};
RDC_HostVisibleBuffer *RDC::s_dynamicSpriteInstanceBuffer{};
RDC_Texture *RDC::s_defaultTexture{};
INT32 RDC::s_spriteInstanceCount{};
RDC_SpriteInstanceData RDC::s_spriteInstances[RDC::MAX_SPRITE_COUNT];
INT32 RDC::s_primitiveInstanceCount{};
GeometryVertex RDC::s_primitiveInstances[RDC::MAX_PRIMITIVE_COUNT];
VOID RDC::Initialize(IN IVec2 viewportExtent, IN SDL_Window *windowHandle, IN BOOL isDebugMode)
{
EmbeddedResources::Initialize();
@ -69,7 +80,11 @@ namespace ia::iae
delete s_defaultTexture;
delete s_staticSpriteAtlas;
delete s_dynamicSpriteAtlas;
delete s_primitiveDrawPipeline;
delete s_dynamicSpritePipeline;
delete s_primitiveInstanceBuffer;
delete s_staticSpriteInstanceBuffer;
delete s_dynamicSpriteInstanceBuffer;
@ -85,11 +100,12 @@ namespace ia::iae
glm::orthoLH(0.0f, (FLOAT32) s_viewportExtent.x, (FLOAT32) s_viewportExtent.y, 0.0f, -1.0f, 1.0f);
}
VOID RDC::Render(IN SDL_GPURenderPass* renderPass, IN SDL_GPUCommandBuffer* commandBuffer)
VOID RDC::Render(IN SDL_GPURenderPass *renderPass, IN SDL_GPUCommandBuffer *commandBuffer)
{
s_dynamicSpritePipeline->Bind(renderPass);
SDL_PushGPUVertexUniformData(commandBuffer, 0, &s_projectionMatrix, sizeof(Mat4));
SDL_PushGPUVertexUniformData(commandBuffer, 1, &s_viewMatrix, sizeof(Mat4));
SDL_GPUTextureSamplerBinding textureBinding{.texture = s_dynamicSpriteAtlas
? s_dynamicSpriteAtlas->GetTexture()->GetHandle()
: s_defaultTexture->GetHandle(),
@ -98,13 +114,27 @@ namespace ia::iae
RDC_Device::BindGeometry(renderPass, s_quadGeometry);
if (s_spriteInstanceCount)
{
const auto spriteInstanceBuffer = s_dynamicSpriteInstanceBuffer->GetHandle();
const auto buffer = s_dynamicSpriteInstanceBuffer->GetHandle();
s_dynamicSpriteInstanceBuffer->CopyFrom(s_spriteInstances,
sizeof(RDC_SpriteInstanceData) * s_spriteInstanceCount);
SDL_BindGPUVertexStorageBuffers(renderPass, 0, &spriteInstanceBuffer, 1);
SDL_BindGPUVertexStorageBuffers(renderPass, 0, &buffer, 1);
SDL_DrawGPUIndexedPrimitives(renderPass, 6, s_spriteInstanceCount, 0, 0, 0);
}
s_spriteInstanceCount = 0;
s_primitiveDrawPipeline->Bind(renderPass);
SDL_PushGPUVertexUniformData(commandBuffer, 0, &s_projectionMatrix, sizeof(Mat4));
SDL_PushGPUVertexUniformData(commandBuffer, 1, &s_viewMatrix, sizeof(Mat4));
if (s_primitiveInstanceCount)
{
s_primitiveInstanceBuffer->CopyFrom(s_primitiveInstances,
sizeof(GeometryVertex) * s_primitiveInstanceCount);
SDL_GPUBufferBinding bufferBindings[] = {{.buffer = s_primitiveInstanceBuffer->GetHandle(), .offset = 0}};
SDL_BindGPUVertexBuffers(renderPass, 0, &bufferBindings[0], 1);
SDL_DrawGPUPrimitives(renderPass, s_primitiveInstanceCount << 1, 1, 0, 0);
}
s_primitiveInstanceCount = 0;
}
VOID RDC::RenderToWindow()
@ -192,6 +222,27 @@ namespace ia::iae
.Color = {1.0f, 1.0f, 1.0f, 1.0f}};
return _s;
}
VOID RDC::DrawLine(IN Vec2 start, IN Vec2 end, IN Vec4 color)
{
s_primitiveInstances[s_primitiveInstanceCount++] = {start, color};
s_primitiveInstances[s_primitiveInstanceCount++] = { end, color };
}
VOID RDC::DrawRect(IN Vec2 start, IN Vec2 end, IN Vec4 color)
{
s_primitiveInstances[s_primitiveInstanceCount++] = {start, color};
s_primitiveInstances[s_primitiveInstanceCount++] = {Vec2{end.x, start.y}, color};
s_primitiveInstances[s_primitiveInstanceCount++] = {Vec2{end.x, start.y}, color};
s_primitiveInstances[s_primitiveInstanceCount++] = {end, color};
s_primitiveInstances[s_primitiveInstanceCount++] = {end, color};
s_primitiveInstances[s_primitiveInstanceCount++] = {Vec2{start.x, end.y}, color};
s_primitiveInstances[s_primitiveInstanceCount++] = {Vec2{start.x, end.y}, color};
s_primitiveInstances[s_primitiveInstanceCount++] = {start, color};
}
} // namespace ia::iae
namespace ia::iae
@ -271,6 +322,7 @@ namespace ia::iae
{
s_dynamicSpriteInstanceBuffer =
new RDC_HostVisibleBuffer(RDC_Buffer::EType::STORAGE, sizeof(s_spriteInstances));
s_primitiveInstanceBuffer = new RDC_HostVisibleBuffer(RDC_Buffer::EType::VERTEX, sizeof(s_primitiveInstances));
}
VOID RDC::InitializeTextures()
@ -286,6 +338,22 @@ namespace ia::iae
VOID RDC::InitializePipelines()
{
s_primitiveDrawPipeline =
new RDC_Pipeline(RDC_Device::GetSwapchainTextureFormat(),
RDC_Pipeline::StageDesc{
.SourceData = EmbeddedResources::GetResource("Shaders/PrimitiveDraw.vert"),
.SamplerCount = 0,
.UniformBufferCount = 2,
.StorageBufferCount = 0,
},
RDC_Pipeline::StageDesc{
.SourceData = EmbeddedResources::GetResource("Shaders/PrimitiveDraw.frag"),
.SamplerCount = 0,
.UniformBufferCount = 0,
.StorageBufferCount = 0,
},
SDL_GPU_PRIMITIVETYPE_LINELIST, true);
s_dynamicSpritePipeline =
new RDC_Pipeline(RDC_Device::GetSwapchainTextureFormat(),
RDC_Pipeline::StageDesc{
@ -300,17 +368,17 @@ namespace ia::iae
.UniformBufferCount = 0,
.StorageBufferCount = 0,
},
true);
SDL_GPU_PRIMITIVETYPE_TRIANGLELIST, true);
}
VOID RDC::InitializeGeometries()
{
s_quadGeometry = RDC_Device::CreateGeometry(
{
{glm::vec2{0, 1}, glm::vec2{0, 1}},
{glm::vec2{1, 1}, glm::vec2{1, 1}},
{glm::vec2{1, 0}, glm::vec2{1, 0}},
{glm::vec2{0, 0}, glm::vec2{0, 0}},
{glm::vec2{0.0f, 1.0f}, glm::vec4{1.0f, 1.0f, 0.0f, 1.0f}},
{glm::vec2{1.0f, 1.0f}, glm::vec4{1.0f, 1.0f, 1.0f, 1.0f}},
{glm::vec2{1.0f, 0.0f}, glm::vec4{1.0f, 1.0f, 1.0f, 0.0f}},
{glm::vec2{0.0f, 0.0f}, glm::vec4{1.0f, 1.0f, 0.0f, 0.0f}},
},
{0, 1, 2, 2, 3, 0});
}