Files
2025-01-29 10:55:49 +01:00

71 lines
2.4 KiB
C

#include <Kinc/Graphics5/ConstantBuffer.h>
#include <kinc/backend/SystemMicrosoft.h>
bool kinc_g5_transposeMat3 = false;
bool kinc_g5_transposeMat4 = false;
void kinc_g5_constant_buffer_init(kinc_g5_constant_buffer_t *buffer, int size) {
buffer->impl.mySize = size;
buffer->data = NULL;
D3D12_HEAP_PROPERTIES heapProperties;
heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD;
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
heapProperties.CreationNodeMask = 1;
heapProperties.VisibleNodeMask = 1;
D3D12_RESOURCE_DESC resourceDesc;
resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
resourceDesc.Alignment = 0;
resourceDesc.Width = size;
resourceDesc.Height = 1;
resourceDesc.DepthOrArraySize = 1;
resourceDesc.MipLevels = 1;
resourceDesc.Format = DXGI_FORMAT_UNKNOWN;
resourceDesc.SampleDesc.Count = 1;
resourceDesc.SampleDesc.Quality = 0;
resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
resourceDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
kinc_microsoft_affirm(device->CreateCommittedResource(&heapProperties, D3D12_HEAP_FLAG_NONE, &resourceDesc, D3D12_RESOURCE_STATE_GENERIC_READ, NULL,
IID_GRAPHICS_PPV_ARGS(&buffer->impl.constant_buffer)));
void *p;
buffer->impl.constant_buffer->Map(0, NULL, &p);
ZeroMemory(p, size);
buffer->impl.constant_buffer->Unmap(0, NULL);
}
void kinc_g5_constant_buffer_destroy(kinc_g5_constant_buffer_t *buffer) {
buffer->impl.constant_buffer->Release();
}
void kinc_g5_constant_buffer_lock_all(kinc_g5_constant_buffer_t *buffer) {
kinc_g5_constant_buffer_lock(buffer, 0, kinc_g5_constant_buffer_size(buffer));
}
void kinc_g5_constant_buffer_lock(kinc_g5_constant_buffer_t *buffer, int start, int count) {
buffer->impl.lastStart = start;
buffer->impl.lastCount = count;
D3D12_RANGE range;
range.Begin = start;
range.End = range.Begin + count;
uint8_t *p;
buffer->impl.constant_buffer->Map(0, &range, (void **)&p);
buffer->data = &p[start];
}
void kinc_g5_constant_buffer_unlock(kinc_g5_constant_buffer_t *buffer) {
D3D12_RANGE range;
range.Begin = buffer->impl.lastStart;
range.End = range.Begin + buffer->impl.lastCount;
buffer->impl.constant_buffer->Unmap(0, &range);
buffer->data = NULL;
}
int kinc_g5_constant_buffer_size(kinc_g5_constant_buffer_t *buffer) {
return buffer->impl.mySize;
}