From bb604e9540124bd1d1fa973c3fd53b28a6cf7995 Mon Sep 17 00:00:00 2001 From: Light Date: Tue, 15 Jun 2021 09:39:11 +0430 Subject: [PATCH] Major changes --- Engine/dxgidebug.dll | Bin 0 -> 127432 bytes Engine/premake5.lua | 6 +- Engine/src/Engine/Base.h | 6 +- Engine/src/Engine/Core/Application.cpp | 9 +++ Engine/src/Engine/Core/Application.h | 2 + Engine/src/Engine/Core/Logger.h | 2 +- Engine/src/Engine/Graphics/Renderer.cpp | 38 +++++----- Engine/src/Engine/Graphics/Shader.cpp | 33 ++++++++- Engine/src/Engine/Graphics/Shader.h | 3 + Engine/src/Engine/Layer/LayerStack.h | 5 +- Engine/src/Engine/Utility/FileManager.h | 2 +- .../GraphicsAPI/DirectX/dxBuffers.cpp | 10 ++- .../GraphicsAPI/DirectX/dxGraphicsContext.cpp | 69 ++++++++++++++---- .../GraphicsAPI/DirectX/dxGraphicsContext.h | 2 + .../GraphicsAPI/DirectX/dxRenderCommand.cpp | 2 +- .../GraphicsAPI/DirectX/dxVertexLayout.cpp | 1 - .../GraphicsAPI/OpenGL/glGraphicsContext.cpp | 7 ++ Engine/src/Platform/OS/Windows/wWindow.cpp | 2 +- Sandbox/premake5.lua | 6 +- Sandbox/res/fragment.fragment | 10 ++- Sandbox/res/vertex.vertex | 19 ++++- 21 files changed, 172 insertions(+), 62 deletions(-) create mode 100644 Engine/dxgidebug.dll diff --git a/Engine/dxgidebug.dll b/Engine/dxgidebug.dll new file mode 100644 index 0000000000000000000000000000000000000000..12139cd288d401b0bf072710749487a9b6b73053 GIT binary patch literal 127432 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 m_Window->GetGfxContext()->GetUserInterface()->LogDebugData(); @@ -78,4 +79,12 @@ namespace Light { m_LayerStack.OnEvent(event); } + void Application::LogDebugData() + { + LT_ENGINE_INFO("________________________________________"); + LT_ENGINE_INFO("Platform::"); + LT_ENGINE_INFO(" OS: {}", LT_BUILD_PLATFORM); + LT_ENGINE_INFO("________________________________________"); + } + } \ No newline at end of file diff --git a/Engine/src/Engine/Core/Application.h b/Engine/src/Engine/Core/Application.h index c6b32f6..1df588e 100644 --- a/Engine/src/Engine/Core/Application.h +++ b/Engine/src/Engine/Core/Application.h @@ -33,6 +33,8 @@ namespace Light { private: void OnEvent(const Event& event); + + void LogDebugData(); }; } \ No newline at end of file diff --git a/Engine/src/Engine/Core/Logger.h b/Engine/src/Engine/Core/Logger.h index 517144b..4dc2955 100644 --- a/Engine/src/Engine/Core/Logger.h +++ b/Engine/src/Engine/Core/Logger.h @@ -5,7 +5,7 @@ #include // LOGGER MACROS // -#ifndef LT_DIST +#ifndef LIGHT_DIST // Engine #define LT_ENGINE_TRACE(...) ::Light::Logger::GetEngineLogger()->log(spdlog::level::trace , __VA_ARGS__) #define LT_ENGINE_INFO(...) ::Light::Logger::GetEngineLogger()->log(spdlog::level::info , __VA_ARGS__) diff --git a/Engine/src/Engine/Graphics/Renderer.cpp b/Engine/src/Engine/Graphics/Renderer.cpp index 9adf95d..cb6051e 100644 --- a/Engine/src/Engine/Graphics/Renderer.cpp +++ b/Engine/src/Engine/Graphics/Renderer.cpp @@ -18,7 +18,7 @@ namespace Light { m_QuadRenderer.shader = std::unique_ptr(Shader::Create("res/vertex.vertex", "res/fragment.fragment", m_SharedContext)); m_QuadRenderer.vertexBuffer = std::unique_ptr(VertexBuffer::Create(nullptr, sizeof(QuadRendererProgram::QuadVertexData), LT_MAX_QUAD * 4, m_SharedContext)); m_QuadRenderer.vertexLayout = std::unique_ptr(VertexLayout::Create(m_QuadRenderer.vertexBuffer.get(), m_QuadRenderer.shader.get(), { { "POSITION", VertexElementType::Float3 },{ "COLOR", VertexElementType::Float4 } }, m_SharedContext)); - m_QuadRenderer.indexBuffer = std::unique_ptr(IndexBuffer::Create(nullptr, LT_MAX_QUAD * 3, m_SharedContext)); + m_QuadRenderer.indexBuffer = std::unique_ptr(IndexBuffer::Create(nullptr, LT_MAX_QUAD * 6, m_SharedContext)); // QUADRENDERER // } @@ -49,27 +49,21 @@ namespace Light { const float xMax = position.x + size.x; const float yMax = position.y + size.y; - // TOP LEFT - m_QuadRenderer.mapCurrent->position = { xMin, yMin, position.z }; - m_QuadRenderer.mapCurrent->tint = glm::vec4(1.0f, 0.1f, 0.1f, 1.0f); - m_QuadRenderer.mapCurrent++; + + m_QuadRenderer.mapCurrent[0].position = { xMin, yMin, position.z }; + m_QuadRenderer.mapCurrent[0].tint = glm::vec4(0.1f, 0.1f, 1.0f, 1.0f); - // TOP RIGHT - m_QuadRenderer.mapCurrent->position = { xMax, yMin, position.z }; - m_QuadRenderer.mapCurrent->tint = glm::vec4(0.1f, 1.0f, 0.1f, 1.0f); - m_QuadRenderer.mapCurrent++; + m_QuadRenderer.mapCurrent[1].position = { xMax, yMin, position.z }; + m_QuadRenderer.mapCurrent[1].tint = glm::vec4(0.3f, 0.3f, 0.3f, 1.0f); - // BOTTOM RIGHT - m_QuadRenderer.mapCurrent->position = { xMax, yMax, position.z }; - m_QuadRenderer.mapCurrent->tint = glm::vec4(0.3f, 0.3f, 0.3f, 1.0f); - m_QuadRenderer.mapCurrent++; + m_QuadRenderer.mapCurrent[2].position = { xMax, yMax, position.z }; + m_QuadRenderer.mapCurrent[2].tint = glm::vec4(0.1f, 1.0f, 0.1f, 1.0f); - // BOTTOM LEFT - m_QuadRenderer.mapCurrent->position = { xMin, yMax, position.z }; - m_QuadRenderer.mapCurrent->tint = glm::vec4(0.1f, 0.1f, 1.0f, 1.0f); - m_QuadRenderer.mapCurrent++; + m_QuadRenderer.mapCurrent[3].position = { xMin, yMax, position.z }; + m_QuadRenderer.mapCurrent[3].tint = glm::vec4(1.0f, 0.1f, 0.1f, 1.0f); // advance + m_QuadRenderer.mapCurrent += 4; m_QuadRenderer.quadCount++; } @@ -81,9 +75,13 @@ namespace Light { void Renderer::EndScene() { - m_QuadRenderer.Bind(); - m_RenderCommand->DrawIndexed(m_QuadRenderer.quadCount * 6); - m_QuadRenderer.quadCount = 0; + if (m_QuadRenderer.quadCount) + { + m_QuadRenderer.Bind(); + + m_RenderCommand->DrawIndexed(m_QuadRenderer.quadCount * 6); + m_QuadRenderer.quadCount = 0; + } } } \ No newline at end of file diff --git a/Engine/src/Engine/Graphics/Shader.cpp b/Engine/src/Engine/Graphics/Shader.cpp index 7d91648..6ebb6a5 100644 --- a/Engine/src/Engine/Graphics/Shader.cpp +++ b/Engine/src/Engine/Graphics/Shader.cpp @@ -15,16 +15,22 @@ namespace Light { Shader* Shader::Create(const std::string& vertexPath, const std::string& pixelPath, void* sharedContext) { // load shader source - const std::string vertexSource = FileManager::ReadTXTFile(vertexPath); - const std::string pixelSource = FileManager::ReadTXTFile(pixelPath); + std::string vertexSource = FileManager::ReadTXTFile(vertexPath); + std::string pixelSource = FileManager::ReadTXTFile(pixelPath); switch (GraphicsContext::GetGraphicsAPI()) { case GraphicsAPI::OpenGL: + ExtractShaderSource(vertexSource, "GLSL"); + ExtractShaderSource(pixelSource, "GLSL"); + return new glShader(vertexSource, pixelSource); - case GraphicsAPI::DirectX: - return new dxShader(vertexSource, pixelSource, sharedContext); + case GraphicsAPI::DirectX: LT_WIN( + ExtractShaderSource(vertexSource, "HLSL"); + ExtractShaderSource(pixelSource, "HLSL"); + + return new dxShader(vertexSource, pixelSource, sharedContext);) default: LT_ENGINE_ASSERT(false, "Shader::Create: invalid/unsupported GraphicsAPI {}", GraphicsContext::GetGraphicsAPI()); @@ -32,4 +38,23 @@ namespace Light { } } + void Shader::ExtractShaderSource(std::string& src, const std::string& delim) + { + size_t begDelimPos, endDelimPos; + + begDelimPos = src.find('+' + delim) + 5; + endDelimPos = src.find('-' + delim); + + LT_ENGINE_ASSERT(begDelimPos != std::string::npos + 5, + "Shader::ExtractShaderSource: failed to find the start delimeter in shader source, delim: {}, shader:\n{}", + delim, src); + + + LT_ENGINE_ASSERT(endDelimPos != std::string::npos, + "Shader::ExtractShaderSource: failed to find the end delimeter in shader source, delim: {}, shader:\n{}", + delim, src); + + src = src.substr(begDelimPos, endDelimPos - begDelimPos); + } + } \ No newline at end of file diff --git a/Engine/src/Engine/Graphics/Shader.h b/Engine/src/Engine/Graphics/Shader.h index 6b13b83..f4af5b2 100644 --- a/Engine/src/Engine/Graphics/Shader.h +++ b/Engine/src/Engine/Graphics/Shader.h @@ -16,6 +16,9 @@ namespace Light { protected: Shader() = default; + + private: + static void ExtractShaderSource(std::string& src, const std::string& delim); }; } \ No newline at end of file diff --git a/Engine/src/Engine/Layer/LayerStack.h b/Engine/src/Engine/Layer/LayerStack.h index 3ca1471..1e4dabd 100644 --- a/Engine/src/Engine/Layer/LayerStack.h +++ b/Engine/src/Engine/Layer/LayerStack.h @@ -7,13 +7,10 @@ namespace Light { class Layer; class Event; - template - using Raw = T*; - class LayerStack { private: - static Raw s_Context; + static LayerStack* s_Context; std::vector m_Layers; diff --git a/Engine/src/Engine/Utility/FileManager.h b/Engine/src/Engine/Utility/FileManager.h index e1e6650..c5019f1 100644 --- a/Engine/src/Engine/Utility/FileManager.h +++ b/Engine/src/Engine/Utility/FileManager.h @@ -4,7 +4,7 @@ namespace Light { - // TODO: optimize + // TODO: optimize!! class FileManager { public: diff --git a/Engine/src/Platform/GraphicsAPI/DirectX/dxBuffers.cpp b/Engine/src/Platform/GraphicsAPI/DirectX/dxBuffers.cpp index 1b7fa7c..d60b9e0 100644 --- a/Engine/src/Platform/GraphicsAPI/DirectX/dxBuffers.cpp +++ b/Engine/src/Platform/GraphicsAPI/DirectX/dxBuffers.cpp @@ -53,7 +53,6 @@ namespace Light { { } - dxIndexBuffer::dxIndexBuffer(unsigned int* indices, unsigned int count, void* sharedContext) { HRESULT hr; @@ -69,7 +68,7 @@ namespace Light { { if (count % 6 != 0) { - LT_ENGINE_WARN("dxIndexBuffer::dxIndexBuffer: count should be divisible by 6 when no indices is provided"); + LT_ENGINE_WARN("dxIndexBuffer::dxIndexBuffer: indices can only be null if count is multiple of 6"); LT_ENGINE_WARN("dxIndexBuffer::dxIndexBuffer: adding {} to count -> {}", (6 - (count % 6)), count + (6 - (count % 6))); count = count + (6 - (count % 6)); } @@ -79,11 +78,11 @@ namespace Light { for (unsigned int i = 0; i < count; i += 6) { indices[i + 0] = offset + 0; - indices[i + 1] = offset + 1; + indices[i + 1] = offset + 3; indices[i + 2] = offset + 2; indices[i + 3] = offset + 2; - indices[i + 4] = offset + 3; + indices[i + 4] = offset + 1; indices[i + 5] = offset + 0; offset += 4; @@ -103,7 +102,10 @@ namespace Light { DXC(m_Device->CreateBuffer(&bufferDesc, &sd, &m_Buffer)); if (!hasIndices) + { delete[] indices; + indices = nullptr; + } } dxIndexBuffer::~dxIndexBuffer() diff --git a/Engine/src/Platform/GraphicsAPI/DirectX/dxGraphicsContext.cpp b/Engine/src/Platform/GraphicsAPI/DirectX/dxGraphicsContext.cpp index 5358dff..86bb1ed 100644 --- a/Engine/src/Platform/GraphicsAPI/DirectX/dxGraphicsContext.cpp +++ b/Engine/src/Platform/GraphicsAPI/DirectX/dxGraphicsContext.cpp @@ -26,17 +26,36 @@ namespace Light { HRESULT hr; DXGI_SWAP_CHAIN_DESC sd = { 0 }; - sd.BufferCount = 1u; - sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.OutputWindow = static_cast(glfwGetWin32Window(windowHandle)); + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - sd.OutputWindow = glfwGetWin32Window(m_WindowHandle); + sd.BufferCount = 1u; + + sd.BufferDesc.Width = 800u; + sd.BufferDesc.Height = 600u; + sd.BufferDesc.RefreshRate.Denominator = NULL; + sd.BufferDesc.RefreshRate.Numerator = NULL; + sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; + sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + + sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + sd.SampleDesc.Count = 1u; + sd.SampleDesc.Quality = 0u; + sd.Windowed = true; + sd.Flags = NULL; + + UINT flags = NULL; + +#ifdef LIGHT_DEBUG + flags = D3D11_CREATE_DEVICE_DEBUG; +#endif DXC(D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, - NULL, NULL, NULL, NULL, D3D11_SDK_VERSION, + NULL, flags, NULL, NULL, D3D11_SDK_VERSION, &sd, &m_SwapChain, &m_Device, NULL, &m_DeviceContext)); - m_DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); Microsoft::WRL::ComPtr backBuffer; @@ -44,6 +63,24 @@ namespace Light { DXC(m_Device->CreateRenderTargetView(backBuffer.Get(), nullptr, &m_RenderTargetView)); m_DeviceContext->OMSetRenderTargets(1u, m_RenderTargetView.GetAddressOf(), nullptr); + Microsoft::WRL::ComPtr infoQueue; + + DXC(m_Device.As(&debugInterface)); + DXC(debugInterface.As(&infoQueue)); + + D3D11_MESSAGE_ID hide[] = + { + D3D11_MESSAGE_ID_DEVICE_DRAW_SAMPLER_NOT_SET, + + // #todo: add more message IDs here as needed + }; + + D3D11_INFO_QUEUE_FILTER filter; + memset(&filter, 0, sizeof(filter)); + filter.DenyList.NumIDs = _countof(hide); + filter.DenyList.pIDList = hide; + infoQueue->AddStorageFilterEntries(&filter); + D3D11_VIEWPORT viewport; @@ -60,6 +97,16 @@ namespace Light { dxSharedContext* sharedContext = new dxSharedContext({m_DeviceContext, m_SwapChain, m_RenderTargetView, m_Device}); m_SharedContext = sharedContext; + + } + + void dxGraphicsContext::OnWindowResize(const WindowResizedEvent& event) + { + + } + + void dxGraphicsContext::LogDebugData() + { // log some information about dx context // // locals IDXGIDevice* DXGIDevice; @@ -82,18 +129,10 @@ namespace Light { DXGIAdapter->Release(); // log info // #todo: log more information + LT_ENGINE_INFO("________________________________________"); LT_ENGINE_INFO("dxGraphicsContext:"); LT_ENGINE_INFO(" Renderer: {}", adapterDesc); - } - - void dxGraphicsContext::OnWindowResize(const WindowResizedEvent& event) - { - - } - - void dxGraphicsContext::LogDebugData() - { - + LT_ENGINE_INFO("________________________________________"); } } \ No newline at end of file diff --git a/Engine/src/Platform/GraphicsAPI/DirectX/dxGraphicsContext.h b/Engine/src/Platform/GraphicsAPI/DirectX/dxGraphicsContext.h index afb9fac..fdeb540 100644 --- a/Engine/src/Platform/GraphicsAPI/DirectX/dxGraphicsContext.h +++ b/Engine/src/Platform/GraphicsAPI/DirectX/dxGraphicsContext.h @@ -21,6 +21,8 @@ namespace Light { Microsoft::WRL::ComPtr m_SwapChain; Microsoft::WRL::ComPtr m_RenderTargetView; + Microsoft::WRL::ComPtr debugInterface; + public: dxGraphicsContext(GLFWwindow* windowHandle); diff --git a/Engine/src/Platform/GraphicsAPI/DirectX/dxRenderCommand.cpp b/Engine/src/Platform/GraphicsAPI/DirectX/dxRenderCommand.cpp index 66a27d5..5016b98 100644 --- a/Engine/src/Platform/GraphicsAPI/DirectX/dxRenderCommand.cpp +++ b/Engine/src/Platform/GraphicsAPI/DirectX/dxRenderCommand.cpp @@ -36,7 +36,7 @@ namespace Light { void dxRenderCommand::DrawIndexed(unsigned int count) { - + m_DeviceContext->DrawIndexed(count, 0u, 0u); } } \ No newline at end of file diff --git a/Engine/src/Platform/GraphicsAPI/DirectX/dxVertexLayout.cpp b/Engine/src/Platform/GraphicsAPI/DirectX/dxVertexLayout.cpp index d704c3b..119ec6f 100644 --- a/Engine/src/Platform/GraphicsAPI/DirectX/dxVertexLayout.cpp +++ b/Engine/src/Platform/GraphicsAPI/DirectX/dxVertexLayout.cpp @@ -39,7 +39,6 @@ namespace Light { dxVertexLayout::~dxVertexLayout() { - } void dxVertexLayout::Bind() diff --git a/Engine/src/Platform/GraphicsAPI/OpenGL/glGraphicsContext.cpp b/Engine/src/Platform/GraphicsAPI/OpenGL/glGraphicsContext.cpp index 80cd161..51c40b8 100644 --- a/Engine/src/Platform/GraphicsAPI/OpenGL/glGraphicsContext.cpp +++ b/Engine/src/Platform/GraphicsAPI/OpenGL/glGraphicsContext.cpp @@ -32,6 +32,12 @@ namespace Light { void glGraphicsContext::OnWindowResize(const WindowResizedEvent& event) { + if (event.GetSize().x < 0 || event.GetSize().y < 0) + { + LT_ENGINE_ERROR("glGraphicsContext::OnWindowResize: width/height cannot be negative: [{}x{}]", event.GetSize().x, event.GetSize().y); + return; + } + glViewport(0, 0, event.GetSize().x, event.GetSize().y); } @@ -71,6 +77,7 @@ namespace Light { Stringifier::glDebugMsgSource(source), Stringifier::glDebugMsgType(type), id); + __debugbreak(); LT_ENGINE_CRITICAL(" {}", message); return; case GL_DEBUG_SEVERITY_MEDIUM: case GL_DEBUG_SEVERITY_LOW: diff --git a/Engine/src/Platform/OS/Windows/wWindow.cpp b/Engine/src/Platform/OS/Windows/wWindow.cpp index 20777dd..f64800c 100644 --- a/Engine/src/Platform/OS/Windows/wWindow.cpp +++ b/Engine/src/Platform/OS/Windows/wWindow.cpp @@ -30,7 +30,7 @@ namespace Light { glfwSetWindowUserPointer(m_Handle, &m_EventCallback); BindGlfwEvents(); - m_GraphicsContext = std::unique_ptr(GraphicsContext::Create(GraphicsAPI::OpenGL, m_Handle)); + m_GraphicsContext = std::unique_ptr(GraphicsContext::Create(GraphicsAPI::DirectX, m_Handle)); LT_ENGINE_ASSERT(m_GraphicsContext, "wWindow::wWindow: graphics context creation failed"); } diff --git a/Sandbox/premake5.lua b/Sandbox/premake5.lua index b111012..e40641e 100644 --- a/Sandbox/premake5.lua +++ b/Sandbox/premake5.lua @@ -53,15 +53,15 @@ project "Sandbox" -- debug filter "configurations:Debug" - defines "LT_DEBUG" + defines "LIGHT_DEBUG" symbols "on" -- release filter "configurations:Release" - defines "LT_RELEASE" + defines "LIGHT_RELEASE" optimize "on" -- distribution filter "configurations:Distribution" - defines "LT_DIST" + defines "LIGHT_DIST" optimize "on" \ No newline at end of file diff --git a/Sandbox/res/fragment.fragment b/Sandbox/res/fragment.fragment index 945034e..7d9b08c 100644 --- a/Sandbox/res/fragment.fragment +++ b/Sandbox/res/fragment.fragment @@ -1,3 +1,4 @@ ++GLSL #version 440 core in vec4 fragColor; @@ -7,4 +8,11 @@ out vec4 FragmentColor; void main() { FragmentColor = fragColor; -} \ No newline at end of file +} +-GLSL ++HLSL +float4 main(float4 Color : COLOR) : SV_Target +{ + return Color; +} +-HLSL \ No newline at end of file diff --git a/Sandbox/res/vertex.vertex b/Sandbox/res/vertex.vertex index a82c3c0..8eade4c 100644 --- a/Sandbox/res/vertex.vertex +++ b/Sandbox/res/vertex.vertex @@ -1,3 +1,4 @@ ++GLSL #version 440 core layout(location = 0) in vec3 a_Position; @@ -9,4 +10,20 @@ void main() { gl_Position = vec4(a_Position, 1.0); fragColor = a_Color; -} \ No newline at end of file +} +-GLSL ++HLSL +struct VertexOut +{ + float4 Color : COLOR; + float4 Position : SV_Position; +}; + +VertexOut main(float3 InPosition : POSITION, float4 InColor : COLOR) +{ + VertexOut vso; + vso.Position = float4(InPosition.x, InPosition.y, InPosition.z, 1.0); + vso.Color = InColor; + return vso; +} +-HLSL \ No newline at end of file