light/modules/engine/src/platform/graphics/directx/buffers.cpp

189 lines
4.8 KiB
C++
Raw Normal View History

2025-07-05 13:28:41 +03:30
#include <engine/platform/graphics/directx/buffers.hpp>
#include <engine/platform/graphics/directx/shared_context.hpp>
2021-06-02 17:20:15 +04:30
namespace Light {
2025-07-05 13:28:41 +03:30
//======================================== CONSTANT_BUFFER
//========================================//
dxConstantBuffer::dxConstantBuffer(
ConstantBufferIndex index,
unsigned int size,
Ref<dxSharedContext> sharedContext
)
: m_Context(sharedContext)
, m_Buffer(nullptr)
, m_Map {}
, m_Index(static_cast<int>(index))
2022-03-07 21:57:00 +03:30
{
D3D11_BUFFER_DESC bDesc = {};
2025-07-05 13:28:41 +03:30
bDesc.ByteWidth = size;
bDesc.Usage = D3D11_USAGE_DYNAMIC;
bDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
2022-03-07 21:57:00 +03:30
bDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
HRESULT hr;
DXC(m_Context->GetDevice()->CreateBuffer(&bDesc, nullptr, &m_Buffer));
m_Context->GetDeviceContext()->VSSetConstantBuffers(m_Index, 1u, m_Buffer.GetAddressOf());
}
void dxConstantBuffer::Bind()
{
m_Context->GetDeviceContext()->VSSetConstantBuffers(m_Index, 1u, m_Buffer.GetAddressOf());
}
2025-07-05 13:28:41 +03:30
void *dxConstantBuffer::Map()
2022-03-07 21:57:00 +03:30
{
m_Context->GetDeviceContext()->VSSetConstantBuffers(m_Index, 1u, m_Buffer.GetAddressOf());
m_Context->GetDeviceContext()->Map(m_Buffer.Get(), NULL, D3D11_MAP_WRITE_DISCARD, NULL, &m_Map);
return m_Map.pData;
}
void dxConstantBuffer::UnMap()
{
m_Context->GetDeviceContext()->Unmap(m_Buffer.Get(), NULL);
}
2025-07-05 13:28:41 +03:30
//======================================== CONSTANT_BUFFER
//========================================//
//================================================== VERTEX_BUFFER
//==================================================//
dxVertexBuffer::dxVertexBuffer(
float *vertices,
unsigned int stride,
unsigned int count,
Ref<dxSharedContext> sharedContext
)
: m_Context(sharedContext)
, m_Buffer(nullptr)
, m_Map {}
, m_Stride(stride)
2022-03-07 21:57:00 +03:30
{
// buffer desc
D3D11_BUFFER_DESC bDesc = {};
2025-07-05 13:28:41 +03:30
bDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bDesc.Usage = D3D11_USAGE_DYNAMIC;
2022-03-07 21:57:00 +03:30
bDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
2025-07-05 13:28:41 +03:30
bDesc.ByteWidth = count * stride;
2022-03-07 21:57:00 +03:30
bDesc.StructureByteStride = stride;
// create buffer
HRESULT hr;
DXC(m_Context->GetDevice()->CreateBuffer(&bDesc, nullptr, &m_Buffer));
}
dxVertexBuffer::~dxVertexBuffer()
{
UnBind();
}
2025-07-05 13:28:41 +03:30
void *dxVertexBuffer::Map()
2022-03-07 21:57:00 +03:30
{
m_Context->GetDeviceContext()->Map(m_Buffer.Get(), NULL, D3D11_MAP_WRITE_DISCARD, NULL, &m_Map);
return m_Map.pData;
}
void dxVertexBuffer::UnMap()
{
m_Context->GetDeviceContext()->Unmap(m_Buffer.Get(), NULL);
}
void dxVertexBuffer::Bind()
{
static const unsigned int offset = 0u;
2025-07-05 13:28:41 +03:30
m_Context->GetDeviceContext()
->IASetVertexBuffers(0u, 1u, m_Buffer.GetAddressOf(), &m_Stride, &offset);
2022-03-07 21:57:00 +03:30
}
void dxVertexBuffer::UnBind()
{
static const unsigned int offset = 0u;
2025-07-05 13:28:41 +03:30
static ID3D11Buffer *buffer = nullptr;
2022-03-07 21:57:00 +03:30
m_Context->GetDeviceContext()->IASetVertexBuffers(0u, 1u, &buffer, &m_Stride, &offset);
}
2025-07-05 13:28:41 +03:30
//================================================== VERTEX_BUFFER
//==================================================//
2022-03-07 21:57:00 +03:30
//======================================== INDEX_BUFFER ========================================//
2025-07-05 13:28:41 +03:30
dxIndexBuffer::dxIndexBuffer(
unsigned int *indices,
unsigned int count,
Ref<dxSharedContext> sharedContext
)
: m_Context(sharedContext)
, m_Buffer(nullptr)
2022-03-07 21:57:00 +03:30
{
// generate indices if not provided
bool hasIndices = !!indices;
if (!hasIndices)
2021-06-02 17:20:15 +04:30
{
2022-03-07 21:57:00 +03:30
// check
if (count % 6 != 0)
{
LOG(warn, "'indices' can only be null if count is multiple of 6");
LOG(warn, "Adding {} to 'count' -> {}", (6 - (count % 6)), count + (6 - (count % 6)));
count = count + (6 - (count % 6));
}
2021-06-02 17:20:15 +04:30
2022-03-07 21:57:00 +03:30
// create indices
2025-07-05 13:28:41 +03:30
indices = new unsigned int[count];
2022-03-07 21:57:00 +03:30
unsigned int offset = 0;
for (unsigned int i = 0; i < count; i += 6)
{
indices[i + 0] = offset + 0u;
indices[i + 1] = offset + 3u;
indices[i + 2] = offset + 2u;
2022-03-07 21:57:00 +03:30
indices[i + 3] = offset + 2u;
indices[i + 4] = offset + 1u;
indices[i + 5] = offset + 0u;
2021-06-02 17:20:15 +04:30
2022-03-07 21:57:00 +03:30
offset += 4u;
}
2022-03-07 21:57:00 +03:30
}
2022-03-07 21:57:00 +03:30
// buffer desc
D3D11_BUFFER_DESC bDesc = {};
2025-07-05 13:28:41 +03:30
bDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
bDesc.Usage = D3D11_USAGE_DEFAULT;
2025-07-05 13:28:41 +03:30
bDesc.ByteWidth = count * sizeof(unsigned int);
2022-03-07 21:57:00 +03:30
bDesc.StructureByteStride = sizeof(unsigned int);
2022-03-07 21:57:00 +03:30
// subresource data
D3D11_SUBRESOURCE_DATA sDesc = {};
2025-07-05 13:28:41 +03:30
sDesc.pSysMem = indices;
2022-03-07 21:57:00 +03:30
// create buffer
HRESULT hr;
DXC(m_Context->GetDevice()->CreateBuffer(&bDesc, &sDesc, &m_Buffer));
2022-03-07 21:57:00 +03:30
// delete indices
if (!hasIndices)
delete[] indices;
}
2022-03-07 21:57:00 +03:30
dxIndexBuffer::~dxIndexBuffer()
{
UnBind();
}
2022-03-07 21:57:00 +03:30
void dxIndexBuffer::Bind()
{
m_Context->GetDeviceContext()->IASetIndexBuffer(m_Buffer.Get(), DXGI_FORMAT_R32_UINT, 0u);
}
2022-03-07 21:57:00 +03:30
void dxIndexBuffer::UnBind()
{
static const unsigned int offset = 0u;
2025-07-05 13:28:41 +03:30
static ID3D11Buffer *buffer = nullptr;
2022-03-07 21:57:00 +03:30
m_Context->GetDeviceContext()->IASetIndexBuffer(buffer, DXGI_FORMAT_R32_UINT, offset);
}
//======================================== INDEX_BUFFER ========================================//
2022-03-07 21:57:00 +03:30
} // namespace Light