From 005ad83bdac107cfbdb5d661c4048a87d5f1768b Mon Sep 17 00:00:00 2001
From: Caleb Cornett <caleb.cornett@outlook.com>
Date: Sun, 24 Sep 2023 19:25:49 -0500
Subject: [PATCH] Remove old stuff, flesh out PrepareDriver

---
 src/Refresh_Driver_D3D11.c          | 252 ++++++++++++----------------
 src/Refresh_Driver_D3D11_cdefines.h |   2 +-
 2 files changed, 110 insertions(+), 144 deletions(-)

diff --git a/src/Refresh_Driver_D3D11.c b/src/Refresh_Driver_D3D11.c
index 5d5e8b9..e0a1178 100644
--- a/src/Refresh_Driver_D3D11.c
+++ b/src/Refresh_Driver_D3D11.c
@@ -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;
diff --git a/src/Refresh_Driver_D3D11_cdefines.h b/src/Refresh_Driver_D3D11_cdefines.h
index e269212..aac92d2 100644
--- a/src/Refresh_Driver_D3D11_cdefines.h
+++ b/src/Refresh_Driver_D3D11_cdefines.h
@@ -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) */