Maintanance
- Some tidying - dxGraphicsContext's constructor been split up into multiple Setup functions.
This commit is contained in:
		
							parent
							
								
									0fc1896854
								
							
						
					
					
						commit
						f8b35c9572
					
				
					 6 changed files with 63 additions and 35 deletions
				
			
		| 
						 | 
					@ -1,6 +1,8 @@
 | 
				
			||||||
#include "ltpch.h"
 | 
					#include "ltpch.h"
 | 
				
			||||||
#include "dxGraphicsContext.h"
 | 
					#include "dxGraphicsContext.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "dxSharedContext.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Required for forward declaration
 | 
					// Required for forward declaration
 | 
				
			||||||
#include "Graphics/Renderer.h"
 | 
					#include "Graphics/Renderer.h"
 | 
				
			||||||
#include "Graphics/RenderCommand.h"
 | 
					#include "Graphics/RenderCommand.h"
 | 
				
			||||||
| 
						 | 
					@ -16,65 +18,100 @@
 | 
				
			||||||
#define GLFW_EXPOSE_NATIVE_WIN32
 | 
					#define GLFW_EXPOSE_NATIVE_WIN32
 | 
				
			||||||
#include <glfw/glfw3native.h>
 | 
					#include <glfw/glfw3native.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "dxSharedContext.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace Light {
 | 
					namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dxGraphicsContext::dxGraphicsContext(GLFWwindow* windowHandle)
 | 
						dxGraphicsContext::dxGraphicsContext(GLFWwindow* windowHandle)
 | 
				
			||||||
		: m_WindowHandle(windowHandle)
 | 
							: m_WindowHandle(windowHandle)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							// DirectX API
 | 
				
			||||||
		m_GraphicsAPI = GraphicsAPI::DirectX;
 | 
							m_GraphicsAPI = GraphicsAPI::DirectX;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// swap chain desc
 | 
							// setup
 | 
				
			||||||
 | 
							SetupDeviceAndSwapChain(windowHandle);
 | 
				
			||||||
 | 
							SetupRenderTargets();
 | 
				
			||||||
 | 
							SetupDebugInterface();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// create shared context
 | 
				
			||||||
 | 
							m_SharedContext = std::make_shared<dxSharedContext>(m_Device, m_DeviceContext, m_SwapChain, m_RenderTargetView);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void dxGraphicsContext::SetupDeviceAndSwapChain(GLFWwindow* windowHandle)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							//* swap chain desc *//
 | 
				
			||||||
		DXGI_SWAP_CHAIN_DESC sd = { 0 };
 | 
							DXGI_SWAP_CHAIN_DESC sd = { 0 };
 | 
				
			||||||
		sd.OutputWindow = static_cast<HWND>(glfwGetWin32Window(windowHandle));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
 | 
					 | 
				
			||||||
		sd.BufferCount = 1u;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// buffer desc
 | 
				
			||||||
		sd.BufferDesc.Width = 800u;
 | 
							sd.BufferDesc.Width = 800u;
 | 
				
			||||||
		sd.BufferDesc.Height = 600u;
 | 
							sd.BufferDesc.Height = 600u;
 | 
				
			||||||
		sd.BufferDesc.RefreshRate.Denominator = NULL;
 | 
							sd.BufferDesc.RefreshRate.Numerator = NULL; // :#todo
 | 
				
			||||||
		sd.BufferDesc.RefreshRate.Numerator = NULL;
 | 
							sd.BufferDesc.RefreshRate.Denominator = NULL; // :#todo
 | 
				
			||||||
		sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
 | 
							sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
 | 
				
			||||||
		sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
 | 
					 | 
				
			||||||
		sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
 | 
							sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
 | 
				
			||||||
 | 
							sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
 | 
							// sample desc (for multi sampling)
 | 
				
			||||||
 | 
							// #todo: implement multi-sampling
 | 
				
			||||||
		sd.SampleDesc.Count = 1u;
 | 
							sd.SampleDesc.Count = 1u;
 | 
				
			||||||
		sd.SampleDesc.Quality = 0u;
 | 
							sd.SampleDesc.Quality = 0u;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// #todo: support swap chains with more than 1 back-buffer
 | 
				
			||||||
 | 
							sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
 | 
				
			||||||
 | 
							sd.BufferCount = 1u;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// #todo: don't handle Windows's window with glfw, create it yourself
 | 
				
			||||||
 | 
							sd.OutputWindow = static_cast<HWND>(glfwGetWin32Window(windowHandle));
 | 
				
			||||||
		sd.Windowed = true;
 | 
							sd.Windowed = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sd.Flags = NULL;
 | 
							sd.Flags = NULL;
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		UINT flags = NULL;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							UINT flags = NULL;
 | 
				
			||||||
