From 15a73854b672bb5c6a612e85d685db87847471a0 Mon Sep 17 00:00:00 2001 From: Caleb Cornett Date: Thu, 12 Oct 2023 21:31:04 -0500 Subject: [PATCH] CreateBuffer, QueueDestroyBuffer, SetBufferData, BindVertexBuffers --- src/Refresh_Driver_D3D11.c | 191 +++++++++++++++++++++++++++++-------- 1 file changed, 151 insertions(+), 40 deletions(-) diff --git a/src/Refresh_Driver_D3D11.c b/src/Refresh_Driver_D3D11.c index 43496d7..97d7f3d 100644 --- a/src/Refresh_Driver_D3D11.c +++ b/src/Refresh_Driver_D3D11.c @@ -286,6 +286,38 @@ typedef struct D3D11WindowData D3D11SwapchainData *swapchainData; } D3D11WindowData; +typedef struct D3D11ShaderModule +{ + ID3D11DeviceChild *shader; /* ID3D11VertexShader, ID3D11PixelShader, ID3D11ComputeShader */ + ID3D10Blob *blob; + char *shaderSource; + size_t shaderSourceLength; +} D3D11ShaderModule; + +typedef struct D3D11GraphicsPipeline +{ + float blendConstants[4]; + int32_t numColorAttachments; + DXGI_FORMAT colorAttachmentFormats[MAX_COLOR_TARGET_BINDINGS]; + ID3D11BlendState *colorAttachmentBlendState; + + Refresh_MultisampleState multisampleState; + + uint8_t hasDepthStencilAttachment; + DXGI_FORMAT depthStencilAttachmentFormat; + ID3D11DepthStencilState *depthStencilState; + uint32_t stencilRef; + + Refresh_PrimitiveType primitiveType; + ID3D11RasterizerState *rasterizerState; + + ID3D11VertexShader *vertexShader; + ID3D11InputLayout *inputLayout; + uint32_t *vertexStrides; + + ID3D11PixelShader *fragmentShader; +} D3D11GraphicsPipeline; + typedef struct D3D11CommandBuffer { /* D3D11 Object References */ @@ -295,7 +327,7 @@ typedef struct D3D11CommandBuffer /* Render Pass */ ID3D11RenderTargetView *rtViews[MAX_COLOR_TARGET_BINDINGS]; ID3D11DepthStencilView *dsView; - struct D3D11GraphicsPipeline *graphicsPipeline; + D3D11GraphicsPipeline *graphicsPipeline; /* State */ SDL_threadID threadID; @@ -309,35 +341,11 @@ typedef struct D3D11CommandBufferPool uint32_t capacity; } D3D11CommandBufferPool; -typedef struct D3D11ShaderModule +typedef struct D3D11Buffer { - ID3D11DeviceChild *shader; /* ID3D11VertexShader, ID3D11PixelShader, ID3D11ComputeShader */ - ID3D10Blob *blob; - char *shaderSource; - size_t shaderSourceLength; -} D3D11ShaderModule; - -typedef struct D3D11GraphicsPipeline -{ - float blendConstants[4]; - - int32_t numColorAttachments; - DXGI_FORMAT colorAttachmentFormats[MAX_COLOR_TARGET_BINDINGS]; - ID3D11BlendState *colorAttachmentBlendState; - - uint8_t hasDepthStencilAttachment; - DXGI_FORMAT depthStencilAttachmentFormat; - - Refresh_PrimitiveType primitiveType; - uint32_t stencilRef; - ID3D11DepthStencilState *depthStencilState; - ID3D11RasterizerState *rasterizerState; - ID3D11InputLayout *inputLayout; - - Refresh_MultisampleState multisampleState; - ID3D11VertexShader *vertexShader; - ID3D11PixelShader *fragmentShader; -} D3D11GraphicsPipeline; + ID3D11Buffer *handle; + uint32_t size; +} D3D11Buffer; typedef struct D3D11Renderer { @@ -432,13 +440,12 @@ static void D3D11_DestroyDevice( ) { D3D11Renderer *renderer = (D3D11Renderer*) device->driverData; D3D11CommandBuffer *commandBuffer; - int32_t i; D3D11_Wait(device->driverData); /* Release the window data */ - for (i = renderer->claimedWindowCount - 1; i >= 0; i -= 1) + for (int32_t i = renderer->claimedWindowCount - 1; i >= 0; i -= 1) { D3D11_UnclaimWindow(device->driverData, renderer->claimedWindows[i]->windowHandle); } @@ -451,7 +458,7 @@ static void D3D11_DestroyDevice( SDL_free(renderer->submittedCommandBuffers); - for (i = 0; i < renderer->commandBufferPool.count; i += 1) + for (uint32_t i = 0; i < renderer->commandBufferPool.count; i += 1) { commandBuffer = renderer->commandBufferPool.elements[i]; @@ -788,7 +795,6 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline( D3D11ShaderModule *vertShaderModule = (D3D11ShaderModule*) pipelineCreateInfo->vertexShaderInfo.shaderModule; D3D11ShaderModule *fragShaderModule = (D3D11ShaderModule*) pipelineCreateInfo->fragmentShaderInfo.shaderModule; ID3D10Blob *errorBlob; - int32_t i; HRESULT res; /* Color */ @@ -800,7 +806,7 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline( ); pipeline->numColorAttachments = pipelineCreateInfo->attachmentInfo.colorAttachmentCount; - for (i = 0; i < pipeline->numColorAttachments; i += 1) + for (int32_t i = 0; i < pipeline->numColorAttachments; i += 1) { pipeline->colorAttachmentFormats[i] = RefreshToD3D11_TextureFormat[ pipelineCreateInfo->attachmentInfo.colorAttachmentDescriptions[i].format @@ -882,6 +888,24 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline( ID3D10Blob_GetBufferSize(vertShaderModule->blob) ); + if (pipelineCreateInfo->vertexInputState.vertexBindingCount > 0) + { + pipeline->vertexStrides = SDL_malloc( + sizeof(uint32_t) * + pipelineCreateInfo->vertexInputState.vertexBindingCount + ); + + for (uint32_t i = 0; i < pipelineCreateInfo->vertexInputState.vertexBindingCount; i += 1) + { + pipeline->vertexStrides[i] = pipelineCreateInfo->vertexInputState.vertexBindings[i].stride; + } + } + else + { + /* Not sure if this is even possible, but juuust in case... */ + pipeline->vertexStrides = NULL; + } + /* Fragment Shader */ if (fragShaderModule->shader == NULL) @@ -962,8 +986,46 @@ static Refresh_Buffer* D3D11_CreateBuffer( Refresh_BufferUsageFlags usageFlags, uint32_t sizeInBytes ) { - NOT_IMPLEMENTED - return NULL; + D3D11Renderer *renderer = (D3D11Renderer*) driverData; + D3D11_BUFFER_DESC bufferDesc; + ID3D11Buffer *bufferHandle; + D3D11Buffer *d3d11Buffer; + HRESULT res; + + uint32_t bindFlags = 0; + if (usageFlags & REFRESH_BUFFERUSAGE_VERTEX_BIT) + { + bindFlags |= D3D11_BIND_VERTEX_BUFFER; + } + if (usageFlags & REFRESH_BUFFERUSAGE_INDEX_BIT) + { + bindFlags |= D3D11_BIND_INDEX_BUFFER; + } + if (usageFlags & REFRESH_BUFFERUSAGE_COMPUTE_BIT) + { + bindFlags |= D3D11_BIND_UNORDERED_ACCESS; + } + bufferDesc.BindFlags = bindFlags; + + bufferDesc.ByteWidth = sizeInBytes; + bufferDesc.Usage = D3D11_USAGE_DYNAMIC; + bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + bufferDesc.MiscFlags = 0; + bufferDesc.StructureByteStride = 0; + + res = ID3D11Device_CreateBuffer( + renderer->device, + &bufferDesc, + NULL, + &bufferHandle + ); + ERROR_CHECK_RETURN("Could not create buffer! Error Code: %08X", NULL); + + d3d11Buffer = SDL_malloc(sizeof(D3D11Buffer)); + d3d11Buffer->handle = bufferHandle; + d3d11Buffer->size = sizeInBytes; + + return (Refresh_Buffer*) d3d11Buffer; } /* Setters */ @@ -1026,7 +1088,33 @@ static void D3D11_SetBufferData( void* data, uint32_t dataLength ) { - NOT_IMPLEMENTED + D3D11Renderer *renderer = (D3D11Renderer*) driverData; + D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer; + D3D11Buffer *d3d11Buffer = (D3D11Buffer*) buffer; + D3D11_MAPPED_SUBRESOURCE subres = { 0 }; + HRESULT res; + + res = ID3D11DeviceContext_Map( + d3d11CommandBuffer->context, + (ID3D11Resource*) d3d11Buffer->handle, + 0, + D3D11_MAP_WRITE_DISCARD, + 0, + &subres + ); + ERROR_CHECK_RETURN("Could not map buffer for writing!", ); + + SDL_memcpy( + (uint8_t*) subres.pData + offsetInBytes, + data, + dataLength + ); + + ID3D11DeviceContext_Unmap( + d3d11CommandBuffer->context, + (ID3D11Resource*) d3d11Buffer->handle, + 0 + ); } static uint32_t D3D11_PushVertexShaderUniforms( @@ -1108,7 +1196,9 @@ static void D3D11_QueueDestroyBuffer( Refresh_Renderer *driverData, Refresh_Buffer *buffer ) { - NOT_IMPLEMENTED + D3D11Buffer *d3d11Buffer = (D3D11Buffer*) buffer; + ID3D11Buffer_Release(d3d11Buffer->handle); + SDL_free(d3d11Buffer); } static void D3D11_QueueDestroyShaderModule( @@ -1151,6 +1241,11 @@ static void D3D11_QueueDestroyGraphicsPipeline( /* FIXME: Release uniform buffers, once that's written in */ + if (d3dGraphicsPipeline->vertexStrides) + { + SDL_free(d3dGraphicsPipeline->vertexStrides); + } + SDL_free(d3dGraphicsPipeline); } @@ -1450,7 +1545,7 @@ static void D3D11_SetScissor( Refresh_CommandBuffer *commandBuffer, Refresh_Rect *scissor ) { - D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*)commandBuffer; + D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer; D3D11_RECT rect = { scissor->x, @@ -1474,7 +1569,23 @@ static void D3D11_BindVertexBuffers( Refresh_Buffer **pBuffers, uint64_t *pOffsets ) { - NOT_IMPLEMENTED + D3D11Renderer *renderer = (D3D11Renderer*) driverData; + D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer; + ID3D11Buffer *bufferHandles[MAX_BUFFER_BINDINGS]; + + for (uint32_t i = 0; i < bindingCount; i += 1) + { + bufferHandles[i] = ((D3D11Buffer*) pBuffers[i])->handle; + } + + ID3D11DeviceContext_IASetVertexBuffers( + d3d11CommandBuffer->context, + firstBinding, + bindingCount, + bufferHandles, + &d3d11CommandBuffer->graphicsPipeline->vertexStrides[firstBinding], + (UINT*) pOffsets + ); } static void D3D11_BindIndexBuffer(