Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
c36864b
Merge pull request #11 from vsirvent/Gi_optimizations
vsirvent Nov 22, 2024
6ac1f99
Merge pull request #12 from vsirvent/Gi_optimizations
vsirvent Nov 23, 2024
207bfbf
Removed GI ray importance disable flag
vsirvent Nov 23, 2024
454dd0d
Fine tunning GI effect
vsirvent Nov 23, 2024
8f4d770
Optimizing GI denoiser
vsirvent Nov 24, 2024
2c15a4d
Fine tuned GI
vsirvent Nov 24, 2024
21562d3
Merge pull request #13 from vsirvent/GI_denoiser_optimization
vsirvent Nov 24, 2024
9ea294b
Optimized pixel overflow
vsirvent Nov 24, 2024
d0681a7
Updated demo game for GI
vsirvent Nov 25, 2024
a3cb877
Fine tunning denoiser
vsirvent Nov 25, 2024
8bf9a8b
Denoiser by tiles
vsirvent Nov 26, 2024
03ef354
Activates OBH to scale more objects and reduced max distance rays
vsirvent Nov 26, 2024
908b284
Tiling denoising
vsirvent Nov 26, 2024
356e25b
Tunning GI
vsirvent Nov 27, 2024
fff8c16
Merge branch 'GI_denoiser_optimization' of https://github.com/vsirven…
vsirvent Nov 27, 2024
f73fe55
Finished optimizations
vsirvent Nov 27, 2024
35ef60c
Merge branch 'main' into GI_denoiser_optimization
vsirvent Nov 27, 2024
fe998f8
Merge pull request #14 from vsirvent/GI_denoiser_optimization
vsirvent Nov 27, 2024
2633670
optimizing ray material
vsirvent Nov 30, 2024
4a2d082
Merge branch 'GI_denoiser_optimization' of https://github.com/vsirven…
vsirvent Nov 30, 2024
adff94b
Enable minimum W in denoiser
vsirvent Nov 30, 2024
968329f
Merge pull request #15 from vsirvent/GI_denoiser_optimization
vsirvent Nov 30, 2024
feea467
Ordering traverse nodes
vsirvent Dec 4, 2024
aa59f73
Fixed GI average previous pixel calculus and added some optimizations
vsirvent Dec 4, 2024
cf68d05
Branch created
vsirvent Dec 20, 2024
9d24821
setup scene and optimize triangle discard in GS
vsirvent Dec 21, 2024
dc57662
Implemented High-Z mipmaps
vsirvent Dec 21, 2024
845147c
Ray inputs ok, working in ray world solver
vsirvent Dec 22, 2024
980e140
world ray solver working
vsirvent Dec 23, 2024
1f4a05e
Fixed bugs, now RT working
vsirvent Dec 23, 2024
27ed849
fixed transparent rays
vsirvent Dec 23, 2024
ce4db54
Chaned ray input to a texture to improve performance
vsirvent Dec 23, 2024
b9de707
fixed denoise tile skip
vsirvent Dec 23, 2024
aec975f
Ready for starting implementation of SSR
vsirvent Dec 23, 2024
32c6057
Implementing screen space solver
vsirvent Dec 23, 2024
80b7b50
not working yet
vsirvent Dec 24, 2024
c819710
not working yet
vsirvent Dec 25, 2024
749bc70
Need to solve intersection equation correctly
vsirvent Dec 25, 2024
fa02890
SSR Working
vsirvent Dec 25, 2024
c0c36cb
mixing rays
vsirvent Dec 26, 2024
7b0dcab
Working SSR but not mipmapping ray march
vsirvent Dec 26, 2024
5d05c2f
SSR working and finished
vsirvent Dec 26, 2024
9f57595
Add phong in ssr
vsirvent Dec 27, 2024
9bf02c2
optimizing
vsirvent Dec 27, 2024
0097487
Merge branch 'ssr' of https://github.com/vsirvent/HotBiteEngine into ssr
vsirvent Dec 27, 2024
aa7f6ee
optimized
vsirvent Dec 27, 2024
ccb69ef
Optimizing
vsirvent Dec 27, 2024
5e50d1a
Starting SSGI
vsirvent Dec 27, 2024
ca97b3c
Implementing SSGI
vsirvent Dec 27, 2024
80d1cef
Adding screen ray solver to GI
vsirvent Dec 27, 2024
3a79b68
SSGI working
vsirvent Dec 27, 2024
d69930a
SSGI working, DI tranparency broken
vsirvent Dec 28, 2024
f1a68f3
SSGI working
vsirvent Dec 28, 2024
7b83549
GI world space fallback working
vsirvent Dec 29, 2024
3b033a4
Fine tunning SSGI + GI
vsirvent Dec 29, 2024
415d5c6
Optimizing SSR
vsirvent Dec 29, 2024
7d1e33e
Fixed texture alpha
vsirvent Dec 29, 2024
ea35d82
GI PDF Not working
vsirvent Dec 30, 2024
9062786
SSGI working
vsirvent Dec 30, 2024
03f99b6
Optimizing SSR and SSGI
vsirvent Dec 30, 2024
40539ef
SSR and SSGI working
vsirvent Dec 31, 2024
d23eb93
SSR and SSGI split in 2 shaders
vsirvent Dec 31, 2024
1997704
fixed hemisphere rays
vsirvent Jan 1, 2025
b227067
Optimizing
vsirvent Jan 1, 2025
83026d3
Fixed SSR and SSGI
vsirvent Jan 2, 2025
8f0b8b1
Optimize SSR ray calculus
vsirvent Jan 3, 2025
fdf0ad1
Split GI and reflexion world solver
vsirvent Jan 3, 2025
f015080
Added d3d11on12
vsirvent Jan 4, 2025
a964a2d
Added tile ordering
vsirvent Jan 5, 2025
427fd03
Added REFLEX screen and world enabler definitions
vsirvent Jan 9, 2025
b5bcbbe
Small tunes
vsirvent Feb 26, 2025
3454fce
Small fixes
vsirvent Apr 13, 2025
f16472b
Merge pull request #17 from vsirvent/ssr
vsirvent Apr 13, 2025
590f836
Fine tune, disabled screen GI by default
vsirvent May 2, 2025
6d4c239
Removed unused rt_disp
vsirvent May 2, 2025
929ba3a
Merge branch 'main' of https://github.com/vsirvent/HotBiteEngine
vsirvent May 2, 2025
3c70b63
Fixed GI world ratio uint => float
vsirvent May 2, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 27 additions & 10 deletions Engine/Engine.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,8 @@
<None Include="Engine\Core\Shaders\Common\Utils.hlsli" />
<None Include="Engine\Core\Shaders\GUI\GUICommon.hlsli" />
<None Include="Engine\Core\Shaders\MainRender\MainRenderPS.hlsli" />
<None Include="Engine\Core\Shaders\RayTrace\RayScreenSolver.hlsli" />
<None Include="Engine\Core\Shaders\RayTrace\RayWorldSolver.hlsli" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
Expand All @@ -304,6 +306,11 @@
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">4.0</ShaderModel>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\ComputeShaders\HiZDownSample.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">5.0</ShaderModel>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\ComputeShaders\InitDustCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">5.0</ShaderModel>
Expand Down Expand Up @@ -544,16 +551,6 @@
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">/O2 /Gpp %(AdditionalOptions)</AdditionalOptions>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\DispersionCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Release|x64'">5.0</ShaderModel>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">4.0</ShaderModel>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">5.0</ShaderModel>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">4.0</ShaderModel>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\GIRayTraceCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">5.0</ShaderModel>
Expand Down Expand Up @@ -583,6 +580,26 @@
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Release|x64'">5.0</ShaderModel>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\RayGIScreenSolverCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">5.0</ShaderModel>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\RayGIWorldSolverCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">5.0</ShaderModel>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\RayReflexScreenSolverCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">5.0</ShaderModel>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\RayReflexWorldSolverCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">5.0</ShaderModel>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\RayTraceCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Release|x64'">5.0</ShaderModel>
Expand Down
48 changes: 36 additions & 12 deletions Engine/Engine.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@
<Filter Include="Engine\Core\Shaders\DoFBoke">
<UniqueIdentifier>{bf606861-2003-454a-ab74-7da83189dc71}</UniqueIdentifier>
</Filter>
<Filter Include="Engine\Core\Shaders\RayTrace\GI">
<UniqueIdentifier>{9096dc46-36a8-4493-a27e-62a0f4af9708}</UniqueIdentifier>
</Filter>
<Filter Include="Engine\Core\Shaders\RayTrace\Reflex">
<UniqueIdentifier>{2a4aab81-82e6-49c4-87e3-12d55f5bcc26}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Engine\Core\DXCore.cpp">
Expand Down Expand Up @@ -436,6 +442,12 @@
<None Include="Engine\Core\Shaders\Common\RayFunctions.hlsli">
<Filter>Engine\Core\Shaders\Common</Filter>
</None>
<None Include="Engine\Core\Shaders\RayTrace\RayScreenSolver.hlsli">
<Filter>Engine\Core\Shaders\RayTrace</Filter>
</None>
<None Include="Engine\Core\Shaders\RayTrace\RayWorldSolver.hlsli">
<Filter>Engine\Core\Shaders\RayTrace</Filter>
</None>
</ItemGroup>
<ItemGroup>
<FxCompile Include="Engine\Core\Shaders\DepthRender\DepthPS.hlsl">
Expand Down Expand Up @@ -534,9 +546,6 @@
<FxCompile Include="Engine\Core\Shaders\Particles\FireBall2ParticlePS.hlsl">
<Filter>Engine\Core\Shaders\Particles</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\GIRayTraceCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\ComputeShaders\BlurCS.hlsl">
<Filter>Engine\Core\Shaders\ComputeShaders</Filter>
</FxCompile>
Expand Down Expand Up @@ -576,23 +585,38 @@
<FxCompile Include="Engine\Core\Shaders\ComputeShaders\MotionCS.hlsl">
<Filter>Engine\Core\Shaders\ComputeShaders</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\DenoiserCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\DispersionCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\ComputeShaders\CopyTexturesCS.hlsl">
<Filter>Engine\Core\Shaders\ComputeShaders</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\ComputeShaders\HiZDownSample.hlsl">
<Filter>Engine\Core\Shaders\ComputeShaders</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\Radiance\GIAverageCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace</Filter>
<Filter>Engine\Core\Shaders\RayTrace\GI</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\GICalcWeightsCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace</Filter>
<Filter>Engine\Core\Shaders\RayTrace\GI</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\GIRayTraceCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace\GI</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\RayGIScreenSolverCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace\GI</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\RayGIWorldSolverCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace\GI</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\DenoiserCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace\Reflex</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\RayReflexScreenSolverCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace\Reflex</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\RayTraceCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace</Filter>
<Filter>Engine\Core\Shaders\RayTrace\Reflex</Filter>
</FxCompile>
<FxCompile Include="Engine\Core\Shaders\RayTrace\RayReflexWorldSolverCS.hlsl">
<Filter>Engine\Core\Shaders\RayTrace\Reflex</Filter>
</FxCompile>
</ItemGroup>
</Project>
3 changes: 3 additions & 0 deletions Engine/Engine/Components/Lights.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,14 @@ namespace HotBite {
D3D11_VIEWPORT shadow_vp = {};

public:

DirectionalLight();
DirectionalLight(const DirectionalLight& other) :DirectionalLight() {
assert(!other.init && "Non copyable after init.");
*this = other;
}

void SetDirty() { dirty = true; }
void SetPosition(const float3& pos) { data.position = pos; }
const float3& GetPosition() const { return data.position; }
void SetFog(bool enable) {
Expand Down
9 changes: 8 additions & 1 deletion Engine/Engine/Core/BVH.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,14 @@ namespace HotBite {
int right_count = 0;
int left_offset = 0;
int right_offset = 0;
if (LENGHT_F3(extent) > FLT_EPSILON)

if (nidx.index_count == 2) {
left_count = 1;
right_count = 1;
left_offset = nidx.index_offset;
right_offset = left_offset + left_count;

} else if (LENGHT_F3(extent) > FLT_EPSILON)
{
// in-place partition
int i = nidx.index_offset;
Expand Down
41 changes: 12 additions & 29 deletions Engine/Engine/Core/BVH.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,8 @@ namespace HotBite {
return size;
}

HRESULT Prepare(int size, DXGI_FORMAT format) {
HRESULT Prepare(int size) {
Unprepare();
HRESULT hr = S_OK;
ID3D11Device* device = Core::DXCore::Get()->device;

Expand All @@ -155,53 +156,35 @@ namespace HotBite {
bd.ByteWidth = data_size;
bd.CPUAccessFlags = 0;
bd.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS;
bd.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
bd.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
bd.StructureByteStride = sizeof(T);

uint8_t* nullData = new uint8_t[data_size];
memset(nullData, 0, data_size);
initialData.pSysMem = nullData;
hr = device->CreateBuffer(&bd, &initialData, &buffer);
assert(SUCCEEDED(hr));
delete[] nullData;
if (FAILED(hr)) { goto end; }

srvDesc.Format = format;

srvDesc.Format = DXGI_FORMAT_UNKNOWN;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
srvDesc.Buffer.FirstElement = 0;
srvDesc.Buffer.NumElements = size;
hr = device->CreateShaderResourceView(buffer, &srvDesc, &srv);

assert(SUCCEEDED(hr));
srv->GetResource(&resource);

uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
uav_desc.Format = format;
uav_desc.Format = DXGI_FORMAT_UNKNOWN;
uav_desc.Buffer.FirstElement = 0;
uav_desc.Buffer.NumElements = size;
hr = device->CreateUnorderedAccessView(resource, &uav_desc, &uav);
assert(SUCCEEDED(hr));

this->size = size;

end:
return hr;
}

void Clear(T val, uint32_t start = 0, uint32_t len = 0) {
return;
if (len == 0) {
len = (uint32_t)size;
}
if (len > 0 && start < (uint32_t)size) {
ID3D11DeviceContext* context = Core::DXCore::Get()->context;
D3D11_MAPPED_SUBRESOURCE resource;
context->Map(buffer, 0, D3D11_MAP_WRITE, 0, &resource);
T* data = (T*)resource.pData;
for (uint32_t i = start; i < len; ++i) {
data[i] = val;
}
context->Unmap(buffer, 0);
}
}


HRESULT Unprepare() {
ID3D11DeviceContext* context = Core::DXCore::Get()->context;
HRESULT hr = S_OK;
Expand All @@ -221,8 +204,8 @@ namespace HotBite {
return hr;
}

ID3D11ShaderResourceView* SRV() const {
return srv;
ID3D11ShaderResourceView*const* SRV() const {
return &srv;
}

ID3D11UnorderedAccessView*const* UAV() const {
Expand Down
121 changes: 121 additions & 0 deletions Engine/Engine/Core/DXCore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,126 @@ using namespace HotBite::Engine::ECS;
DXCore* DXCore::DXCoreInstance = nullptr;
Direct2D* Direct2D::instance = nullptr;

#include <d3d11.h>
#include <d3d11on12.h>
#include <d3d12.h>

#include <iostream>


HRESULT _D3D11CreateDevice(
IDXGIAdapter* pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
const D3D_FEATURE_LEVEL* pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
ID3D11Device** ppDevice,
D3D_FEATURE_LEVEL* pFeatureLevel,
ID3D11DeviceContext** ppImmediateContext,
ID3D12Device** ppd3d12device) {


HRESULT hr = D3D12CreateDevice(pAdapter,
D3D_FEATURE_LEVEL_12_0,
IID_PPV_ARGS(ppd3d12device));

if (FAILED(hr))
return hr;

D3D12_COMMAND_QUEUE_DESC desc;
desc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_NORMAL;
desc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
desc.NodeMask = 0;

ID3D12CommandQueue* d3d12queue;

hr = (*ppd3d12device)->CreateCommandQueue(&desc,
IID_PPV_ARGS(&d3d12queue));

if (FAILED(hr))
return hr;

hr = D3D11On12CreateDevice((*ppd3d12device),
Flags, pFeatureLevels, FeatureLevels,
reinterpret_cast<IUnknown**>(&d3d12queue),
1, 0, ppDevice, ppImmediateContext, pFeatureLevel);

return hr;
}


HRESULT _D3D11CreateDeviceAndSwapChain(
IDXGIAdapter* pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
const D3D_FEATURE_LEVEL* pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
const DXGI_SWAP_CHAIN_DESC* pSwapChainDesc,
IDXGISwapChain** ppSwapChain,
ID3D11Device** ppDevice,
D3D_FEATURE_LEVEL* pFeatureLevel,
ID3D11DeviceContext** ppImmediateContext,
ID3D12Device** ppd3d12device) {
if (ppSwapChain && !pSwapChainDesc)
return E_INVALIDARG;

ID3D11Device* d3d11Device;
ID3D11DeviceContext* d3d11Context;

HRESULT status = _D3D11CreateDevice(pAdapter, DriverType,
Software, Flags, pFeatureLevels, FeatureLevels,
SDKVersion, &d3d11Device, pFeatureLevel, &d3d11Context, ppd3d12device);

if (FAILED(status))
return status;

if (ppSwapChain) {
IDXGIDevice* dxgiDevice = nullptr;
IDXGIAdapter* dxgiAdapter = nullptr;
IDXGIFactory* dxgiFactory = nullptr;

HRESULT hr = d3d11Device->QueryInterface(IID_PPV_ARGS(&dxgiDevice));

if (FAILED(hr))
return E_INVALIDARG;

hr = dxgiDevice->GetParent(IID_PPV_ARGS(&dxgiAdapter));
dxgiDevice->Release();

if (FAILED(hr))
return E_INVALIDARG;

hr = dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory));
dxgiAdapter->Release();

if (FAILED(hr))
return E_INVALIDARG;

DXGI_SWAP_CHAIN_DESC desc = *pSwapChainDesc;
hr = dxgiFactory->CreateSwapChain(d3d11Device, &desc, ppSwapChain);
dxgiFactory->Release();

if (FAILED(hr))
return hr;
}

if (ppDevice != nullptr)
*ppDevice = d3d11Device;
else
d3d11Device->Release();

if (ppImmediateContext != nullptr)
*ppImmediateContext = d3d11Context;
else
d3d11Context->Release();

return S_OK;
}

LRESULT DXCore::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
Expand Down Expand Up @@ -122,6 +242,7 @@ DXCore::~DXCore()
}
#endif
if (device) { device->Release(); }
if (d12device) { d12device->Release(); }
}

HRESULT DXCore::InitWindow(HWND parent)
Expand Down
Loading