Use NO_OVERWRITE on uniform buffers after the initial WRITE_DISCARD + SetBufferData cleanup
	
		
			
	
		
	
	
		
			
				
	
				continuous-integration/drone/pr Build is failing
				
					Details
				
			
		
	
				
					
				
			
				
	
				continuous-integration/drone/pr Build is failing
				
					Details
				
			
		
	
							parent
							
								
									9b8dfd8207
								
							
						
					
					
						commit
						917896e5f4
					
				| 
						 | 
					@ -440,6 +440,7 @@ typedef struct D3D11UniformBuffer
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	D3D11Buffer *d3d11Buffer;
 | 
						D3D11Buffer *d3d11Buffer;
 | 
				
			||||||
	uint32_t offset;
 | 
						uint32_t offset;
 | 
				
			||||||
 | 
						uint8_t hasDiscarded;
 | 
				
			||||||
} D3D11UniformBuffer;
 | 
					} D3D11UniformBuffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct D3D11Fence
 | 
					typedef struct D3D11Fence
 | 
				
			||||||
| 
						 | 
					@ -1795,65 +1796,6 @@ static void D3D11_CopyTextureToBuffer(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Buffer Data */
 | 
					/* Buffer Data */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void D3D11_INTERNAL_SetBufferData(
 | 
					 | 
				
			||||||
	D3D11Renderer *renderer,
 | 
					 | 
				
			||||||
	D3D11CommandBuffer *commandBuffer,
 | 
					 | 
				
			||||||
	D3D11Buffer *buffer,
 | 
					 | 
				
			||||||
	uint32_t offsetInBytes,
 | 
					 | 
				
			||||||
	void* data,
 | 
					 | 
				
			||||||
	uint32_t dataLength,
 | 
					 | 
				
			||||||
	uint8_t isUniformBuffer
 | 
					 | 
				
			||||||
) {
 | 
					 | 
				
			||||||
	D3D11_BOX dstBox;
 | 
					 | 
				
			||||||
	D3D11_MAPPED_SUBRESOURCE subres;
 | 
					 | 
				
			||||||
	HRESULT res;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (isUniformBuffer)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		res = ID3D11DeviceContext_Map(
 | 
					 | 
				
			||||||
			commandBuffer->context,
 | 
					 | 
				
			||||||
			(ID3D11Resource*) buffer->handle,
 | 
					 | 
				
			||||||
			0,
 | 
					 | 
				
			||||||
			D3D11_MAP_WRITE_DISCARD, /* FIXME: Use NoOverwrite for subsequent writes! */
 | 
					 | 
				
			||||||
			0,
 | 
					 | 
				
			||||||
			&subres
 | 
					 | 
				
			||||||
		);
 | 
					 | 
				
			||||||
		ERROR_CHECK_RETURN("Could not map buffer for writing!", );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		SDL_memcpy(
 | 
					 | 
				
			||||||
			(uint8_t*) subres.pData + offsetInBytes,
 | 
					 | 
				
			||||||
			data,
 | 
					 | 
				
			||||||
			dataLength
 | 
					 | 
				
			||||||
		);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		ID3D11DeviceContext_Unmap(
 | 
					 | 
				
			||||||
			commandBuffer->context,
 | 
					 | 
				
			||||||
			(ID3D11Resource*) buffer->handle,
 | 
					 | 
				
			||||||
			0
 | 
					 | 
				
			||||||
		);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		dstBox.left = offsetInBytes;
 | 
					 | 
				
			||||||
		dstBox.right = offsetInBytes + dataLength;
 | 
					 | 
				
			||||||
		dstBox.top = 0;
 | 
					 | 
				
			||||||
		dstBox.bottom = 1;
 | 
					 | 
				
			||||||
		dstBox.front = 0;
 | 
					 | 
				
			||||||
		dstBox.back = 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		ID3D11DeviceContext1_UpdateSubresource1(
 | 
					 | 
				
			||||||
			commandBuffer->context,
 | 
					 | 
				
			||||||
			(ID3D11Resource*) buffer->handle,
 | 
					 | 
				
			||||||
			0,
 | 
					 | 
				
			||||||
			&dstBox,
 | 
					 | 
				
			||||||
			data,
 | 
					 | 
				
			||||||
			dataLength,
 | 
					 | 
				
			||||||
			1,
 | 
					 | 
				
			||||||
			dataLength == buffer->size ? D3D11_COPY_DISCARD : 0
 | 
					 | 
				
			||||||
		);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void D3D11_SetBufferData(
 | 
					static void D3D11_SetBufferData(
 | 
				
			||||||
	Refresh_Renderer *driverData,
 | 
						Refresh_Renderer *driverData,
 | 
				
			||||||
	Refresh_CommandBuffer *commandBuffer,
 | 
						Refresh_CommandBuffer *commandBuffer,
 | 
				
			||||||
| 
						 | 
					@ -1862,14 +1804,19 @@ static void D3D11_SetBufferData(
 | 
				
			||||||
	void* data,
 | 
						void* data,
 | 
				
			||||||
	uint32_t dataLength
 | 
						uint32_t dataLength
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
	D3D11_INTERNAL_SetBufferData(
 | 
						D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
 | 
				
			||||||
		(D3D11Renderer*) driverData,
 | 
						D3D11Buffer *d3d11Buffer = (D3D11Buffer*) buffer;
 | 
				
			||||||
		(D3D11CommandBuffer*) commandBuffer,
 | 
						D3D11_BOX dstBox = { offsetInBytes, 0, 0, offsetInBytes + dataLength, 1, 1 };
 | 
				
			||||||
		(D3D11Buffer*) buffer,
 | 
					
 | 
				
			||||||
		offsetInBytes,
 | 
						ID3D11DeviceContext1_UpdateSubresource1(
 | 
				
			||||||
 | 
							d3d11CommandBuffer->context,
 | 
				
			||||||
 | 
							(ID3D11Resource*) d3d11Buffer->handle,
 | 
				
			||||||
 | 
							0,
 | 
				
			||||||
 | 
							&dstBox,
 | 
				
			||||||
		data,
 | 
							data,
 | 
				
			||||||
		dataLength,
 | 
							dataLength,
 | 
				
			||||||
		0
 | 
							1,
 | 
				
			||||||
 | 
							dataLength == d3d11Buffer->size ? D3D11_COPY_DISCARD : 0
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1975,6 +1922,7 @@ static uint8_t D3D11_INTERNAL_CreateUniformBuffer(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uniformBuffer = SDL_malloc(sizeof(D3D11UniformBuffer));
 | 
						uniformBuffer = SDL_malloc(sizeof(D3D11UniformBuffer));
 | 
				
			||||||
	uniformBuffer->offset = 0;
 | 
						uniformBuffer->offset = 0;
 | 
				
			||||||
 | 
						uniformBuffer->hasDiscarded = 0;
 | 
				
			||||||
	uniformBuffer->d3d11Buffer = SDL_malloc(sizeof(D3D11Buffer));
 | 
						uniformBuffer->d3d11Buffer = SDL_malloc(sizeof(D3D11Buffer));
 | 
				
			||||||
	uniformBuffer->d3d11Buffer->handle = bufferHandle;
 | 
						uniformBuffer->d3d11Buffer->handle = bufferHandle;
 | 
				
			||||||
	uniformBuffer->d3d11Buffer->size = UBO_BUFFER_SIZE;
 | 
						uniformBuffer->d3d11Buffer->size = UBO_BUFFER_SIZE;
 | 
				
			||||||
| 
						 | 
					@ -2024,6 +1972,7 @@ static uint8_t D3D11_INTERNAL_AcquireUniformBuffer(
 | 
				
			||||||
	SDL_UnlockMutex(renderer->uniformBufferLock);
 | 
						SDL_UnlockMutex(renderer->uniformBufferLock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Reset the uniform buffer */
 | 
						/* Reset the uniform buffer */
 | 
				
			||||||
 | 
						uniformBuffer->hasDiscarded = 0;
 | 
				
			||||||
	uniformBuffer->offset = 0;
 | 
						uniformBuffer->offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Bind the uniform buffer to the command buffer */
 | 
						/* Bind the uniform buffer to the command buffer */
 | 
				
			||||||
| 
						 | 
					@ -2043,6 +1992,40 @@ static uint8_t D3D11_INTERNAL_AcquireUniformBuffer(
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void D3D11_INTERNAL_SetUniformBufferData(
 | 
				
			||||||
 | 
						D3D11Renderer *renderer,
 | 
				
			||||||
 | 
						D3D11CommandBuffer *commandBuffer,
 | 
				
			||||||
 | 
						D3D11UniformBuffer *uniformBuffer,
 | 
				
			||||||
 | 
						void* data,
 | 
				
			||||||
 | 
						uint32_t dataLength
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
						D3D11_MAPPED_SUBRESOURCE subres;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT res = ID3D11DeviceContext_Map(
 | 
				
			||||||
 | 
							commandBuffer->context,
 | 
				
			||||||
 | 
							(ID3D11Resource*) uniformBuffer->d3d11Buffer->handle,
 | 
				
			||||||
 | 
							0,
 | 
				
			||||||
 | 
							uniformBuffer->hasDiscarded ? D3D11_MAP_WRITE_NO_OVERWRITE : D3D11_MAP_WRITE_DISCARD,
 | 
				
			||||||
 | 
							0,
 | 
				
			||||||
 | 
							&subres
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
						ERROR_CHECK_RETURN("Could not map buffer for writing!", );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SDL_memcpy(
 | 
				
			||||||
 | 
							(uint8_t*) subres.pData + uniformBuffer->offset,
 | 
				
			||||||
 | 
							data,
 | 
				
			||||||
 | 
							dataLength
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ID3D11DeviceContext_Unmap(
 | 
				
			||||||
 | 
							commandBuffer->context,
 | 
				
			||||||
 | 
							(ID3D11Resource*) uniformBuffer->d3d11Buffer->handle,
 | 
				
			||||||
 | 
							0
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uniformBuffer->hasDiscarded = 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint32_t D3D11_PushVertexShaderUniforms(
 | 
					static uint32_t D3D11_PushVertexShaderUniforms(
 | 
				
			||||||
	Refresh_Renderer *driverData,
 | 
						Refresh_Renderer *driverData,
 | 
				
			||||||
	Refresh_CommandBuffer *commandBuffer,
 | 
						Refresh_CommandBuffer *commandBuffer,
 | 
				
			||||||
| 
						 | 
					@ -2067,14 +2050,12 @@ static uint32_t D3D11_PushVertexShaderUniforms(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	offset = d3d11CommandBuffer->vertexUniformBuffer->offset;
 | 
						offset = d3d11CommandBuffer->vertexUniformBuffer->offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	D3D11_INTERNAL_SetBufferData(
 | 
						D3D11_INTERNAL_SetUniformBufferData(
 | 
				
			||||||
		renderer,
 | 
							renderer,
 | 
				
			||||||
		d3d11CommandBuffer,
 | 
							d3d11CommandBuffer,
 | 
				
			||||||
		d3d11CommandBuffer->vertexUniformBuffer->d3d11Buffer,
 | 
							d3d11CommandBuffer->vertexUniformBuffer,
 | 
				
			||||||
		d3d11CommandBuffer->vertexUniformBuffer->offset,
 | 
					 | 
				
			||||||
		data,
 | 
							data,
 | 
				
			||||||
		dataLengthInBytes,
 | 
							dataLengthInBytes
 | 
				
			||||||
		1
 | 
					 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	d3d11CommandBuffer->vertexUniformBuffer->offset += graphicsPipeline->vertexUniformBlockSize;
 | 
						d3d11CommandBuffer->vertexUniformBuffer->offset += graphicsPipeline->vertexUniformBlockSize;
 | 
				
			||||||
| 
						 | 
					@ -2106,14 +2087,12 @@ static uint32_t D3D11_PushFragmentShaderUniforms(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	offset = d3d11CommandBuffer->fragmentUniformBuffer->offset;
 | 
						offset = d3d11CommandBuffer->fragmentUniformBuffer->offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	D3D11_INTERNAL_SetBufferData(
 | 
						D3D11_INTERNAL_SetUniformBufferData(
 | 
				
			||||||
		renderer,
 | 
							renderer,
 | 
				
			||||||
		d3d11CommandBuffer,
 | 
							d3d11CommandBuffer,
 | 
				
			||||||
		d3d11CommandBuffer->fragmentUniformBuffer->d3d11Buffer,
 | 
							d3d11CommandBuffer->fragmentUniformBuffer,
 | 
				
			||||||
		d3d11CommandBuffer->fragmentUniformBuffer->offset,
 | 
					 | 
				
			||||||
		data,
 | 
							data,
 | 
				
			||||||
		dataLengthInBytes,
 | 
							dataLengthInBytes
 | 
				
			||||||
		1
 | 
					 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	d3d11CommandBuffer->fragmentUniformBuffer->offset += graphicsPipeline->fragmentUniformBlockSize;
 | 
						d3d11CommandBuffer->fragmentUniformBuffer->offset += graphicsPipeline->fragmentUniformBlockSize;
 | 
				
			||||||
| 
						 | 
					@ -2145,14 +2124,12 @@ static uint32_t D3D11_PushComputeShaderUniforms(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	offset = d3d11CommandBuffer->computeUniformBuffer->offset;
 | 
						offset = d3d11CommandBuffer->computeUniformBuffer->offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	D3D11_INTERNAL_SetBufferData(
 | 
						D3D11_INTERNAL_SetUniformBufferData(
 | 
				
			||||||
		renderer,
 | 
							renderer,
 | 
				
			||||||
		d3d11CommandBuffer,
 | 
							d3d11CommandBuffer,
 | 
				
			||||||
		d3d11CommandBuffer->computeUniformBuffer->d3d11Buffer,
 | 
							d3d11CommandBuffer->computeUniformBuffer,
 | 
				
			||||||
		d3d11CommandBuffer->computeUniformBuffer->offset,
 | 
					 | 
				
			||||||
		data,
 | 
							data,
 | 
				
			||||||
		dataLengthInBytes,
 | 
							dataLengthInBytes
 | 
				
			||||||
		1
 | 
					 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	d3d11CommandBuffer->computeUniformBuffer->offset += (uint32_t) computePipeline->computeUniformBlockSize; /* FIXME: Is this cast safe? */
 | 
						d3d11CommandBuffer->computeUniformBuffer->offset += (uint32_t) computePipeline->computeUniformBlockSize; /* FIXME: Is this cast safe? */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue