light/Engine/src/Platform/GraphicsAPI/DirectX/dxRenderCommand.cpp

91 lines
2.5 KiB
C++
Raw Normal View History

2021-06-02 09:07:45 +04:30
#include "dxRenderCommand.h"
#include "dxSharedContext.h"
namespace Light {
dxRenderCommand::dxRenderCommand(Ref<dxSharedContext> sharedContext)
: m_Context(sharedContext)
2021-07-29 17:12:13 +04:30
{
}
2021-06-02 09:07:45 +04:30
void dxRenderCommand::SwapBuffers()
{
#ifdef LIGHT_DEBUG
HRESULT hr;
2021-07-29 17:12:13 +04:30
if (FAILED(hr = m_Context->GetSwapChain()->Present(1u, 0u)))
{
if (hr == DXGI_ERROR_DEVICE_REMOVED)
{
LT_ENGINE_CRITICAL("dxRenderCommand::SwapBuffers: DeviceRemoved:");
LT_ENGINE_CRITICAL(" {}", m_Context->GetDevice()->GetDeviceRemovedReason());
throw dxException(hr, __FILE__, __LINE__);
}
}
#else
m_Context->GetSwapChain()->Present(0u, 0u);
#endif
2021-06-02 09:07:45 +04:30
}
void dxRenderCommand::ClearBackBuffer(const glm::vec4& clearColor)
2021-06-02 09:07:45 +04:30
{
m_Context->GetDeviceContext()->ClearRenderTargetView(m_Context->GetRenderTargetView().Get(), &clearColor[0]);
2021-06-02 09:07:45 +04:30
}
void dxRenderCommand::Draw(unsigned int count)
{
m_Context->GetDeviceContext()->Draw(count, 0u);
2021-06-02 09:07:45 +04:30
}
void dxRenderCommand::DrawIndexed(unsigned int count)
{
m_Context->GetDeviceContext()->DrawIndexed(count, 0u, 0u);
2021-06-02 09:07:45 +04:30
}
void dxRenderCommand::DefaultTargetFramebuffer()
{
m_Context->GetDeviceContext()->OMSetRenderTargets(1, m_Context->GetRenderTargetView().GetAddressOf(), nullptr);
}
void dxRenderCommand::SetViewport(unsigned int x, unsigned int y, unsigned int width, unsigned int height)
{
// #todo: maybe call this somewhere else??
SetResolution(width, height);
// create viewport
D3D11_VIEWPORT viewport;
viewport.TopLeftX = x;
viewport.TopLeftY = y;
viewport.Width = width;
viewport.Height = height;
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
// set viewport
m_Context->GetDeviceContext()->RSSetViewports(1u, &viewport);
}
void dxRenderCommand::SetResolution(unsigned int width, unsigned int height)
{
HRESULT hr;
// remove render target
ID3D11RenderTargetView* nullViews[] = { nullptr };
m_Context->GetDeviceContext()->OMSetRenderTargets(1u, nullViews, nullptr);
m_Context->GetRenderTargetViewRef().Reset();
// resize buffer
DXC(m_Context->GetSwapChain()->ResizeBuffers(0u, width, height, DXGI_FORMAT_R8G8B8A8_UNORM, NULL));
// create render target
Microsoft::WRL::ComPtr<ID3D11Resource> backBuffer = nullptr;
DXC(m_Context->GetSwapChain()->GetBuffer(0u, __uuidof(ID3D11Resource), &backBuffer));
DXC(m_Context->GetDevice()->CreateRenderTargetView(backBuffer.Get(), nullptr, &m_Context->GetRenderTargetViewRef()));
2021-07-29 17:12:13 +04:30
// set render target
2021-07-29 17:12:13 +04:30
m_Context->GetDeviceContext()->OMSetRenderTargets(1u, m_Context->GetRenderTargetView().GetAddressOf(), nullptr);
}
2021-06-02 09:07:45 +04:30
}