More swapchain setup
							parent
							
								
									433c70eb8c
								
							
						
					
					
						commit
						287d3a7a6e
					
				|  | @ -251,10 +251,36 @@ static D3D11_TEXTURE_ADDRESS_MODE RefreshToD3D11_SamplerAddressMode[] = | ||||||
| 
 | 
 | ||||||
| /* Structs */ | /* Structs */ | ||||||
| 
 | 
 | ||||||
|  | typedef struct D3D11Texture | ||||||
|  | { | ||||||
|  | 	/* D3D Handles */ | ||||||
|  | 	ID3D11Resource *handle; /* ID3D11Texture2D* or ID3D11Texture3D* */ | ||||||
|  | 	ID3D11ShaderResourceView *shaderView; | ||||||
|  | 
 | ||||||
|  | 	/* Basic Info */ | ||||||
|  | 	uint32_t levelCount; | ||||||
|  | 	uint8_t isRenderTarget; | ||||||
|  | 
 | ||||||
|  | 	/* Dimensions*/ | ||||||
|  | 	#define REFRESH_D3D11_RENDERTARGET_2D 0 | ||||||
|  | 	#define REFRESH_D3D11_RENDERTARGET_3D 1 | ||||||
|  | 	#define REFRESH_D3D11_RENDERTARGET_CUBE 2 | ||||||
|  | 	uint8_t rtType; | ||||||
|  | 	REFRESHNAMELESS union | ||||||
|  | 	{ | ||||||
|  | 		struct | ||||||
|  | 		{ | ||||||
|  | 			uint32_t width; | ||||||
|  | 			uint32_t height; | ||||||
|  | 			ID3D11View *targetView; /* ID3D11RenderTargetView* or ID3D11DepthStencilView* */ | ||||||
|  | 		} twod; | ||||||
|  | 	}; | ||||||
|  | } D3D11Texture; | ||||||
|  | 
 | ||||||
| typedef struct D3D11SwapchainData | typedef struct D3D11SwapchainData | ||||||
| { | { | ||||||
| 	IDXGISwapChain *swapchain; | 	IDXGISwapChain *swapchain; | ||||||
| 	ID3D11RenderTargetView *swapchainRTView; | 	D3D11Texture texture; | ||||||
| } D3D11SwapchainData; | } D3D11SwapchainData; | ||||||
| 
 | 
 | ||||||