#ifdef LIGHT_DEBUG
 | 
					#ifdef LIGHT_DEBUG
 | 
				
			||||||
		flags = D3D11_CREATE_DEVICE_DEBUG;
 | 
							flags = D3D11_CREATE_DEVICE_DEBUG;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// create device and swap chain
 | 
							// create device and swap chain
 | 
				
			||||||
		HRESULT hr;
 | 
							HRESULT hr;
 | 
				
			||||||
		DXC(D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE,
 | 
							DXC(D3D11CreateDeviceAndSwapChain(nullptr, 
 | 
				
			||||||
		                              NULL, flags, NULL, NULL, D3D11_SDK_VERSION,
 | 
							                                  D3D_DRIVER_TYPE_HARDWARE,
 | 
				
			||||||
		                              &sd, &m_SwapChain, &m_Device, NULL, &m_DeviceContext));
 | 
							                                  NULL,
 | 
				
			||||||
 | 
							                                  flags,
 | 
				
			||||||
 | 
							                                  nullptr,
 | 
				
			||||||
 | 
							                                  NULL,
 | 
				
			||||||
 | 
							                                  D3D11_SDK_VERSION,
 | 
				
			||||||
 | 
							                                  &sd, 
 | 
				
			||||||
 | 
							                                  &m_SwapChain,
 | 
				
			||||||
 | 
							                                  &m_Device,
 | 
				
			||||||
 | 
							                                  nullptr,
 | 
				
			||||||
 | 
							                                  &m_DeviceContext));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void dxGraphicsContext::SetupRenderTargets()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
		// set primitive topology
 | 
							// set primitive topology
 | 
				
			||||||
		m_DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
 | 
							m_DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// create render target view 
 | 
							// create render target view 
 | 
				
			||||||
		Microsoft::WRL::ComPtr<ID3D11Resource> backBuffer;
 | 
							Microsoft::WRL::ComPtr<ID3D11Resource> backBuffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							HRESULT hr;
 | 
				
			||||||
		DXC(m_SwapChain->GetBuffer(0u, __uuidof(ID3D11Resource), &backBuffer));
 | 
							DXC(m_SwapChain->GetBuffer(0u, __uuidof(ID3D11Resource), &backBuffer));
 | 
				
			||||||
		DXC(m_Device->CreateRenderTargetView(backBuffer.Get(), nullptr, &m_RenderTargetView));
 | 
							DXC(m_Device->CreateRenderTargetView(backBuffer.Get(), nullptr, &m_RenderTargetView));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// set render target view
 | 
							// set render target view
 | 
				
			||||||
		m_DeviceContext->OMSetRenderTargets(1u, m_RenderTargetView.GetAddressOf(), nullptr);
 | 
							m_DeviceContext->OMSetRenderTargets(1u, m_RenderTargetView.GetAddressOf(), nullptr);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void dxGraphicsContext::SetupDebugInterface()
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
#ifdef LIGHT_DEBUG
 | 
					#ifdef LIGHT_DEBUG
 | 
				
			||||||
		// configure the debug interface
 | 
							// configure the debug interface
 | 
				
			||||||
		Microsoft::WRL::ComPtr<ID3D11InfoQueue> infoQueue;
 | 
							Microsoft::WRL::ComPtr<ID3D11InfoQueue> infoQueue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							HRESULT hr;
 | 
				
			||||||
		DXC(m_Device.As(&m_DebugInterface));
 | 
							DXC(m_Device.As(&m_DebugInterface));
 | 
				
			||||||
		DXC(m_DebugInterface.As(&infoQueue));
 | 
							DXC(m_DebugInterface.As(&infoQueue));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,20 +122,12 @@ namespace Light {
 | 
				
			||||||
			// #todo: add more message IDs here as needed
 | 
								// #todo: add more message IDs here as needed
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		D3D11_INFO_QUEUE_FILTER filter;
 | 
							D3D11_INFO_QUEUE_FILTER filter = { 0 };
 | 
				
			||||||
		memset(&filter, 0, sizeof(filter));
 | 
					 | 
				
			||||||
		filter.DenyList.NumIDs = _countof(hide);
 | 
							filter.DenyList.NumIDs = _countof(hide);
 | 
				
			||||||
		filter.DenyList.pIDList = hide;
 | 
							filter.DenyList.pIDList = hide;
 | 
				
			||||||
		infoQueue->AddStorageFilterEntries(&filter);
 | 
					
 | 
				
			||||||
 | 
							DXC(infoQueue->AddStorageFilterEntries(&filter));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
		// create shared context
 | 
					 | 
				
			||||||
		m_SharedContext = std::make_shared<dxSharedContext>(m_Device, m_DeviceContext, m_SwapChain, m_RenderTargetView);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void dxGraphicsContext::OnWindowResize(const WindowResizedEvent& event)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		SetResolution(event.GetSize());
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void dxGraphicsContext::SetResolution(const glm::uvec2& resolution)
 | 
						void dxGraphicsContext::SetResolution(const glm::uvec2& resolution)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,11 @@ namespace Light {
 | 
				
			||||||
		virtual void LogDebugData() override;
 | 
							virtual void LogDebugData() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
 | 
							void SetupDeviceAndSwapChain(GLFWwindow* windowHandle);
 | 
				
			||||||
 | 
							void SetupRenderTargets();
 | 
				
			||||||
 | 
							void SetupDebugInterface();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		void SetResolution(const glm::uvec2& resolution);
 | 
							void SetResolution(const glm::uvec2& resolution);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,10 +10,6 @@ namespace Light {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dxRenderCommand::~dxRenderCommand()
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	void dxRenderCommand::SwapBuffers()
 | 
						void dxRenderCommand::SwapBuffers()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
#ifdef LIGHT_DEBUG
 | 
					#ifdef LIGHT_DEBUG
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,6 @@ namespace Light {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		dxRenderCommand(std::shared_ptr<dxSharedContext> sharedContext);
 | 
							dxRenderCommand(std::shared_ptr<dxSharedContext> sharedContext);
 | 
				
			||||||
		~dxRenderCommand();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		virtual void SwapBuffers() override;
 | 
							virtual void SwapBuffers() override;
 | 
				
			||||||
		virtual void ClearBackBuffer() override;
 | 
							virtual void ClearBackBuffer() override;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,6 @@ namespace Light {
 | 
				
			||||||
	dxVertexLayout::dxVertexLayout(Shader* shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, std::shared_ptr<dxSharedContext> sharedContext)
 | 
						dxVertexLayout::dxVertexLayout(Shader* shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, std::shared_ptr<dxSharedContext> sharedContext)
 | 
				
			||||||
		: m_Context(sharedContext)
 | 
							: m_Context(sharedContext)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
					 | 
				
			||||||
		// local
 | 
							// local
 | 
				
			||||||
		std::vector<D3D11_INPUT_ELEMENT_DESC> inputElementsDesc;
 | 
							std::vector<D3D11_INPUT_ELEMENT_DESC> inputElementsDesc;
 | 
				
			||||||
		inputElementsDesc.reserve(elements.size());
 | 
							inputElementsDesc.reserve(elements.size());
 | 
				
			||||||
| 
						 | 
					@ -27,12 +26,11 @@ namespace Light {
 | 
				
			||||||
			                               0u });
 | 
								                               0u });
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
		// #todo: take in shared_ptr
 | 
							// #todo: take in shared_ptr
 | 
				
			||||||
		dxShader* dxpShader = static_cast<dxShader*>(shader);
 | 
							dxShader* dxpShader = static_cast<dxShader*>(shader);
 | 
				
			||||||
		LT_ENGINE_ASSERT(dxpShader, "dxVertexLayout::dxVertexLayout: failed to cast Shader to dxShader");
 | 
							LT_ENGINE_ASSERT(dxpShader, "dxVertexLayout::dxVertexLayout: failed to cast Shader to dxShader");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// create input layout ( vertex layout )
 | 
							// create input layout (vertex layout)
 | 
				
			||||||
		HRESULT hr;
 | 
							HRESULT hr;
 | 
				
			||||||
		DXC(m_Context->device->CreateInputLayout(&inputElementsDesc[0], inputElementsDesc.size(), dxpShader->GetVertexBlob().Get()->GetBufferPointer(), dxpShader->GetVertexBlob().Get()->GetBufferSize(), &m_InputLayout));
 | 
							DXC(m_Context->device->CreateInputLayout(&inputElementsDesc[0], inputElementsDesc.size(), dxpShader->GetVertexBlob().Get()->GetBufferPointer(), dxpShader->GetVertexBlob().Get()->GetBufferSize(), &m_InputLayout));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,6 +12,7 @@ namespace Light {
 | 
				
			||||||
	class wWindow : public Window
 | 
						class wWindow : public Window
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
 | 
							// #todo: don't handle Windows's window with glfw, create it yourself
 | 
				
			||||||
		GLFWwindow* m_Handle = nullptr;
 | 
							GLFWwindow* m_Handle = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		std::function<void(Event&)> m_EventCallback;
 | 
							std::function<void(Event&)> m_EventCallback;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue