forked from MoonsideGames/Refresh
				
			Remove old stuff, flesh out PrepareDriver
							parent
							
								
									8fca9089ec
								
							
						
					
					
						commit
						a98fccf8f9
					
				|  | @ -43,6 +43,9 @@ | |||
| 
 | ||||
| #define D3D11_DLL "d3d11.dll" | ||||
| #define DXGI_DLL "dxgi.dll" | ||||
| #define D3D11_CREATE_DEVICE_FUNC "D3D11CreateDevice" | ||||
| #define D3DCOMPILE_FUNC "D3DCompile" | ||||
| #define CREATE_DXGI_FACTORY1_FUNC "CreateDXGIFactory1" | ||||
| #define WINDOW_SWAPCHAIN_DATA "Refresh_D3D11Swapchain" | ||||
| 
 | ||||
| #define NOT_IMPLEMENTED SDL_assert(0 && "Not implemented!"); | ||||
|  | @ -230,129 +233,15 @@ static D3D11_TEXTURE_ADDRESS_MODE RefreshToD3D11_SamplerAddressMode[] = | |||
| 
 | ||||
| /* Structs */ | ||||
| 
 | ||||
| typedef struct D3D11Texture | ||||
| { | ||||
| 	/* D3D Handles */ | ||||
| 	ID3D11Resource *handle; /* ID3D11Texture2D* or ID3D11Texture3D* */ | ||||
| 	ID3D11ShaderResourceView *shaderView; | ||||
| 
 | ||||
| 	/* Basic Info */ | ||||
| 	int32_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 | ||||
| 		{ | ||||
| 			int32_t width; | ||||
| 			int32_t height; | ||||
| 			ID3D11View *targetView;	/* ID3D11RenderTargetView* or ID3D11DepthStencilView* */ | ||||
| 		} twod; | ||||
| 		struct | ||||
| 		{ | ||||
| 			int32_t width; | ||||
| 			int32_t height; | ||||
| 			int32_t depth; | ||||
| 		} threed; | ||||
| 		struct | ||||
| 		{ | ||||
| 			int32_t size; | ||||
| 			ID3D11RenderTargetView **rtViews; | ||||
| 		} cube; | ||||
| 	}; | ||||
| } D3D11Texture; | ||||
| 
 | ||||
| typedef struct D3D11Buffer | ||||
| { | ||||
| 	ID3D11Buffer *handle; | ||||
| } D3D11Buffer; | ||||
| 
 | ||||
| typedef struct D3D11SwapchainData | ||||
| { | ||||
| 	IDXGISwapChain* swapchain; | ||||
| 	D3D11Texture refreshTexture; | ||||
| 	void* windowHandle; | ||||
| } D3D11SwapchainData; | ||||
| 
 | ||||
| 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 D3D11ShaderModule | ||||
| { | ||||
| 	ID3D11DeviceChild *shader; /* ID3D11VertexShader, ID3D11PixelShader, ID3D11ComputeShader */ | ||||
| 	ID3D10Blob *blob; | ||||
| 	char *shaderSource; | ||||
| 	size_t shaderSourceLength; | ||||
| } D3D11ShaderModule; | ||||
| 
 | ||||
| typedef struct D3D11GraphicsPipeline | ||||
| { | ||||
| 	float blendConstants[4]; | ||||
| 
 | ||||
| 	int32_t numColorAttachments; | ||||
| 	int32_t colorAttachmentSampleCounts[MAX_COLOR_TARGET_BINDINGS]; | ||||
| 	DXGI_FORMAT colorAttachmentFormats[MAX_COLOR_TARGET_BINDINGS]; | ||||
| 	ID3D11BlendState *colorAttachmentBlendState; | ||||
| 
 | ||||
| 	uint8_t hasDepthStencilAttachment; | ||||
| 	DXGI_FORMAT depthStencilAttachmentFormat; | ||||
| 
 | ||||
| 	D3D11_PRIMITIVE_TOPOLOGY primitiveTopology; | ||||
| 	uint32_t stencilRef; | ||||
| 	ID3D11DepthStencilState *depthStencilState; | ||||
| 	ID3D11RasterizerState *rasterizerState; | ||||
| 	ID3D11InputLayout *inputLayout; | ||||
| 
 | ||||
| 	Refresh_MultisampleState multisampleState; | ||||
| 	ID3D11VertexShader *vertexShader; | ||||
| 	ID3D11PixelShader *fragmentShader; | ||||
| } D3D11GraphicsPipeline; | ||||
| 
 | ||||