| typedef struct D3D11WindowData | typedef struct D3D11WindowData | ||||||
|  | @ -825,12 +851,73 @@ static D3D11WindowData* D3D11_INTERNAL_FetchWindowData( | ||||||
| 	return (D3D11WindowData*) SDL_GetWindowData(windowHandle, WINDOW_DATA); | 	return (D3D11WindowData*) SDL_GetWindowData(windowHandle, WINDOW_DATA); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static uint8_t D3D11_INTERNAL_InitializeSwapchainTexture( | ||||||
|  | 	D3D11Renderer *renderer, | ||||||
|  | 	IDXGISwapChain *swapchain, | ||||||
|  | 	D3D11Texture *pTexture | ||||||
|  | ) { | ||||||
|  | 	ID3D11Texture2D *swapchainTexture; | ||||||
|  | 	D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; | ||||||
|  | 	D3D11_TEXTURE2D_DESC textureDesc; | ||||||
|  | 	HRESULT res; | ||||||
|  | 
 | ||||||
|  | 	/* Clear all the texture data */ | ||||||
|  | 	SDL_zerop(pTexture); | ||||||
|  | 
 | ||||||
|  | 	/* Grab the buffer from the swapchain */ | ||||||
|  | 	res = IDXGISwapChain_GetBuffer( | ||||||
|  | 		swapchain, | ||||||
|  | 		0, | ||||||
|  | 		&D3D_IID_ID3D11Texture2D, | ||||||
|  | 		(void**) &swapchainTexture | ||||||
|  | 	); | ||||||
|  | 	ERROR_CHECK_RETURN("Could not get buffer from swapchain!", 0); | ||||||
|  | 
 | ||||||
|  | 	/* Create the RTV for the swapchain */ | ||||||
|  | 	rtvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; | ||||||
|  | 	rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; | ||||||
|  | 	rtvDesc.Texture2D.MipSlice = 0; | ||||||
|  | 
 | ||||||
|  | 	res = ID3D11Device_CreateRenderTargetView( | ||||||
|  | 		renderer->device, | ||||||
|  | 		(ID3D11Resource*) swapchainTexture, | ||||||
|  | 		&rtvDesc, | ||||||
|  | 		(ID3D11RenderTargetView**) &pTexture->twod.targetView | ||||||
|  | 	); | ||||||
|  | 	if (FAILED(res)) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError( | ||||||
|  | 			"Swapchain RTV creation failed. Error Code: %08X", | ||||||
|  | 			res | ||||||
|  | 		); | ||||||
|  | 		ID3D11Texture2D_Release(swapchainTexture); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Fill out the rest of the texture struct */ | ||||||
|  | 	pTexture->handle = NULL; | ||||||
|  | 	pTexture->shaderView = NULL; | ||||||
|  | 	pTexture->isRenderTarget = 1; | ||||||
|  | 	pTexture->rtType = REFRESH_D3D11_RENDERTARGET_2D; | ||||||
|  | 
 | ||||||
|  | 	ID3D11Texture2D_GetDesc(swapchainTexture, &textureDesc); | ||||||
|  | 	pTexture->levelCount = textureDesc.MipLevels; | ||||||
|  | 	pTexture->twod.width = textureDesc.Width; | ||||||
|  | 	pTexture->twod.height = textureDesc.Height; | ||||||
|  | 
 | ||||||
|  | 	/* Cleanup */ | ||||||
|  | 	ID3D11Texture2D_Release(swapchainTexture); | ||||||
|  | 
 | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static uint8_t D3D11_INTERNAL_CreateSwapchain( | static uint8_t D3D11_INTERNAL_CreateSwapchain( | ||||||
| 	D3D11Renderer *renderer, | 	D3D11Renderer *renderer, | ||||||
| 	D3D11WindowData *windowData | 	D3D11WindowData *windowData | ||||||
| ) { | ) { | ||||||
| 	SDL_SysWMinfo info; | 	SDL_SysWMinfo info; | ||||||
| 	HWND dxgiHandle; | 	HWND dxgiHandle; | ||||||
|  | 	int width, height; | ||||||
| 	DXGI_SWAP_CHAIN_DESC swapchainDesc; | 	DXGI_SWAP_CHAIN_DESC swapchainDesc; | ||||||
| 	IDXGIFactory1 *pParent; | 	IDXGIFactory1 *pParent; | ||||||
| 	IDXGISwapChain *swapchain; | 	IDXGISwapChain *swapchain; | ||||||
|  | @ -842,6 +929,9 @@ static uint8_t D3D11_INTERNAL_CreateSwapchain( | ||||||
| 	SDL_GetWindowWMInfo((SDL_Window*) windowData->windowHandle, &info); | 	SDL_GetWindowWMInfo((SDL_Window*) windowData->windowHandle, &info); | ||||||
| 	dxgiHandle = info.info.win.window; | 	dxgiHandle = info.info.win.window; | ||||||
| 
 | 
 | ||||||
|  | 	/* Get the window size */ | ||||||
|  | 	SDL_GetWindowSize((SDL_Window*) windowData->windowHandle, &width, &height); | ||||||
|  | 
 | ||||||
| 	/* Initialize the swapchain buffer descriptor */ | 	/* Initialize the swapchain buffer descriptor */ | ||||||
| 	swapchainDesc.BufferDesc.Width = 0; | 	swapchainDesc.BufferDesc.Width = 0; | ||||||
| 	swapchainDesc.BufferDesc.Height = 0; | 	swapchainDesc.BufferDesc.Height = 0; | ||||||
|  | @ -880,7 +970,7 @@ static uint8_t D3D11_INTERNAL_CreateSwapchain( | ||||||
| 	res = IDXGISwapChain_GetParent( | 	res = IDXGISwapChain_GetParent( | ||||||
| 		swapchain, | 		swapchain, | ||||||
| 		&D3D_IID_IDXGIFactory1, | 		&D3D_IID_IDXGIFactory1, | ||||||
| 		(void**) &pParent | 		(void**) &pParent /* FIXME: Does pParent need to get released? (Same for FNA3D) */ | ||||||
| 	); | 	); | ||||||
| 	if (FAILED(res)) | 	if (FAILED(res)) | ||||||
| 	{ | 	{ | ||||||
|  | @ -909,12 +999,52 @@ static uint8_t D3D11_INTERNAL_CreateSwapchain( | ||||||
| 	/* Create the swapchain data */ | 	/* Create the swapchain data */ | ||||||
| 	swapchainData = (D3D11SwapchainData*) SDL_malloc(sizeof(D3D11SwapchainData)); | 	swapchainData = (D3D11SwapchainData*) SDL_malloc(sizeof(D3D11SwapchainData)); | ||||||
| 	swapchainData->swapchain = swapchain; | 	swapchainData->swapchain = swapchain; | ||||||
| 	swapchainData->swapchainRTView = NULL; | 
 | ||||||
|  | 	if (!D3D11_INTERNAL_InitializeSwapchainTexture( | ||||||
|  | 		renderer, | ||||||
|  | 		swapchain, | ||||||
|  | 		&swapchainData->texture | ||||||
|  | 	)) { | ||||||
|  | 		SDL_free(swapchainData); | ||||||
|  | 		IDXGISwapChain_Release(swapchain); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	windowData->swapchainData = swapchainData; | 	windowData->swapchainData = swapchainData; | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static uint8_t D3D11_INTERNAL_ResizeSwapchain( | ||||||
|  | 	D3D11Renderer *renderer, | ||||||
|  | 	D3D11SwapchainData *swapchainData, | ||||||
|  | 	int32_t width, | ||||||
|  | 	int32_t height | ||||||
|  | ) { | ||||||
|  | 	HRESULT res; | ||||||
|  | 
 | ||||||
|  | 	/* Release the old RTV */ | ||||||
|  | 	ID3D11RenderTargetView_Release(swapchainData->texture.twod.targetView); | ||||||
|  | 
 | ||||||
|  | 	/* Resize the swapchain */ | ||||||
|  | 	res = IDXGISwapChain_ResizeBuffers( | ||||||
|  | 		swapchainData->swapchain, | ||||||
|  | 		0,			/* Keep buffer count the same */ | ||||||
|  | 		width, | ||||||
|  | 		height, | ||||||
|  | 		DXGI_FORMAT_UNKNOWN,	/* Keep the old format */ | ||||||
|  | 		0 | ||||||
|  | 	); | ||||||
|  | 	ERROR_CHECK_RETURN("Could not resize swapchain buffers", 0); | ||||||
|  | 
 | ||||||
|  | 	/* Create the Refresh-side texture for the swapchain */ | ||||||
|  | 	return D3D11_INTERNAL_InitializeSwapchainTexture( | ||||||
|  | 		renderer, | ||||||
|  | 		swapchainData->swapchain, | ||||||
|  | 		&swapchainData->texture | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| static uint8_t D3D11_ClaimWindow( | static uint8_t D3D11_ClaimWindow( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	void *windowHandle, | 	void *windowHandle, | ||||||
|  | @ -976,10 +1106,47 @@ static Refresh_Texture* D3D11_AcquireSwapchainTexture( | ||||||
| 	uint32_t *pWidth, | 	uint32_t *pWidth, | ||||||
| 	uint32_t *pHeight | 	uint32_t *pHeight | ||||||
| ) { | ) { | ||||||
| 	NOT_IMPLEMENTED | 	D3D11Renderer *renderer = (D3D11Renderer*) driverData; | ||||||
|  | 	D3D11CommandBuffer *cmdbuf = (D3D11CommandBuffer*) commandBuffer; | ||||||
|  | 	D3D11SwapchainData *swapchainData; | ||||||
|  | 	DXGI_SWAP_CHAIN_DESC swapchainDesc; | ||||||
|  | 	int w, h; | ||||||
|  | 	HRESULT res; | ||||||
|  | 
 | ||||||
|  | 	/* Fetch the window and swapchain data. */ | ||||||
|  | 	swapchainData = D3D11_INTERNAL_FetchWindowData(windowHandle)->swapchainData; | ||||||
|  | 	if (swapchainData == NULL) | ||||||
|  | 	{ | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/* Check for window size changes and resize the swapchain if needed. */ | ||||||
|  | 	IDXGISwapChain_GetDesc(swapchainData->swapchain, &swapchainDesc); | ||||||
|  | 	SDL_GetWindowSize((SDL_Window*) windowHandle, &w, &h); | ||||||
|  | 
 | ||||||
|  | 	if (w != swapchainDesc.BufferDesc.Width || h != swapchainDesc.BufferDesc.Height) | ||||||
|  | 	{ | ||||||
|  | 		res = D3D11_INTERNAL_ResizeSwapchain( | ||||||
|  | 			renderer, | ||||||
|  | 			swapchainData, | ||||||
|  | 			w, | ||||||
|  | 			h | ||||||
|  | 		); | ||||||
|  | 		ERROR_CHECK_RETURN("Could not resize swapchain", NULL); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Let the command buffer know it's associated with this swapchain. */ | ||||||
|  | 	cmdbuf->swapchainData = swapchainData; | ||||||
|  | 
 | ||||||
|  | 	/* Send the dimensions to the out parameters. */ | ||||||
|  | 	*pWidth = swapchainData->texture.twod.width; | ||||||
|  | 	*pHeight = swapchainData->texture.twod.height; | ||||||
|  | 
 | ||||||
|  | 	/* Return the swapchain texture */ | ||||||
|  | 	return (Refresh_Texture*) &swapchainData->texture; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static Refresh_TextureFormat D3D11_GetSwapchainFormat( | static Refresh_TextureFormat D3D11_GetSwapchainFormat( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	void *windowHandle | 	void *windowHandle | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue