188 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <renderer/dx/buffers.hpp>
 | 
						|
#include <renderer/dx/shared_context.hpp>
 | 
						|
 | 
						|
namespace lt {
 | 
						|
 | 
						|
//======================================== 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))
 | 
						|
{
 | 
						|
	auto bDesc = D3D11_BUFFER_DESC {};
 | 
						|
 | 
						|
	bDesc.ByteWidth = size;
 | 
						|
	bDesc.Usage = D3D11_USAGE_DYNAMIC;
 | 
						|
	bDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
 | 
						|
	bDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
 | 
						|
 | 
						|
	auto hr = HRESULT {};
 | 
						|
	dxc(m_context->get_device()->CreateBuffer(&bDesc, nullptr, &m_buffer));
 | 
						|
	m_context->get_device_context()->VSSetConstantBuffers(m_index, 1u, m_buffer.GetAddressOf());
 | 
						|
}
 | 
						|
 | 
						|
void dxConstantBuffer::bind()
 | 
						|
{
 | 
						|
	m_context->get_device_context()->VSSetConstantBuffers(m_index, 1u, m_buffer.GetAddressOf());
 | 
						|
}
 | 
						|
 | 
						|
auto dxConstantBuffer::map() -> void *
 | 
						|
{
 | 
						|
	m_context->get_device_context()->VSSetConstantBuffers(m_index, 1u, m_buffer.GetAddressOf());
 | 
						|
	m_context->get_device_context()
 | 
						|
	    ->map(m_buffer.Get(), NULL, D3D11_MAP_WRITE_DISCARD, NULL, &m_map);
 | 
						|
	return m_map.pData;
 | 
						|
}
 | 
						|
 | 
						|
void dxConstantBuffer::un_map()
 | 
						|
{
 | 
						|
	m_context->get_device_context()->Unmap(m_buffer.Get(), NULL);
 | 
						|
}
 | 
						|
 | 
						|
dxVertexBuffer::dxVertexBuffer(
 | 
						|
    float *vertices,
 | 
						|
    unsigned int stride,
 | 
						|
    unsigned int count,
 | 
						|
    Ref<dxSharedContext> sharedContext
 | 
						|
)
 | 
						|
    : m_context(sharedContext)
 | 
						|
    , m_buffer(nullptr)
 | 
						|
    , m_map {}
 | 
						|
    , m_stride(stride)
 | 
						|
{
 | 
						|
	// buffer desc
 | 
						|
	auto bDesc = D3D11_BUFFER_DESC {};
 | 
						|
 | 
						|
	bDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
 | 
						|
	bDesc.Usage = D3D11_USAGE_DYNAMIC;
 | 
						|
	bDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
 | 
						|
 | 
						|
	bDesc.ByteWidth = count * stride;
 | 
						|
	bDesc.StructureByteStride = stride;
 | 
						|
 | 
						|
	// create buffer
 | 
						|
	auto hr = HRESULT {};
 | 
						|
	dxc(m_context->get_device()->CreateBuffer(&bDesc, nullptr, &m_buffer));
 | 
						|
}
 | 
						|
 | 
						|
dxVertexBuffer::~dxVertexBuffer()
 | 
						|
{
 | 
						|
	un_bind();
 | 
						|
}
 | 
						|
 | 
						|
auto dxVertexBuffer::map() -> void *
 | 
						|
{
 | 
						|
	m_context->get_device_context()
 | 
						|
	    ->map(m_buffer.Get(), NULL, D3D11_MAP_WRITE_DISCARD, NULL, &m_map);
 | 
						|
	return m_map.pData;
 | 
						|
}
 | 
						|
 | 
						|
void dxVertexBuffer::un_map()
 | 
						|
{
 | 
						|
	m_context->get_device_context()->Unmap(m_buffer.Get(), NULL);
 | 
						|
}
 | 
						|
 | 
						|
void dxVertexBuffer::bind()
 | 
						|
{
 | 
						|
	static const auto offset = unsigned int { 0u };
 | 
						|
	m_context->get_device_context()
 | 
						|
	    ->IASetVertexBuffers(0u, 1u, m_buffer.GetAddressOf(), &m_stride, &offset);
 | 
						|
}
 | 
						|
 | 
						|
void dxVertexBuffer::un_bind()
 | 
						|
{
 | 
						|
	static const auto offset = unsigned int { 0u };
 | 
						|
	static auto *buffer = (ID3D11Buffer *)(nullptr);
 | 
						|
 | 
						|
	m_context->get_device_context()->IASetVertexBuffers(0u, 1u, &buffer, &m_stride, &offset);
 | 
						|
}
 | 
						|
 | 
						|
dxIndexBuffer::dxIndexBuffer(
 | 
						|
    unsigned int *indices,
 | 
						|
    unsigned int count,
 | 
						|
    Ref<dxSharedContext> sharedContext
 | 
						|
)
 | 
						|
    : m_context(sharedContext)
 | 
						|
    , m_buffer(nullptr)
 | 
						|
{
 | 
						|
	// generate indices if not provided
 | 
						|
	auto hasIndices = !!indices;
 | 
						|
	if (!hasIndices)
 | 
						|
	{
 | 
						|
		// check
 | 
						|
		if (count % 6 != 0)
 | 
						|
		{
 | 
						|
			log_wrn("'indices' can only be null if count is multiple of 6");
 | 
						|
			lt_log(
 | 
						|
			    warn,
 | 
						|
			    "Adding {} to 'count' -> {}",
 | 
						|
			    (6 - (count % 6)),
 | 
						|
			    count + (6 - (count % 6))
 | 
						|
			);
 | 
						|
			count = count + (6 - (count % 6));
 | 
						|
		}
 | 
						|
 | 
						|
		// create indices
 | 
						|
		indices = new unsigned int[count];
 | 
						|
		auto 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;
 | 
						|
 | 
						|
			indices[i + 3] = offset + 2u;
 | 
						|
			indices[i + 4] = offset + 1u;
 | 
						|
			indices[i + 5] = offset + 0u;
 | 
						|
 | 
						|
			offset += 4u;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// buffer desc
 | 
						|
	auto bDesc = D3D11_BUFFER_DESC {};
 | 
						|
	bDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
 | 
						|
	bDesc.Usage = D3D11_USAGE_DEFAULT;
 | 
						|
 | 
						|
	bDesc.ByteWidth = count * sizeof(unsigned int);
 | 
						|
	bDesc.StructureByteStride = sizeof(unsigned int);
 | 
						|
 | 
						|
	// subresource data
 | 
						|
	auto sDesc = D3D11_SUBRESOURCE_DATA {};
 | 
						|
	sDesc.pSysMem = indices;
 | 
						|
 | 
						|
	// create buffer
 | 
						|
	auto hr = HRESULT {};
 | 
						|
	dxc(m_context->get_device()->CreateBuffer(&bDesc, &sDesc, &m_buffer));
 | 
						|
 | 
						|
	// delete indices
 | 
						|
	if (!hasIndices)
 | 
						|
		delete[] indices;
 | 
						|
}
 | 
						|
 | 
						|
dxIndexBuffer::~dxIndexBuffer()
 | 
						|
{
 | 
						|
	un_bind();
 | 
						|
}
 | 
						|
 | 
						|
void dxIndexBuffer::bind()
 | 
						|
{
 | 
						|
	m_context->get_device_context()->IASetIndexBuffer(m_buffer.Get(), DXGI_FORMAT_R32_UINT, 0u);
 | 
						|
}
 | 
						|
 | 
						|
void dxIndexBuffer::un_bind()
 | 
						|
{
 | 
						|
	static const auto offset = (unsigned int) { 0u };
 | 
						|
	static auto *buffer = (ID3D11Buffer *)(nullptr);
 | 
						|
 | 
						|
	m_context->get_device_context()->IASetIndexBuffer(buffer, DXGI_FORMAT_R32_UINT, offset);
 | 
						|
}
 | 
						|
//======================================== INDEX_BUFFER ========================================//
 | 
						|
 | 
						|
} // namespace lt
 |