| typedef struct D3D11Renderer | ||||
| { | ||||
| 	ID3D11Device *device; | ||||
| 	ID3D11DeviceContext *immediateContext; | ||||
| 	IDXGIFactory1 *factory; | ||||
| 	IDXGIAdapter1* adapter; | ||||
| 	IDXGIAdapter1 *adapter; | ||||
| 	void *d3d11_dll; | ||||
| 	void *dxgi_dll; | ||||
| 	void *d3dcompiler_dll; | ||||
| 	SDL_mutex *contextLock; | ||||
| 
 | ||||
| 	D3D11CommandBufferPool *commandBufferPool; | ||||
| 	SDL_mutex *commandBufferAcquisitionMutex; | ||||
| 
 | ||||
| 	D3D11SwapchainData** swapchainDatas; | ||||
| 	uint32_t swapchainDataCount; | ||||
| 	uint32_t swapchainDataCapacity; | ||||
| 
 | ||||
| 	Refresh_Vec4 blendFactor; | ||||
| 
 | ||||
| 	uint8_t debugMode; | ||||
| 	D3D_FEATURE_LEVEL featureLevel; | ||||
|  | @ -900,7 +789,99 @@ static void D3D11_ReleaseFence( | |||
| static uint8_t D3D11_PrepareDriver( | ||||
| 	uint32_t *flags | ||||
| ) { | ||||
| 	/* Nothing to do here. */ | ||||
| 	void *d3d11_dll, *d3dcompiler_dll, *dxgi_dll; | ||||
| 	PFN_D3D11_CREATE_DEVICE D3D11CreateDeviceFunc; | ||||
| 	D3D_FEATURE_LEVEL levels[] = { D3D_FEATURE_LEVEL_11_0 }; | ||||
| 	PFN_D3DCOMPILE D3DCompileFunc; | ||||
| 	PFN_CREATE_DXGI_FACTORY1 CreateDXGIFactoryFunc; | ||||
| 	HRESULT res; | ||||
| 
 | ||||
| 	/* Can we load D3D11? */ | ||||
| 
 | ||||
| 	d3d11_dll = SDL_LoadObject(D3D11_DLL); | ||||
| 	if (d3d11_dll == NULL) | ||||
| 	{ | ||||
| 		Refresh_LogWarn("D3D11: Could not find " D3D11_DLL); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	D3D11CreateDeviceFunc = (PFN_D3D11_CREATE_DEVICE) SDL_LoadFunction( | ||||
| 		d3d11_dll, | ||||
| 		D3D11_CREATE_DEVICE_FUNC | ||||
| 	); | ||||
| 	if (D3D11CreateDeviceFunc == NULL) | ||||
| 	{ | ||||
| 		Refresh_LogWarn("D3D11: Could not find function " D3D11_CREATE_DEVICE_FUNC " in " D3D11_DLL); | ||||
| 		SDL_UnloadObject(d3d11_dll); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Can we create a device? */ | ||||
| 
 | ||||
| 	res = D3D11CreateDeviceFunc( | ||||
| 		NULL, | ||||
| 		D3D_DRIVER_TYPE_HARDWARE, | ||||
| 		NULL, | ||||
| 		D3D11_CREATE_DEVICE_BGRA_SUPPORT, | ||||
| 		levels, | ||||
| 		SDL_arraysize(levels), | ||||
| 		D3D11_SDK_VERSION, | ||||
| 		NULL, | ||||
| 		NULL, | ||||
| 		NULL | ||||
| 	); | ||||
| 
 | ||||
| 	SDL_UnloadObject(d3d11_dll); | ||||
| 
 | ||||
| 	if (FAILED(res)) | ||||
| 	{ | ||||
| 		Refresh_LogWarn("D3D11: Could not create D3D11Device with feature level 11_0"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Can we load D3DCompiler? */ | ||||
| 
 | ||||
| 	d3dcompiler_dll = SDL_LoadObject(D3DCOMPILER_DLL); | ||||
| 	if (d3dcompiler_dll == NULL) | ||||
| 	{ | ||||
| 		Refresh_LogWarn("D3D11: Could not find " D3DCOMPILER_DLL); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	D3DCompileFunc = (PFN_D3DCOMPILE) SDL_LoadFunction( | ||||
| 		d3dcompiler_dll, | ||||
| 		D3DCOMPILE_FUNC | ||||
| 	); | ||||
| 	SDL_UnloadObject(d3dcompiler_dll); /* We're not going to call this function, so we can just unload now. */ | ||||
| 	if (D3DCompileFunc == NULL) | ||||
| 	{ | ||||
| 		Refresh_LogWarn("D3D11: Could not find function " D3DCOMPILE_FUNC " in " D3DCOMPILER_DLL); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Can we load DXGI? */ | ||||
| 
 | ||||
| 	dxgi_dll = SDL_LoadObject(DXGI_DLL); | ||||
| 	if (dxgi_dll == NULL) | ||||
| 	{ | ||||
| 		Refresh_LogWarn("D3D11: Could not find " DXGI_DLL); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY1) SDL_LoadFunction( | ||||
| 		dxgi_dll, | ||||
| 		CREATE_DXGI_FACTORY1_FUNC | ||||
| 	); | ||||
| 	SDL_UnloadObject(dxgi_dll); /* We're not going to call this function, so we can just unload now. */ | ||||
| 	if (CreateDXGIFactoryFunc == NULL) | ||||
| 	{ | ||||
| 		Refresh_LogWarn("D3D11: Could not find function " CREATE_DXGI_FACTORY1_FUNC " in " DXGI_DLL); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	/* No window flags required */ | ||||
| 	SDL_SetHint(SDL_HINT_VIDEO_EXTERNAL_CONTEXT, "1"); | ||||
| 
 | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
|  | @ -908,10 +889,10 @@ static Refresh_Device* D3D11_CreateDevice( | |||
| 	uint8_t debugMode | ||||
| ) { | ||||
| 	D3D11Renderer *renderer; | ||||
| 	PFN_CREATE_DXGI_FACTORY CreateDXGIFactoryFunc; | ||||
| 	PFN_CREATE_DXGI_FACTORY1 CreateDXGIFactoryFunc; | ||||
| 	PFN_D3D11_CREATE_DEVICE D3D11CreateDeviceFunc; | ||||
| 	D3D_FEATURE_LEVEL levels[] = { D3D_FEATURE_LEVEL_11_0 }; | ||||
| 	void* factory6; | ||||
| 	IDXGIFactory6 *factory6; | ||||
| 	uint32_t flags; | ||||
| 	DXGI_ADAPTER_DESC1 adapterDesc; | ||||
| 	HRESULT res; | ||||
|  | @ -931,11 +912,11 @@ static Refresh_Device* D3D11_CreateDevice( | |||
| 	/* Load the D3DCompile function pointer */ | ||||
| 	renderer->D3DCompileFunc = (PFN_D3DCOMPILE) SDL_LoadFunction( | ||||
| 		renderer->d3dcompiler_dll, | ||||
| 		"D3DCompile" | ||||
| 		D3DCOMPILE_FUNC | ||||
| 	); | ||||
| 	if (renderer->D3DCompileFunc == NULL) | ||||
| 	{ | ||||
| 		Refresh_LogError("Could not load D3DCompile function!"); | ||||
| 		Refresh_LogError("Could not load function: " D3DCOMPILE_FUNC); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -947,14 +928,14 @@ static Refresh_Device* D3D11_CreateDevice( | |||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Load the CreateDXGIFactory function */ | ||||
| 	CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY) SDL_LoadFunction( | ||||
| 	/* Load the CreateDXGIFactory1 function */ | ||||
| 	CreateDXGIFactoryFunc = (PFN_CREATE_DXGI_FACTORY1) SDL_LoadFunction( | ||||
| 		renderer->dxgi_dll, | ||||
| 		"CreateDXGIFactory1" | ||||
| 		CREATE_DXGI_FACTORY1_FUNC | ||||
| 	); | ||||
| 	if (CreateDXGIFactoryFunc == NULL) | ||||
| 	{ | ||||
| 		Refresh_LogError("Could not load CreateDXGIFactory1 function!"); | ||||
| 		Refresh_LogError("Could not load function: " CREATE_DXGI_FACTORY1_FUNC); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -974,7 +955,7 @@ static Refresh_Device* D3D11_CreateDevice( | |||
| 	if (SUCCEEDED(res)) | ||||
| 	{ | ||||
| 		IDXGIFactory6_EnumAdapterByGpuPreference( | ||||
| 			(IDXGIFactory6*) factory6, | ||||
| 			factory6, | ||||
| 			0, | ||||
| 			DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, | ||||
| 			&D3D_IID_IDXGIAdapter1, | ||||
|  | @ -1004,11 +985,11 @@ static Refresh_Device* D3D11_CreateDevice( | |||
| 	/* Load the CreateDevice function */ | ||||
| 	D3D11CreateDeviceFunc = (PFN_D3D11_CREATE_DEVICE) SDL_LoadFunction( | ||||
| 		renderer->d3d11_dll, | ||||
| 		"D3D11CreateDevice" | ||||
| 		D3D11_CREATE_DEVICE_FUNC | ||||
| 	); | ||||
| 	if (D3D11CreateDeviceFunc == NULL) | ||||
| 	{ | ||||
| 		Refresh_LogError("Could not load D3D11CreateDevice function!"); | ||||
| 		Refresh_LogError("Could not load function: " D3D11_CREATE_DEVICE_FUNC); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -1022,7 +1003,7 @@ static Refresh_Device* D3D11_CreateDevice( | |||
| 	/* Create the device */ | ||||
| tryCreateDevice: | ||||
| 	res = D3D11CreateDeviceFunc( | ||||
| 		(IDXGIAdapter*)renderer->adapter, | ||||
| 		(IDXGIAdapter*) renderer->adapter, | ||||
| 		D3D_DRIVER_TYPE_UNKNOWN, /* Must be UNKNOWN if adapter is non-null according to spec */ | ||||
| 		NULL, | ||||
| 		flags, | ||||
|  | @ -1048,27 +1029,12 @@ tryCreateDevice: | |||
| 	Refresh_LogInfo("Refresh Driver: D3D11"); | ||||
| 	Refresh_LogInfo("D3D11 Adapter: %S", adapterDesc.Description); | ||||
| 
 | ||||
| 	/* Create the command buffer pool */ | ||||
| 	renderer->commandBufferPool = (D3D11CommandBufferPool*) SDL_calloc( | ||||
| 		1, | ||||
| 		sizeof(D3D11CommandBufferPool) | ||||
| 	); | ||||
| 
 | ||||
| 	/* Create mutexes */ | ||||
| 	renderer->contextLock = SDL_CreateMutex(); | ||||
| 	renderer->commandBufferAcquisitionMutex = SDL_CreateMutex(); | ||||
| 
 | ||||
| 	/* Initialize miscellaneous renderer members */ | ||||
| 	renderer->debugMode = (flags & D3D11_CREATE_DEVICE_DEBUG); | ||||
| 	renderer->blendFactor.x = 1.0f; | ||||
| 	renderer->blendFactor.y = 1.0f; | ||||
| 	renderer->blendFactor.z = 1.0f; | ||||
| 	renderer->blendFactor.w = 1.0f; | ||||
| 
 | ||||
| 	/* Create the Refresh Device */ | ||||
| 	result = (Refresh_Device*) SDL_malloc(sizeof(Refresh_Device)); | ||||
| 	ASSIGN_DRIVER(D3D11) | ||||
| 
 | ||||
| 	result->driverData = (Refresh_Renderer*) renderer; | ||||
| 
 | ||||
| 	return result; | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ | |||
|  */ | ||||
| 
 | ||||
| /* Function Pointer Signatures */ | ||||
| typedef HRESULT(WINAPI* PFN_CREATE_DXGI_FACTORY)(const GUID* riid, void** ppFactory); | ||||
| typedef HRESULT(WINAPI* PFN_CREATE_DXGI_FACTORY1)(const GUID* riid, void** ppFactory); | ||||
| 
 | ||||
|  /* IIDs (from https://magnumdb.com) */ | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue