10-bit backbuffer format enabled;
minor updates;
This commit is contained in:
@@ -65,6 +65,8 @@ void Renderable3DComponent::Initialize()
|
||||
{
|
||||
Renderable2DComponent::Initialize();
|
||||
|
||||
FORMAT defaultTextureFormat = GraphicsDevice::GetBackBufferFormat();
|
||||
|
||||
rtSSR.Initialize(
|
||||
(UINT)(wiRenderer::GetDevice()->GetScreenWidth()), (UINT)(wiRenderer::GetDevice()->GetScreenHeight())
|
||||
, false, FORMAT_R16G16B16A16_FLOAT);
|
||||
@@ -93,20 +95,20 @@ void Renderable3DComponent::Initialize()
|
||||
, true, FORMAT_R16G16B16A16_FLOAT);
|
||||
rtFinal[0].Initialize(
|
||||
wiRenderer::GetDevice()->GetScreenWidth(), wiRenderer::GetDevice()->GetScreenHeight()
|
||||
, false);
|
||||
, false, defaultTextureFormat);
|
||||
rtFinal[1].Initialize(
|
||||
wiRenderer::GetDevice()->GetScreenWidth(), wiRenderer::GetDevice()->GetScreenHeight()
|
||||
, false,FORMAT_R8G8B8A8_UNORM,1,getMSAASampleCount());
|
||||
, false, defaultTextureFormat,1,getMSAASampleCount());
|
||||
|
||||
rtDof[0].Initialize(
|
||||
(UINT)(wiRenderer::GetDevice()->GetScreenWidth()*0.5f), (UINT)(wiRenderer::GetDevice()->GetScreenHeight()*0.5f)
|
||||
, false);
|
||||
, false, defaultTextureFormat);
|
||||
rtDof[1].Initialize(
|
||||
(UINT)(wiRenderer::GetDevice()->GetScreenWidth()*0.5f), (UINT)(wiRenderer::GetDevice()->GetScreenHeight()*0.5f)
|
||||
, false);
|
||||
, false, defaultTextureFormat);
|
||||
rtDof[2].Initialize(
|
||||
wiRenderer::GetDevice()->GetScreenWidth(), wiRenderer::GetDevice()->GetScreenHeight()
|
||||
, false);
|
||||
, false, defaultTextureFormat);
|
||||
|
||||
dtDepthCopy.Initialize(wiRenderer::GetDevice()->GetScreenWidth(), wiRenderer::GetDevice()->GetScreenHeight(), getMSAASampleCount());
|
||||
|
||||
@@ -121,24 +123,24 @@ void Renderable3DComponent::Initialize()
|
||||
rtSun[0].Initialize(
|
||||
wiRenderer::GetDevice()->GetScreenWidth()
|
||||
, wiRenderer::GetDevice()->GetScreenHeight()
|
||||
, true
|
||||
, true, defaultTextureFormat
|
||||
);
|
||||
rtSun[1].Initialize(
|
||||
(UINT)(wiRenderer::GetDevice()->GetScreenWidth()*getLightShaftQuality())
|
||||
, (UINT)(wiRenderer::GetDevice()->GetScreenHeight()*getLightShaftQuality())
|
||||
, false, FORMAT_R8G8B8A8_UNORM, 1,getMSAASampleCount()
|
||||
, false, defaultTextureFormat, 1,getMSAASampleCount()
|
||||
);
|
||||
|
||||
rtBloom.resize(3);
|
||||
rtBloom[0].Initialize(
|
||||
wiRenderer::GetDevice()->GetScreenWidth()
|
||||
, wiRenderer::GetDevice()->GetScreenHeight()
|
||||
, false, FORMAT_R8G8B8A8_UNORM, 0);
|
||||
, false, defaultTextureFormat, 0);
|
||||
for (unsigned int i = 1; i<rtBloom.size(); ++i)
|
||||
rtBloom[i].Initialize(
|
||||
(UINT)(wiRenderer::GetDevice()->GetScreenWidth() / getBloomDownSample())
|
||||
, (UINT)(wiRenderer::GetDevice()->GetScreenHeight() / getBloomDownSample())
|
||||
, false);
|
||||
, false, defaultTextureFormat);
|
||||
}
|
||||
|
||||
void Renderable3DComponent::Load()
|
||||
|
||||
Binary file not shown.
@@ -501,6 +501,7 @@
|
||||
<ClCompile Include="$(MSBuildThisFileDirectory)ForwardRenderableComponent_BindLua.cpp" />
|
||||
<ClCompile Include="$(MSBuildThisFileDirectory)TiledForwardRenderableComponent.cpp" />
|
||||
<ClCompile Include="$(MSBuildThisFileDirectory)wiArchive.cpp" />
|
||||
<ClCompile Include="$(MSBuildThisFileDirectory)wiGraphicsDevice.cpp" />
|
||||
<ClCompile Include="$(MSBuildThisFileDirectory)wiHashString.cpp" />
|
||||
<ClCompile Include="$(MSBuildThisFileDirectory)LoadingScreenComponent.cpp" />
|
||||
<ClCompile Include="$(MSBuildThisFileDirectory)LoadingScreenComponent_BindLua.cpp" />
|
||||
|
||||
@@ -1850,6 +1850,9 @@
|
||||
<ClCompile Include="$(MSBuildThisFileDirectory)wiIntersectables.cpp">
|
||||
<Filter>ENGINE\Helpers</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(MSBuildThisFileDirectory)wiGraphicsDevice.cpp">
|
||||
<Filter>ENGINE\Graphics</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="$(MSBuildThisFileDirectory)logo\logo.png">
|
||||
|
||||
@@ -8,7 +8,7 @@ VertexToPixel main(uint vid : SV_VERTEXID)
|
||||
FullScreenTriangle(vid, Out.pos);
|
||||
|
||||
Out.pos2D = Out.pos;
|
||||
Out.lightIndex = g_xMisc_int4[0];
|
||||
Out.lightIndex = (int)g_xColor.x;
|
||||
|
||||
return Out;
|
||||
}
|
||||
@@ -94,7 +94,6 @@ CBUFFER(MiscCB, CBSLOT_RENDERER_MISC)
|
||||
{
|
||||
float4x4 g_xTransform;
|
||||
float4 g_xColor;
|
||||
int4 g_xMisc_int4;
|
||||
};
|
||||
|
||||
CBUFFER(APICB, CBSLOT_API)
|
||||
|
||||
@@ -7,6 +7,6 @@ VertexToPixel main(uint vid : SV_VERTEXID)
|
||||
|
||||
float4 pos = float4(ICOSPHERE[vid],1);
|
||||
Out.pos = Out.pos2D = mul(mul(pos,g_xTransform),g_xCamera_VP);
|
||||
Out.lightIndex = g_xMisc_int4[0];
|
||||
Out.lightIndex = (int)g_xColor.x;
|
||||
return Out;
|
||||
}
|
||||
@@ -9,8 +9,8 @@ float4 main(QGS_OUT PSIn) : SV_Target
|
||||
#endif
|
||||
|
||||
float4 color = texture_0.Sample(sampler_linear_clamp,PSIn.tex);
|
||||
float opacity = color.a;
|
||||
ALPHATEST(color.a)
|
||||
float opacity = 1; // keep edge diffuse shading
|
||||
color = DEGAMMA(color);
|
||||
color.a = 1; // do not blend
|
||||
float3 P = PSIn.pos3D;
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
float4 main(QGS_OUT PSIn) : SV_Target
|
||||
{
|
||||
float4 color = texture_0.Sample(sampler_linear_clamp,PSIn.tex);
|
||||
float opacity = color.a;
|
||||
clip(color.a - 1.0f / 256.0f); // cancel heaviest overdraw for the alpha composition effect
|
||||
float opacity = color.a;
|
||||
color = DEGAMMA(color);
|
||||
float3 P = PSIn.pos3D;
|
||||
float3 V = g_xCamera_CamPos - P;
|
||||
|
||||
@@ -9,6 +9,6 @@ VertexToPixel main(uint vid : SV_VERTEXID)
|
||||
float4 pos = float4(CONE[vid],1);
|
||||
pos = mul( pos, g_xTransform );
|
||||
Out.pos = Out.pos2D = mul(pos,g_xCamera_VP);
|
||||
Out.lightIndex = g_xMisc_int4[0];
|
||||
Out.lightIndex = (int)g_xColor.x;
|
||||
return Out;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
#include "wiGraphicsDevice.h"
|
||||
|
||||
using namespace wiGraphicsTypes;
|
||||
|
||||
FORMAT GraphicsDevice::BACKBUFFER_FORMAT = FORMAT::FORMAT_R10G10B10A2_UNORM;
|
||||
|
||||
FORMAT GraphicsDevice::GetBackBufferFormat()
|
||||
{
|
||||
return BACKBUFFER_FORMAT;
|
||||
}
|
||||
@@ -16,6 +16,7 @@ namespace wiGraphicsTypes
|
||||
bool VSYNC;
|
||||
int SCREENWIDTH, SCREENHEIGHT;
|
||||
bool FULLSCREEN;
|
||||
static FORMAT BACKBUFFER_FORMAT;
|
||||
public:
|
||||
GraphicsDevice() :FRAMECOUNT(0), VSYNC(true), SCREENWIDTH(0), SCREENHEIGHT(0), FULLSCREEN(false) {}
|
||||
|
||||
@@ -71,6 +72,7 @@ namespace wiGraphicsTypes
|
||||
{
|
||||
return XMMatrixOrthographicOffCenterLH(0, (float)GetScreenWidth(), (float)GetScreenHeight(), 0, -1, 1);
|
||||
}
|
||||
static FORMAT GetBackBufferFormat();
|
||||
|
||||
///////////////Thread-sensitive////////////////////////
|
||||
|
||||
|
||||
@@ -11,221 +11,6 @@
|
||||
|
||||
namespace wiGraphicsTypes
|
||||
{
|
||||
|
||||
GraphicsDevice_DX11::GraphicsDevice_DX11(wiWindowRegistration::window_type window, bool fullscreen) : GraphicsDevice()
|
||||
{
|
||||
FULLSCREEN = fullscreen;
|
||||
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
for (int i = 0; i<GRAPHICSTHREAD_COUNT; i++) {
|
||||
SAFE_INIT(commandLists[i]);
|
||||
SAFE_INIT(deviceContexts[i]);
|
||||
}
|
||||
|
||||
UINT createDeviceFlags = 0;
|
||||
#ifdef _DEBUG
|
||||
#ifndef WINSTORE_SUPPORT
|
||||
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
D3D_DRIVER_TYPE driverTypes[] =
|
||||
{
|
||||
D3D_DRIVER_TYPE_HARDWARE,
|
||||
D3D_DRIVER_TYPE_WARP,
|
||||
D3D_DRIVER_TYPE_REFERENCE,
|
||||
};
|
||||
UINT numDriverTypes = ARRAYSIZE(driverTypes);
|
||||
|
||||
D3D_FEATURE_LEVEL featureLevels[] =
|
||||
{
|
||||
D3D_FEATURE_LEVEL_11_1,
|
||||
D3D_FEATURE_LEVEL_11_0,
|
||||
D3D_FEATURE_LEVEL_10_1,
|
||||
//D3D_FEATURE_LEVEL_10_0,
|
||||
};
|
||||
UINT numFeatureLevels = ARRAYSIZE(featureLevels);
|
||||
|
||||
#ifndef WINSTORE_SUPPORT
|
||||
RECT rect = RECT();
|
||||
GetClientRect(window, &rect);
|
||||
SCREENWIDTH = rect.right - rect.left;
|
||||
SCREENHEIGHT = rect.bottom - rect.top;
|
||||
|
||||
DXGI_SWAP_CHAIN_DESC sd;
|
||||
ZeroMemory(&sd, sizeof(sd));
|
||||
sd.BufferCount = 2;
|
||||
sd.BufferDesc.Width = SCREENWIDTH;
|
||||
sd.BufferDesc.Height = SCREENHEIGHT;
|
||||
sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
sd.BufferDesc.RefreshRate.Numerator = 60;
|
||||
sd.BufferDesc.RefreshRate.Denominator = 1;
|
||||
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||
sd.OutputWindow = window;
|
||||
sd.SampleDesc.Count = 1;
|
||||
sd.SampleDesc.Quality = 0;
|
||||
sd.Windowed = !fullscreen;
|
||||
#endif
|
||||
|
||||
for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++)
|
||||
{
|
||||
driverType = driverTypes[driverTypeIndex];
|
||||
#ifndef WINSTORE_SUPPORT
|
||||
hr = D3D11CreateDeviceAndSwapChain(NULL, driverType, NULL, createDeviceFlags, featureLevels, numFeatureLevels,
|
||||
D3D11_SDK_VERSION, &sd, &swapChain, &device, &featureLevel, &deviceContexts[GRAPHICSTHREAD_IMMEDIATE]);
|
||||
#else
|
||||
hr = D3D11CreateDevice(nullptr, driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &device
|
||||
, &featureLevel, &deviceContexts[GRAPHICSTHREAD_IMMEDIATE]);
|
||||
#endif
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
break;
|
||||
}
|
||||
if (FAILED(hr)) {
|
||||
wiHelper::messageBox("SwapChain Creation Failed!", "Error!");
|
||||
#ifdef BACKLOG
|
||||
wiBackLog::post("SwapChain Creation Failed!");
|
||||
#endif
|
||||
exit(1);
|
||||
}
|
||||
DX11 = ((device->GetFeatureLevel() >= D3D_FEATURE_LEVEL_11_0) ? true : false);
|
||||
|
||||
|
||||
#ifdef WINSTORE_SUPPORT
|
||||
DXGI_SWAP_CHAIN_DESC1 sd = { 0 };
|
||||
sd.Width = SCREENWIDTH = (int)window->Bounds.Width;
|
||||
sd.Height = SCREENHEIGHT = (int)window->Bounds.Height;
|
||||
sd.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format.
|
||||
sd.Stereo = false;
|
||||
sd.SampleDesc.Count = 1; // Don't use multi-sampling.
|
||||
sd.SampleDesc.Quality = 0;
|
||||
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||
sd.BufferCount = 2; // Use double-buffering to minimize latency.
|
||||
sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Windows Store apps must use this SwapEffect.
|
||||
sd.Flags = 0;
|
||||
sd.Scaling = DXGI_SCALING_STRETCH;
|
||||
sd.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
|
||||
|
||||
IDXGIDevice2 * pDXGIDevice;
|
||||
hr = device->QueryInterface(__uuidof(IDXGIDevice2), (void **)&pDXGIDevice);
|
||||
|
||||
IDXGIAdapter * pDXGIAdapter;
|
||||
hr = pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&pDXGIAdapter);
|
||||
|
||||
IDXGIFactory2 * pIDXGIFactory;
|
||||
pDXGIAdapter->GetParent(__uuidof(IDXGIFactory2), (void **)&pIDXGIFactory);
|
||||
|
||||
|
||||
hr = pIDXGIFactory->CreateSwapChainForCoreWindow(device, reinterpret_cast<IUnknown*>(window), &sd
|
||||
, nullptr, &swapChain);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
wiHelper::messageBox("Swap chain creation failed!", "Error!");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and
|
||||
// ensures that the application will only render after each VSync, minimizing power consumption.
|
||||
hr = pDXGIDevice->SetMaximumFrameLatency(1);
|
||||
#endif
|
||||
|
||||
hr = deviceContexts[GRAPHICSTHREAD_IMMEDIATE]->QueryInterface(__uuidof(userDefinedAnnotations[GRAPHICSTHREAD_IMMEDIATE]),
|
||||
reinterpret_cast<void**>(&userDefinedAnnotations[GRAPHICSTHREAD_IMMEDIATE]));
|
||||
|
||||
DEFERREDCONTEXT_SUPPORT = false;
|
||||
D3D11_FEATURE_DATA_THREADING threadingFeature;
|
||||
device->CheckFeatureSupport(D3D11_FEATURE_THREADING, &threadingFeature, sizeof(threadingFeature));
|
||||
if (threadingFeature.DriverConcurrentCreates && threadingFeature.DriverCommandLists) {
|
||||
DEFERREDCONTEXT_SUPPORT = true;
|
||||
for (int i = 0; i<GRAPHICSTHREAD_COUNT; i++) {
|
||||
if (i == (int)GRAPHICSTHREAD_IMMEDIATE)
|
||||
continue;
|
||||
hr = device->CreateDeferredContext(0, &deviceContexts[i]);
|
||||
hr = deviceContexts[i]->QueryInterface(__uuidof(userDefinedAnnotations[i]),
|
||||
reinterpret_cast<void**>(&userDefinedAnnotations[i]));
|
||||
}
|
||||
}
|
||||
else {
|
||||
DEFERREDCONTEXT_SUPPORT = false;
|
||||
}
|
||||
|
||||
|
||||
// Create a render target view
|
||||
backBuffer = NULL;
|
||||
hr = swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBuffer);
|
||||
if (FAILED(hr)) {
|
||||
wiHelper::messageBox("BackBuffer creation Failed!", "Error!");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
hr = device->CreateRenderTargetView(backBuffer, NULL, &renderTargetView);
|
||||
//pBackBuffer->Release();
|
||||
if (FAILED(hr)) {
|
||||
wiHelper::messageBox("Main Rendertarget creation Failed!", "Error!");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
// Setup the main viewport
|
||||
viewPort.Width = (FLOAT)SCREENWIDTH;
|
||||
viewPort.Height = (FLOAT)SCREENHEIGHT;
|
||||
viewPort.MinDepth = 0.0f;
|
||||
viewPort.MaxDepth = 1.0f;
|
||||
viewPort.TopLeftX = 0;
|
||||
viewPort.TopLeftY = 0;
|
||||
|
||||
}
|
||||
GraphicsDevice_DX11::~GraphicsDevice_DX11()
|
||||
{
|
||||
SAFE_RELEASE(renderTargetView);
|
||||
SAFE_RELEASE(swapChain);
|
||||
|
||||
for (int i = 0; i<GRAPHICSTHREAD_COUNT; i++) {
|
||||
SAFE_RELEASE(commandLists[i]);
|
||||
SAFE_RELEASE(deviceContexts[i]);
|
||||
}
|
||||
|
||||
SAFE_RELEASE(device);
|
||||
}
|
||||
|
||||
void GraphicsDevice_DX11::SetScreenWidth(int value)
|
||||
{
|
||||
SCREENWIDTH = value;
|
||||
// TODO: resize backbuffer
|
||||
}
|
||||
void GraphicsDevice_DX11::SetScreenHeight(int value)
|
||||
{
|
||||
SCREENHEIGHT = value;
|
||||
// TODO: resize backbuffer
|
||||
}
|
||||
|
||||
Texture2D GraphicsDevice_DX11::GetBackBuffer()
|
||||
{
|
||||
Texture2D result;
|
||||
result.texture2D_DX11 = backBuffer;
|
||||
backBuffer->AddRef();
|
||||
return result;
|
||||
}
|
||||
|
||||
bool GraphicsDevice_DX11::CheckCapability(GRAPHICSDEVICE_CAPABILITY capability)
|
||||
{
|
||||
switch (capability)
|
||||
{
|
||||
case wiGraphicsTypes::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_TESSELLATION:
|
||||
return DX11;
|
||||
break;
|
||||
case wiGraphicsTypes::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_MULTITHREADED_RENDERING:
|
||||
return DEFERREDCONTEXT_SUPPORT;
|
||||
break;
|
||||
case wiGraphicsTypes::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_COUNT:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Engine -> Native converters
|
||||
|
||||
inline UINT _ParseBindFlags(UINT value)
|
||||
@@ -1505,25 +1290,243 @@ inline USAGE _ConvertUsage_Inv(D3D11_USAGE value)
|
||||
}
|
||||
|
||||
inline Texture2DDesc _ConvertTexture2DDesc_Inv(const D3D11_TEXTURE2D_DESC* pDesc)
|
||||
{
|
||||
Texture2DDesc desc;
|
||||
desc.Width = pDesc->Width;
|
||||
desc.Height = pDesc->Height;
|
||||
desc.MipLevels = pDesc->MipLevels;
|
||||
desc.ArraySize = pDesc->ArraySize;
|
||||
desc.Format = _ConvertFormat_Inv(pDesc->Format);
|
||||
desc.SampleDesc.Count = pDesc->SampleDesc.Count;
|
||||
desc.SampleDesc.Quality = pDesc->SampleDesc.Quality;
|
||||
desc.Usage = _ConvertUsage_Inv(pDesc->Usage);
|
||||
desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags);
|
||||
desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags);
|
||||
desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags);
|
||||
{
|
||||
Texture2DDesc desc;
|
||||
desc.Width = pDesc->Width;
|
||||
desc.Height = pDesc->Height;
|
||||
desc.MipLevels = pDesc->MipLevels;
|
||||
desc.ArraySize = pDesc->ArraySize;
|
||||
desc.Format = _ConvertFormat_Inv(pDesc->Format);
|
||||
desc.SampleDesc.Count = pDesc->SampleDesc.Count;
|
||||
desc.SampleDesc.Quality = pDesc->SampleDesc.Quality;
|
||||
desc.Usage = _ConvertUsage_Inv(pDesc->Usage);
|
||||
desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags);
|
||||
desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags);
|
||||
desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags);
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
// Engine functions
|
||||
|
||||
GraphicsDevice_DX11::GraphicsDevice_DX11(wiWindowRegistration::window_type window, bool fullscreen) : GraphicsDevice()
|
||||
{
|
||||
FULLSCREEN = fullscreen;
|
||||
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
for (int i = 0; i<GRAPHICSTHREAD_COUNT; i++)
|
||||
{
|
||||
SAFE_INIT(commandLists[i]);
|
||||
SAFE_INIT(deviceContexts[i]);
|
||||
}
|
||||
|
||||
UINT createDeviceFlags = 0;
|
||||
#ifdef _DEBUG
|
||||
#ifndef WINSTORE_SUPPORT
|
||||
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
D3D_DRIVER_TYPE driverTypes[] =
|
||||
{
|
||||
D3D_DRIVER_TYPE_HARDWARE,
|
||||
D3D_DRIVER_TYPE_WARP,
|
||||
D3D_DRIVER_TYPE_REFERENCE,
|
||||
};
|
||||
UINT numDriverTypes = ARRAYSIZE(driverTypes);
|
||||
|
||||
D3D_FEATURE_LEVEL featureLevels[] =
|
||||
{
|
||||
D3D_FEATURE_LEVEL_11_1,
|
||||
D3D_FEATURE_LEVEL_11_0,
|
||||
D3D_FEATURE_LEVEL_10_1,
|
||||
//D3D_FEATURE_LEVEL_10_0,
|
||||
};
|
||||
UINT numFeatureLevels = ARRAYSIZE(featureLevels);
|
||||
|
||||
#ifndef WINSTORE_SUPPORT
|
||||
RECT rect = RECT();
|
||||
GetClientRect(window, &rect);
|
||||
SCREENWIDTH = rect.right - rect.left;
|
||||
SCREENHEIGHT = rect.bottom - rect.top;
|
||||
|
||||
DXGI_SWAP_CHAIN_DESC sd;
|
||||
ZeroMemory(&sd, sizeof(sd));
|
||||
sd.BufferCount = 2;
|
||||
sd.BufferDesc.Width = SCREENWIDTH;
|
||||
sd.BufferDesc.Height = SCREENHEIGHT;
|
||||
sd.BufferDesc.Format = _ConvertFormat(GetBackBufferFormat());
|
||||
sd.BufferDesc.RefreshRate.Numerator = 60;
|
||||
sd.BufferDesc.RefreshRate.Denominator = 1;
|
||||
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||
sd.OutputWindow = window;
|
||||
sd.SampleDesc.Count = 1;
|
||||
sd.SampleDesc.Quality = 0;
|
||||
sd.Windowed = !fullscreen;
|
||||
#endif
|
||||
|
||||
for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++)
|
||||
{
|
||||
driverType = driverTypes[driverTypeIndex];
|
||||
#ifndef WINSTORE_SUPPORT
|
||||
hr = D3D11CreateDeviceAndSwapChain(NULL, driverType, NULL, createDeviceFlags, featureLevels, numFeatureLevels,
|
||||
D3D11_SDK_VERSION, &sd, &swapChain, &device, &featureLevel, &deviceContexts[GRAPHICSTHREAD_IMMEDIATE]);
|
||||
#else
|
||||
hr = D3D11CreateDevice(nullptr, driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &device
|
||||
, &featureLevel, &deviceContexts[GRAPHICSTHREAD_IMMEDIATE]);
|
||||
#endif
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
break;
|
||||
}
|
||||
if (FAILED(hr)) {
|
||||
wiHelper::messageBox("SwapChain Creation Failed!", "Error!");
|
||||
#ifdef BACKLOG
|
||||
wiBackLog::post("SwapChain Creation Failed!");
|
||||
#endif
|
||||
exit(1);
|
||||
}
|
||||
DX11 = ((device->GetFeatureLevel() >= D3D_FEATURE_LEVEL_11_0) ? true : false);
|
||||
|
||||
|
||||
#ifdef WINSTORE_SUPPORT
|
||||
DXGI_SWAP_CHAIN_DESC1 sd = { 0 };
|
||||
sd.Width = SCREENWIDTH = (int)window->Bounds.Width;
|
||||
sd.Height = SCREENHEIGHT = (int)window->Bounds.Height;
|
||||
sd.Format = _ConvertFormat(GetBackBufferFormat());
|
||||
sd.Stereo = false;
|
||||
sd.SampleDesc.Count = 1; // Don't use multi-sampling.
|
||||
sd.SampleDesc.Quality = 0;
|
||||
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||
sd.BufferCount = 2; // Use double-buffering to minimize latency.
|
||||
sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Windows Store apps must use this SwapEffect.
|
||||
sd.Flags = 0;
|
||||
sd.Scaling = DXGI_SCALING_STRETCH;
|
||||
sd.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
|
||||
|
||||
IDXGIDevice2 * pDXGIDevice;
|
||||
hr = device->QueryInterface(__uuidof(IDXGIDevice2), (void **)&pDXGIDevice);
|
||||
|
||||
IDXGIAdapter * pDXGIAdapter;
|
||||
hr = pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&pDXGIAdapter);
|
||||
|
||||
IDXGIFactory2 * pIDXGIFactory;
|
||||
pDXGIAdapter->GetParent(__uuidof(IDXGIFactory2), (void **)&pIDXGIFactory);
|
||||
|
||||
|
||||
hr = pIDXGIFactory->CreateSwapChainForCoreWindow(device, reinterpret_cast<IUnknown*>(window), &sd
|
||||
, nullptr, &swapChain);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
wiHelper::messageBox("Swap chain creation failed!", "Error!");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and
|
||||
// ensures that the application will only render after each VSync, minimizing power consumption.
|
||||
hr = pDXGIDevice->SetMaximumFrameLatency(1);
|
||||
#endif
|
||||
|
||||
hr = deviceContexts[GRAPHICSTHREAD_IMMEDIATE]->QueryInterface(__uuidof(userDefinedAnnotations[GRAPHICSTHREAD_IMMEDIATE]),
|
||||
reinterpret_cast<void**>(&userDefinedAnnotations[GRAPHICSTHREAD_IMMEDIATE]));
|
||||
|
||||
DEFERREDCONTEXT_SUPPORT = false;
|
||||
D3D11_FEATURE_DATA_THREADING threadingFeature;
|
||||
device->CheckFeatureSupport(D3D11_FEATURE_THREADING, &threadingFeature, sizeof(threadingFeature));
|
||||
if (threadingFeature.DriverConcurrentCreates && threadingFeature.DriverCommandLists) {
|
||||
DEFERREDCONTEXT_SUPPORT = true;
|
||||
for (int i = 0; i<GRAPHICSTHREAD_COUNT; i++) {
|
||||
if (i == (int)GRAPHICSTHREAD_IMMEDIATE)
|
||||
continue;
|
||||
hr = device->CreateDeferredContext(0, &deviceContexts[i]);
|
||||
hr = deviceContexts[i]->QueryInterface(__uuidof(userDefinedAnnotations[i]),
|
||||
reinterpret_cast<void**>(&userDefinedAnnotations[i]));
|
||||
}
|
||||
}
|
||||
else {
|
||||
DEFERREDCONTEXT_SUPPORT = false;
|
||||
}
|
||||
|
||||
|
||||
// Create a render target view
|
||||
backBuffer = NULL;
|
||||
hr = swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBuffer);
|
||||
if (FAILED(hr)) {
|
||||
wiHelper::messageBox("BackBuffer creation Failed!", "Error!");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
hr = device->CreateRenderTargetView(backBuffer, NULL, &renderTargetView);
|
||||
//pBackBuffer->Release();
|
||||
if (FAILED(hr)) {
|
||||
wiHelper::messageBox("Main Rendertarget creation Failed!", "Error!");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
// Setup the main viewport
|
||||
viewPort.Width = (FLOAT)SCREENWIDTH;
|
||||
viewPort.Height = (FLOAT)SCREENHEIGHT;
|
||||
viewPort.MinDepth = 0.0f;
|
||||
viewPort.MaxDepth = 1.0f;
|
||||
viewPort.TopLeftX = 0;
|
||||
viewPort.TopLeftY = 0;
|
||||
|
||||
}
|
||||
GraphicsDevice_DX11::~GraphicsDevice_DX11()
|
||||
{
|
||||
SAFE_RELEASE(renderTargetView);
|
||||
SAFE_RELEASE(swapChain);
|
||||
|
||||
for (int i = 0; i<GRAPHICSTHREAD_COUNT; i++) {
|
||||
SAFE_RELEASE(commandLists[i]);
|
||||
SAFE_RELEASE(deviceContexts[i]);
|
||||
}
|
||||
|
||||
SAFE_RELEASE(device);
|
||||
}
|
||||
|
||||
void GraphicsDevice_DX11::SetScreenWidth(int value)
|
||||
{
|
||||
SCREENWIDTH = value;
|
||||
// TODO: resize backbuffer
|
||||
}
|
||||
void GraphicsDevice_DX11::SetScreenHeight(int value)
|
||||
{
|
||||
SCREENHEIGHT = value;
|
||||
// TODO: resize backbuffer
|
||||
}
|
||||
|
||||
Texture2D GraphicsDevice_DX11::GetBackBuffer()
|
||||
{
|
||||
Texture2D result;
|
||||
result.texture2D_DX11 = backBuffer;
|
||||
backBuffer->AddRef();
|
||||
return result;
|
||||
}
|
||||
|
||||
bool GraphicsDevice_DX11::CheckCapability(GRAPHICSDEVICE_CAPABILITY capability)
|
||||
{
|
||||
switch (capability)
|
||||
{
|
||||
case wiGraphicsTypes::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_TESSELLATION:
|
||||
return DX11;
|
||||
break;
|
||||
case wiGraphicsTypes::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_MULTITHREADED_RENDERING:
|
||||
return DEFERREDCONTEXT_SUPPORT;
|
||||
break;
|
||||
case wiGraphicsTypes::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_COUNT:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
HRESULT GraphicsDevice_DX11::CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *ppBuffer)
|
||||
{
|
||||
D3D11_BUFFER_DESC desc;
|
||||
|
||||
@@ -1476,7 +1476,7 @@ void wiRenderer::UpdatePerFrameData()
|
||||
if (!foundClosestReflector && camera == getCamera() && object->IsReflector())
|
||||
{
|
||||
// If it is the main camera's culling, then obtain the reflectors:
|
||||
XMVECTOR _refPlane = XMPlaneFromPointNormal(XMLoadFloat3(&object->bounds.getCenter()), XMVectorSet(0, 1, 0, 0));
|
||||
XMVECTOR _refPlane = XMPlaneFromPointNormal(XMLoadFloat3(&object->/*bounds.getCenter()*/translation), XMVectorSet(0, 1, 0, 0));
|
||||
XMFLOAT4 plane;
|
||||
XMStoreFloat4(&plane, _refPlane);
|
||||
waterPlane = wiWaterPlane(plane.x, plane.y, plane.z, plane.w);
|
||||
@@ -1929,7 +1929,7 @@ void wiRenderer::DrawDebugBoxes(Camera* camera, GRAPHICSTHREAD threadID)
|
||||
GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_LINE],threadID);
|
||||
|
||||
GetDevice()->BindRasterizerState(rasterizers[RSTYPE_WIRE_DOUBLESIDED_SMOOTH],threadID);
|
||||
GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT],STENCILREF_EMPTY,threadID);
|
||||
GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEPTHREAD],STENCILREF_EMPTY,threadID);
|
||||
GetDevice()->BindBlendState(blendStates[BSTYPE_TRANSPARENT],threadID);
|
||||
|
||||
|
||||
@@ -2116,24 +2116,25 @@ void wiRenderer::DrawDebugGridHelper(Camera* camera, GRAPHICSTHREAD threadID)
|
||||
static GPUBuffer* grid = nullptr;
|
||||
if (grid == nullptr)
|
||||
{
|
||||
const float h = 0.01f; // avoid z-fight with zero plane
|
||||
const int a = 20;
|
||||
XMFLOAT4 verts[((a+1) * 2 + (a+1) * 2) * 2];
|
||||
|
||||
int count = 0;
|
||||
for (int i = 0; i <= a; ++i)
|
||||
{
|
||||
verts[count++] = XMFLOAT4(i - a*0.5f, 0, -a*0.5f, 1);
|
||||
verts[count++] = XMFLOAT4(i - a*0.5f, h, -a*0.5f, 1);
|
||||
verts[count++] = (i == a / 2 ? XMFLOAT4(0, 0, 1, 1) : XMFLOAT4(col, col, col, 1));
|
||||
|
||||
verts[count++] = XMFLOAT4(i - a*0.5f, 0, +a*0.5f, 1);
|
||||
verts[count++] = XMFLOAT4(i - a*0.5f, h, +a*0.5f, 1);
|
||||
verts[count++] = (i == a / 2 ? XMFLOAT4(0, 0, 1, 1) : XMFLOAT4(col, col, col, 1));
|
||||
}
|
||||
for (int j = 0; j <= a; ++j)
|
||||
{
|
||||
verts[count++] = XMFLOAT4(-a*0.5f, 0, j - a*0.5f, 1);
|
||||
verts[count++] = XMFLOAT4(-a*0.5f, h, j - a*0.5f, 1);
|
||||
verts[count++] = (j == a / 2 ? XMFLOAT4(1, 0, 0, 1) : XMFLOAT4(col, col, col, 1));
|
||||
|
||||
verts[count++] = XMFLOAT4(+a*0.5f, 0, j - a*0.5f, 1);
|
||||
verts[count++] = XMFLOAT4(+a*0.5f, h, j - a*0.5f, 1);
|
||||
verts[count++] = (j == a / 2 ? XMFLOAT4(1, 0, 0, 1) : XMFLOAT4(col, col, col, 1));
|
||||
}
|
||||
|
||||
@@ -2373,7 +2374,7 @@ void wiRenderer::DrawLights(Camera* camera, GRAPHICSTHREAD threadID)
|
||||
if(type==0) //dir
|
||||
{
|
||||
MiscCB miscCb;
|
||||
miscCb.mInt[0] = l->lightArray_index;
|
||||
miscCb.mColor.x = (float)l->lightArray_index;
|
||||
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &miscCb, threadID);
|
||||
|
||||
GetDevice()->Draw(3, threadID); // full screen triangle
|
||||
@@ -2381,7 +2382,7 @@ void wiRenderer::DrawLights(Camera* camera, GRAPHICSTHREAD threadID)
|
||||
else if(type==1) //point
|
||||
{
|
||||
MiscCB miscCb;
|
||||
miscCb.mInt[0] = l->lightArray_index;
|
||||
miscCb.mColor.x = (float)l->lightArray_index;
|
||||
float sca = l->enerDis.y + 1;
|
||||
miscCb.mTransform = XMMatrixTranspose(XMMatrixScaling(sca,sca,sca)*XMMatrixTranslation(l->translation.x, l->translation.y, l->translation.z));
|
||||
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &miscCb, threadID);
|
||||
@@ -2391,7 +2392,7 @@ void wiRenderer::DrawLights(Camera* camera, GRAPHICSTHREAD threadID)
|
||||
else if(type==2) //spot
|
||||
{
|
||||
MiscCB miscCb;
|
||||
miscCb.mInt[0] = l->lightArray_index;
|
||||
miscCb.mColor.x = (float)l->lightArray_index;
|
||||
const float coneS = (const float)(l->enerDis.z / XM_PIDIV4);
|
||||
miscCb.mTransform = XMMatrixTranspose(
|
||||
XMMatrixScaling(coneS*l->enerDis.y, l->enerDis.y, coneS*l->enerDis.y)*
|
||||
|
||||
@@ -160,7 +160,6 @@ public:
|
||||
{
|
||||
XMMATRIX mTransform;
|
||||
XMFLOAT4 mColor;
|
||||
int mInt[4];
|
||||
|
||||
CB_SETBINDSLOT(CBSLOT_RENDERER_MISC)
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace wiVersion
|
||||
// minor features, major updates
|
||||
const int minor = 9;
|
||||
// minor bug fixes, alterations, refactors, updates
|
||||
const int revision = 29;
|
||||
const int revision = 30;
|
||||
|
||||
|
||||
long GetVersion()
|
||||
|
||||
@@ -16,6 +16,8 @@ private:
|
||||
window_type window;
|
||||
|
||||
public:
|
||||
wiWindowRegistration() :window(nullptr) {}
|
||||
|
||||
window_type GetRegisteredWindow() {
|
||||
return window;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user