CreateBuffer, QueueDestroyBuffer, SetBufferData, BindVertexBuffers
							parent
							
								
									741d3ebcff
								
							
						
					
					
						commit
						e35efa4061
					
				|  | @ -286,6 +286,38 @@ typedef struct D3D11WindowData | ||||||
| 	D3D11SwapchainData *swapchainData; | 	D3D11SwapchainData *swapchainData; | ||||||
| } D3D11WindowData; | } 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 | typedef struct D3D11CommandBuffer | ||||||
| { | { | ||||||
| 	/* D3D11 Object References */ | 	/* D3D11 Object References */ | ||||||
|  | @ -295,7 +327,7 @@ typedef struct D3D11CommandBuffer | ||||||
| 	/* Render Pass */ | 	/* Render Pass */ | ||||||
| 	ID3D11RenderTargetView *rtViews[MAX_COLOR_TARGET_BINDINGS]; | 	ID3D11RenderTargetView *rtViews[MAX_COLOR_TARGET_BINDINGS]; | ||||||
| 	ID3D11DepthStencilView *dsView; | 	ID3D11DepthStencilView *dsView; | ||||||
| 	struct D3D11GraphicsPipeline *graphicsPipeline; | 	D3D11GraphicsPipeline *graphicsPipeline; | ||||||
| 
 | 
 | ||||||
| 	/* State */ | 	/* State */ | ||||||
| 	SDL_threadID threadID; | 	SDL_threadID threadID; | ||||||
|  | @ -309,35 +341,11 @@ typedef struct D3D11CommandBufferPool | ||||||
| 	uint32_t capacity; | 	uint32_t capacity; | ||||||
| } D3D11CommandBufferPool; | } D3D11CommandBufferPool; | ||||||
| 
 | 
 | ||||||
| typedef struct D3D11ShaderModule | typedef struct D3D11Buffer | ||||||
| { | { | ||||||
| 	ID3D11DeviceChild *shader; /* ID3D11VertexShader, ID3D11PixelShader, ID3D11ComputeShader */ | 	ID3D11Buffer *handle; | ||||||
| 	ID3D10Blob *blob; | 	uint32_t size; | ||||||
| 	char *shaderSource; | } D3D11Buffer; | ||||||
| 	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; |  | ||||||
| 
 | 
 | ||||||
| typedef struct D3D11Renderer | typedef struct D3D11Renderer | ||||||
| { | { | ||||||
|  | @ -432,13 +440,12 @@ static void D3D11_DestroyDevice( | ||||||
| ) { | ) { | ||||||
| 	D3D11Renderer *renderer = (D3D11Renderer*) device->driverData; | 	D3D11Renderer *renderer = (D3D11Renderer*) device->driverData; | ||||||
| 	D3D11CommandBuffer *commandBuffer; | 	D3D11CommandBuffer *commandBuffer; | ||||||
| 	int32_t i; |  | ||||||
| 
 | 
 | ||||||
| 	D3D11_Wait(device->driverData); | 	D3D11_Wait(device->driverData); | ||||||
| 
 | 
 | ||||||
| 	/* Release the window data */ | 	/* 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); | 		D3D11_UnclaimWindow(device->driverData, renderer->claimedWindows[i]->windowHandle); | ||||||
| 	} | 	} | ||||||
|  | @ -451,7 +458,7 @@ static void D3D11_DestroyDevice( | ||||||
| 
 | 
 | ||||||
| 	SDL_free(renderer->submittedCommandBuffers); | 	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]; | 		commandBuffer = renderer->commandBufferPool.elements[i]; | ||||||
| 
 | 
 | ||||||
|  | @ -788,7 +795,6 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline( | ||||||
| 	D3D11ShaderModule *vertShaderModule = (D3D11ShaderModule*) pipelineCreateInfo->vertexShaderInfo.shaderModule; | 	D3D11ShaderModule *vertShaderModule = (D3D11ShaderModule*) pipelineCreateInfo->vertexShaderInfo.shaderModule; | ||||||
| 	D3D11ShaderModule *fragShaderModule = (D3D11ShaderModule*) pipelineCreateInfo->fragmentShaderInfo.shaderModule; | 	D3D11ShaderModule *fragShaderModule = (D3D11ShaderModule*) pipelineCreateInfo->fragmentShaderInfo.shaderModule; | ||||||
| 	ID3D10Blob *errorBlob; | 	ID3D10Blob *errorBlob; | ||||||
| 	int32_t i; |  | ||||||
| 	HRESULT res; | 	HRESULT res; | ||||||
| 
 | 
 | ||||||
| 	/* Color */ | 	/* Color */ | ||||||
|  | @ -800,7 +806,7 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline( | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	pipeline->numColorAttachments = pipelineCreateInfo->attachmentInfo.colorAttachmentCount; | 	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[ | 		pipeline->colorAttachmentFormats[i] = RefreshToD3D11_TextureFormat[ | ||||||
| 			pipelineCreateInfo->attachmentInfo.colorAttachmentDescriptions[i].format | 			pipelineCreateInfo->attachmentInfo.colorAttachmentDescriptions[i].format | ||||||
|  | @ -882,6 +888,24 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline( | ||||||
| 		ID3D10Blob_GetBufferSize(vertShaderModule->blob) | 		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 */ | 	/* Fragment Shader */ | ||||||
| 
 | 
 | ||||||
| 	if (fragShaderModule->shader == NULL) | 	if (fragShaderModule->shader == NULL) | ||||||
|  | @ -962,8 +986,46 @@ static Refresh_Buffer* D3D11_CreateBuffer( | ||||||
| 	Refresh_BufferUsageFlags usageFlags, | 	Refresh_BufferUsageFlags usageFlags, | ||||||
| 	uint32_t sizeInBytes | 	uint32_t sizeInBytes | ||||||
| ) { | ) { | ||||||
| 	NOT_IMPLEMENTED | 	D3D11Renderer *renderer = (D3D11Renderer*) driverData; | ||||||
| 	return NULL; | 	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 */ | /* Setters */ | ||||||
|  | @ -1026,7 +1088,33 @@ static void D3D11_SetBufferData( | ||||||
| 	void* data, | 	void* data, | ||||||
| 	uint32_t dataLength | 	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( | static uint32_t D3D11_PushVertexShaderUniforms( | ||||||
|  | @ -1108,7 +1196,9 @@ static void D3D11_QueueDestroyBuffer( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	Refresh_Buffer *buffer | 	Refresh_Buffer *buffer | ||||||
| ) { | ) { | ||||||
| 	NOT_IMPLEMENTED | 	D3D11Buffer *d3d11Buffer = (D3D11Buffer*) buffer; | ||||||
|  | 	ID3D11Buffer_Release(d3d11Buffer->handle); | ||||||
|  | 	SDL_free(d3d11Buffer); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void D3D11_QueueDestroyShaderModule( | static void D3D11_QueueDestroyShaderModule( | ||||||
|  | @ -1151,6 +1241,11 @@ static void D3D11_QueueDestroyGraphicsPipeline( | ||||||
| 
 | 
 | ||||||
| 	/* FIXME: Release uniform buffers, once that's written in */ | 	/* FIXME: Release uniform buffers, once that's written in */ | ||||||
| 
 | 
 | ||||||
|  | 	if (d3dGraphicsPipeline->vertexStrides) | ||||||
|  | 	{ | ||||||
|  | 		SDL_free(d3dGraphicsPipeline->vertexStrides); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	SDL_free(d3dGraphicsPipeline); | 	SDL_free(d3dGraphicsPipeline); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1474,7 +1569,23 @@ static void D3D11_BindVertexBuffers( | ||||||
| 	Refresh_Buffer **pBuffers, | 	Refresh_Buffer **pBuffers, | ||||||
| 	uint64_t *pOffsets | 	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( | static void D3D11_BindIndexBuffer( | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue