10-bit backbuffer format enabled;

minor updates;
This commit is contained in:
turanszkij
2016-10-28 00:52:01 +02:00
parent bcaf257e73
commit 08255f4603
17 changed files with 278 additions and 256 deletions
+11 -9
View File
@@ -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">
+1 -1
View File
@@ -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;
}
-1
View File
@@ -94,7 +94,6 @@ CBUFFER(MiscCB, CBSLOT_RENDERER_MISC)
{
float4x4 g_xTransform;
float4 g_xColor;
int4 g_xMisc_int4;
};
CBUFFER(APICB, CBSLOT_API)
+1 -1
View File
@@ -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;
}
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
}
+10
View File
@@ -0,0 +1,10 @@
#include "wiGraphicsDevice.h"
using namespace wiGraphicsTypes;
FORMAT GraphicsDevice::BACKBUFFER_FORMAT = FORMAT::FORMAT_R10G10B10A2_UNORM;
FORMAT GraphicsDevice::GetBackBufferFormat()
{
return BACKBUFFER_FORMAT;
}
+2
View File
@@ -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////////////////////////
+233 -230
View File
@@ -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;
+10 -9
View File
@@ -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)*
-1
View File
@@ -160,7 +160,6 @@ public:
{
XMMATRIX mTransform;
XMFLOAT4 mColor;
int mInt[4];
CB_SETBINDSLOT(CBSLOT_RENDERER_MISC)
+1 -1
View File
@@ -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()
+2
View File
@@ -16,6 +16,8 @@ private:
window_type window;
public:
wiWindowRegistration() :window(nullptr) {}
window_type GetRegisteredWindow() {
return window;
}