Implemented AcquireCommandBuffer (from old D3D11 work)
							parent
							
								
									0e5da8a2ea
								
							
						
					
					
						commit
						8c98889f46
					
				| 
						 | 
					@ -65,6 +65,24 @@
 | 
				
			||||||
		return ret; \
 | 
							return ret; \
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define EXPAND_ELEMENTS_IF_NEEDED(arr, initialValue, type)	\
 | 
				
			||||||
 | 
						if (arr->count == arr->capacity)			\
 | 
				
			||||||
 | 
						{							\
 | 
				
			||||||
 | 
							if (arr->capacity == 0)				\
 | 
				
			||||||
 | 
							{						\
 | 
				
			||||||
 | 
								arr->capacity = initialValue;		\
 | 
				
			||||||
 | 
							}						\
 | 
				
			||||||
 | 
							else						\
 | 
				
			||||||
 | 
							{						\
 | 
				
			||||||
 | 
								arr->capacity *= 2;			\
 | 
				
			||||||
 | 
							}						\
 | 
				
			||||||
 | 
							arr->elements = (type*) SDL_realloc(		\
 | 
				
			||||||
 | 
								arr->elements,				\
 | 
				
			||||||
 | 
								arr->capacity * sizeof(type)		\
 | 
				
			||||||
 | 
							);						\
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* D3DCompile signature */
 | 
					/* D3DCompile signature */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef HRESULT(WINAPI *PFN_D3DCOMPILE)(
 | 
					typedef HRESULT(WINAPI *PFN_D3DCOMPILE)(
 | 
				
			||||||
| 
						 | 
					@ -233,18 +251,42 @@ static D3D11_TEXTURE_ADDRESS_MODE RefreshToD3D11_SamplerAddressMode[] =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Structs */
 | 
					/* Structs */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SwapchainData
 | 
					typedef struct D3D11SwapchainData
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	IDXGISwapChain *swapchain;
 | 
						IDXGISwapChain *swapchain;
 | 
				
			||||||
	ID3D11RenderTargetView *swapchainRTView;
 | 
						ID3D11RenderTargetView *swapchainRTView;
 | 
				
			||||||
} SwapchainData;
 | 
					} D3D11SwapchainData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct WindowData
 | 
					typedef struct D3D11WindowData
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	void* windowHandle;
 | 
						void* windowHandle;
 | 
				
			||||||
	uint8_t allowTearing;
 | 
						uint8_t allowTearing;
 | 
				
			||||||
	SwapchainData *swapchainData;
 | 
						D3D11SwapchainData *swapchainData;
 | 
				
			||||||
} WindowData;
 | 
					} D3D11WindowData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct D3D11CommandBuffer
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* D3D11 Object References */
 | 
				
			||||||
 | 
						ID3D11DeviceContext *context;
 | 
				
			||||||
 | 
						ID3D11CommandList *commandList;
 | 
				
			||||||
 | 
						D3D11SwapchainData *swapchainData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Render Pass */
 | 
				
			||||||
 | 
						uint8_t numBoundColorAttachments;
 | 
				
			||||||
 | 
						ID3D11RenderTargetView *rtViews[MAX_COLOR_TARGET_BINDINGS];
 | 
				
			||||||
 | 
						ID3D11DepthStencilView* dsView;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* State */
 | 
				
			||||||
 | 
						SDL_threadID threadID;
 | 
				
			||||||
 | 
						uint8_t recording;
 | 
				
			||||||
 | 
					} D3D11CommandBuffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct D3D11CommandBufferPool
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						D3D11CommandBuffer **elements;
 | 
				
			||||||
 | 
						uint32_t count;
 | 
				
			||||||
 | 
						uint32_t capacity;
 | 
				
			||||||
 | 
					} D3D11CommandBufferPool;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct D3D11Renderer
 | 
					typedef struct D3D11Renderer
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -260,9 +302,12 @@ typedef struct D3D11Renderer
 | 
				
			||||||
	D3D_FEATURE_LEVEL featureLevel; /* FIXME: Do we need this? */
 | 
						D3D_FEATURE_LEVEL featureLevel; /* FIXME: Do we need this? */
 | 
				
			||||||
	PFN_D3DCOMPILE D3DCompileFunc;
 | 
						PFN_D3DCOMPILE D3DCompileFunc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WindowData **claimedWindows;
 | 
						D3D11WindowData **claimedWindows;
 | 
				
			||||||
	uint32_t claimedWindowCount;
 | 
						uint32_t claimedWindowCount;
 | 
				
			||||||
	uint32_t claimedWindowCapacity;
 | 
						uint32_t claimedWindowCapacity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						D3D11CommandBufferPool *commandBufferPool;
 | 
				
			||||||
 | 
						SDL_mutex *commandBufferAcquisitionMutex;
 | 
				
			||||||
} D3D11Renderer;
 | 
					} D3D11Renderer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Logging */
 | 
					/* Logging */
 | 
				
			||||||
| 
						 | 
					@ -616,8 +661,72 @@ static void D3D11_QueueDestroyGraphicsPipeline(
 | 
				
			||||||
static Refresh_CommandBuffer* D3D11_AcquireCommandBuffer(
 | 
					static Refresh_CommandBuffer* D3D11_AcquireCommandBuffer(
 | 
				
			||||||
	Refresh_Renderer *driverData
 | 
						Refresh_Renderer *driverData
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
	NOT_IMPLEMENTED
 | 
						D3D11Renderer *renderer = (D3D11Renderer*) driverData;
 | 
				
			||||||
	return NULL;
 | 
						D3D11CommandBuffer *commandBuffer = NULL;
 | 
				
			||||||
 | 
						uint32_t i;
 | 
				
			||||||
 | 
						HRESULT res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Make sure multiple threads can't acquire the same command buffer. */
 | 
				
			||||||
 | 
						SDL_LockMutex(renderer->commandBufferAcquisitionMutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Try to use an existing command buffer, if one is available. */
 | 
				
			||||||
 | 
						for (i = 0; i < renderer->commandBufferPool->count; i += 1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Search for a command buffer in the pool that is not recording. */
 | 
				
			||||||
 | 
							if (!renderer->commandBufferPool->elements[i]->recording)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								commandBuffer = renderer->commandBufferPool->elements[i];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* If there are no free command buffers, make a new one. */
 | 
				
			||||||
 | 
						if (commandBuffer == NULL)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							/* Expand the capacity as needed */
 | 
				
			||||||
 | 
							EXPAND_ELEMENTS_IF_NEEDED(
 | 
				
			||||||
 | 
								renderer->commandBufferPool,
 | 
				
			||||||
 | 
								2,
 | 
				
			||||||
 | 
								D3D11CommandBuffer*
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Create a new command buffer */
 | 
				
			||||||
 | 
							renderer->commandBufferPool->elements[i] = (D3D11CommandBuffer*) SDL_malloc(
 | 
				
			||||||
 | 
								sizeof(D3D11CommandBuffer)
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Assign it a new deferred context */
 | 
				
			||||||
 | 
							res = ID3D11Device_CreateDeferredContext(
 | 
				
			||||||
 | 
								renderer->device,
 | 
				
			||||||
 | 
								0,
 | 
				
			||||||
 | 
								&renderer->commandBufferPool->elements[i]->context
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
 | 
							if (FAILED(res))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								SDL_UnlockMutex(renderer->commandBufferAcquisitionMutex);
 | 
				
			||||||
 | 
								ERROR_CHECK_RETURN("Could not create deferred context for command buffer", NULL);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Now we have a new command buffer we can use! */
 | 
				
			||||||
 | 
							commandBuffer = renderer->commandBufferPool->elements[i];
 | 
				
			||||||
 | 
							renderer->commandBufferPool->count += 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Set up the command buffer */
 | 
				
			||||||
 | 
						commandBuffer->threadID = SDL_ThreadID();
 | 
				
			||||||
 | 
						commandBuffer->recording = 1;
 | 
				
			||||||
 | 
						commandBuffer->swapchainData = NULL;
 | 
				
			||||||
 | 
						commandBuffer->commandList = NULL;
 | 
				
			||||||
 | 
						commandBuffer->dsView = NULL;
 | 
				
			||||||
 | 
						commandBuffer->numBoundColorAttachments = 0;
 | 
				
			||||||
 | 
						for (i = 0; i < MAX_COLOR_TARGET_BINDINGS; i += 1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							commandBuffer->rtViews[i] = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SDL_UnlockMutex(renderer->commandBufferAcquisitionMutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (Refresh_CommandBuffer*) commandBuffer;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void D3D11_BeginRenderPass(
 | 
					static void D3D11_BeginRenderPass(
 | 
				
			||||||
| 
						 | 
					@ -710,10 +819,10 @@ static void D3D11_BindComputeTextures(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Window and Swapchain Management */
 | 
					/* Window and Swapchain Management */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static WindowData* D3D11_INTERNAL_FetchWindowData(
 | 
					static D3D11WindowData* D3D11_INTERNAL_FetchWindowData(
 | 
				
			||||||
	void *windowHandle
 | 
						void *windowHandle
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
	return (WindowData*) SDL_GetWindowData(windowHandle, WINDOW_DATA);
 | 
						return (D3D11WindowData*) SDL_GetWindowData(windowHandle, WINDOW_DATA);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void D3D11_INTERNAL_ResolveSwapChainModeDescription(
 | 
					static void D3D11_INTERNAL_ResolveSwapChainModeDescription(
 | 
				
			||||||
| 
						 | 
					@ -755,7 +864,7 @@ static void D3D11_INTERNAL_ResolveSwapChainModeDescription(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint8_t D3D11_INTERNAL_CreateSwapchain(
 | 
					static uint8_t D3D11_INTERNAL_CreateSwapchain(
 | 
				
			||||||
	D3D11Renderer *renderer,
 | 
						D3D11Renderer *renderer,
 | 
				
			||||||
	WindowData *windowData
 | 
						D3D11WindowData *windowData
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
	SDL_SysWMinfo info;
 | 
						SDL_SysWMinfo info;
 | 
				
			||||||
	HWND dxgiHandle;
 | 
						HWND dxgiHandle;
 | 
				
			||||||
| 
						 | 
					@ -763,7 +872,7 @@ static uint8_t D3D11_INTERNAL_CreateSwapchain(
 | 
				
			||||||
	DXGI_SWAP_CHAIN_DESC swapchainDesc;
 | 
						DXGI_SWAP_CHAIN_DESC swapchainDesc;
 | 
				
			||||||
	IDXGIFactory1 *pParent;
 | 
						IDXGIFactory1 *pParent;
 | 
				
			||||||
	IDXGISwapChain *swapchain;
 | 
						IDXGISwapChain *swapchain;
 | 
				
			||||||
	SwapchainData *swapchainData;
 | 
						D3D11SwapchainData *swapchainData;
 | 
				
			||||||
	HRESULT res;
 | 
						HRESULT res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Get the DXGI handle */
 | 
						/* Get the DXGI handle */
 | 
				
			||||||
| 
						 | 
					@ -847,7 +956,7 @@ static uint8_t D3D11_INTERNAL_CreateSwapchain(
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Create the swapchain data */
 | 
						/* Create the swapchain data */
 | 
				
			||||||
	swapchainData = (SwapchainData*) SDL_malloc(sizeof(SwapchainData));
 | 
						swapchainData = (D3D11SwapchainData*) SDL_malloc(sizeof(D3D11SwapchainData));
 | 
				
			||||||
	swapchainData->swapchain = swapchain;
 | 
						swapchainData->swapchain = swapchain;
 | 
				
			||||||
	swapchainData->swapchainRTView = NULL;
 | 
						swapchainData->swapchainRTView = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -861,11 +970,11 @@ static uint8_t D3D11_ClaimWindow(
 | 
				
			||||||
	Refresh_PresentMode presentMode
 | 
						Refresh_PresentMode presentMode
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
	D3D11Renderer *renderer = (D3D11Renderer*) driverData;
 | 
						D3D11Renderer *renderer = (D3D11Renderer*) driverData;
 | 
				
			||||||
	WindowData *windowData = D3D11_INTERNAL_FetchWindowData(windowHandle);
 | 
						D3D11WindowData *windowData = D3D11_INTERNAL_FetchWindowData(windowHandle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (windowData == NULL)
 | 
						if (windowData == NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		windowData = (WindowData*) SDL_malloc(sizeof(WindowData));
 | 
							windowData = (D3D11WindowData*) SDL_malloc(sizeof(D3D11WindowData));
 | 
				
			||||||
		windowData->windowHandle = windowHandle;
 | 
							windowData->windowHandle = windowHandle;
 | 
				
			||||||
		windowData->allowTearing = presentMode == REFRESH_PRESENTMODE_IMMEDIATE;
 | 
							windowData->allowTearing = presentMode == REFRESH_PRESENTMODE_IMMEDIATE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -878,7 +987,7 @@ static uint8_t D3D11_ClaimWindow(
 | 
				
			||||||
				renderer->claimedWindowCapacity *= 2;
 | 
									renderer->claimedWindowCapacity *= 2;
 | 
				
			||||||
				renderer->claimedWindows = SDL_realloc(
 | 
									renderer->claimedWindows = SDL_realloc(
 | 
				
			||||||
					renderer->claimedWindows,
 | 
										renderer->claimedWindows,
 | 
				
			||||||
					renderer->claimedWindowCapacity * sizeof(WindowData*)
 | 
										renderer->claimedWindowCapacity * sizeof(D3D11WindowData*)
 | 
				
			||||||
				);
 | 
									);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1227,6 +1336,15 @@ tryCreateDevice:
 | 
				
			||||||
	Refresh_LogInfo("Refresh Driver: D3D11");
 | 
						Refresh_LogInfo("Refresh Driver: D3D11");
 | 
				
			||||||
	Refresh_LogInfo("D3D11 Adapter: %S", adapterDesc.Description);
 | 
						Refresh_LogInfo("D3D11 Adapter: %S", adapterDesc.Description);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Create the command buffer pool */
 | 
				
			||||||
 | 
						renderer->commandBufferPool = (D3D11CommandBufferPool*) SDL_calloc(
 | 
				
			||||||
 | 
							1,
 | 
				
			||||||
 | 
							sizeof(D3D11CommandBufferPool)
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Create mutexes */
 | 
				
			||||||
 | 
						renderer->commandBufferAcquisitionMutex = SDL_CreateMutex();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Initialize miscellaneous renderer members */
 | 
						/* Initialize miscellaneous renderer members */
 | 
				
			||||||
	renderer->debugMode = (flags & D3D11_CREATE_DEVICE_DEBUG);
 | 
						renderer->debugMode = (flags & D3D11_CREATE_DEVICE_DEBUG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue