mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-04-26 23:05:38 +00:00
Implementation of sRGB image support. Overhauls the linearization setup to utilize the sRGB image types, as well as refactors the use of ColorF and ColorI to be properly internally consistent. ColorIs are used only for front-facing/editing/UI settings, and ColorFs, now renamed to LinearColorF to reduce confusion of purpose, are used for color info in the engine itself. This avoids confusing and expensive conversions back and forth between types and avoids botches with linearity. Majority work done by @rextimmy
This commit is contained in:
parent
8943c673fb
commit
0801a3cca8
294 changed files with 3894 additions and 2813 deletions
|
|
@ -24,6 +24,7 @@
|
|||
#include "gfx/gfxCardProfile.h"
|
||||
#include "gfx/gfxTextureManager.h"
|
||||
#include "gfx/D3D11/gfxD3D11EnumTranslate.h"
|
||||
#include "gfx/bitmap/imageUtils.h"
|
||||
|
||||
GFXD3D11Cubemap::GFXD3D11Cubemap() : mTexture(NULL), mSRView(NULL), mDSView(NULL)
|
||||
{
|
||||
|
|
@ -65,14 +66,6 @@ void GFXD3D11Cubemap::_onTextureEvent(GFXTexCallbackCode code)
|
|||
initDynamic(mTexSize);
|
||||
}
|
||||
|
||||
bool GFXD3D11Cubemap::isCompressed(GFXFormat format)
|
||||
{
|
||||
if (format >= GFXFormatDXT1 && format <= GFXFormatDXT5)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void GFXD3D11Cubemap::initStatic(GFXTexHandle *faces)
|
||||
{
|
||||
AssertFatal( faces, "GFXD3D11Cubemap::initStatic - Got null GFXTexHandle!" );
|
||||
|
|
@ -81,7 +74,7 @@ void GFXD3D11Cubemap::initStatic(GFXTexHandle *faces)
|
|||
// NOTE - check tex sizes on all faces - they MUST be all same size
|
||||
mTexSize = faces->getWidth();
|
||||
mFaceFormat = faces->getFormat();
|
||||
bool compressed = isCompressed(mFaceFormat);
|
||||
bool compressed = ImageUtil::isCompressedFormat(mFaceFormat);
|
||||
|
||||
UINT bindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||
UINT miscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;
|
||||
|
|
@ -91,15 +84,15 @@ void GFXD3D11Cubemap::initStatic(GFXTexHandle *faces)
|
|||
miscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS;
|
||||
}
|
||||
|
||||
U32 mipLevels = faces->getPointer()->getMipLevels();
|
||||
if (mipLevels > 1 && !compressed)
|
||||
mMipMapLevels = faces->getPointer()->getMipLevels();
|
||||
if (mMipMapLevels < 1 && !compressed)
|
||||
mAutoGenMips = true;
|
||||
|
||||
D3D11_TEXTURE2D_DESC desc;
|
||||
ZeroMemory(&desc, sizeof(D3D11_TEXTURE2D_DESC));
|
||||
desc.Width = mTexSize;
|
||||
desc.Height = mTexSize;
|
||||
desc.MipLevels = mAutoGenMips ? 0 : mipLevels;
|
||||
desc.MipLevels = mAutoGenMips ? 0 : mMipMapLevels;
|
||||
desc.ArraySize = 6;
|
||||
desc.Format = GFXD3D11TextureFormat[mFaceFormat];
|
||||
desc.SampleDesc.Count = 1;
|
||||
|
|
@ -113,15 +106,15 @@ void GFXD3D11Cubemap::initStatic(GFXTexHandle *faces)
|
|||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "GFXD3D11Cubemap:initStatic(GFXTexhandle *faces) - failed to create texcube texture");
|
||||
AssertFatal(false, "GFXD3D11Cubemap:initStatic(GFXTexhandle *faces) - CreateTexture2D failure");
|
||||
}
|
||||
|
||||
for (U32 i = 0; i < CubeFaces; i++)
|
||||
{
|
||||
GFXD3D11TextureObject *texObj = static_cast<GFXD3D11TextureObject*>((GFXTextureObject*)faces[i]);
|
||||
for (U32 currentMip = 0; currentMip < mipLevels; currentMip++)
|
||||
for (U32 currentMip = 0; currentMip < mMipMapLevels; currentMip++)
|
||||
{
|
||||
U32 subResource = D3D11CalcSubresource(currentMip, i, mipLevels);
|
||||
U32 subResource = D3D11CalcSubresource(currentMip, i, mMipMapLevels);
|
||||
D3D11DEVICECONTEXT->CopySubresourceRegion(mTexture, subResource, 0, 0, 0, texObj->get2DTex(), currentMip, NULL);
|
||||
}
|
||||
}
|
||||
|
|
@ -129,7 +122,7 @@ void GFXD3D11Cubemap::initStatic(GFXTexHandle *faces)
|
|||
D3D11_SHADER_RESOURCE_VIEW_DESC SMViewDesc;
|
||||
SMViewDesc.Format = GFXD3D11TextureFormat[mFaceFormat];
|
||||
SMViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
|
||||
SMViewDesc.TextureCube.MipLevels = mAutoGenMips ? -1 : mipLevels;
|
||||
SMViewDesc.TextureCube.MipLevels = mAutoGenMips ? -1 : mMipMapLevels;
|
||||
SMViewDesc.TextureCube.MostDetailedMip = 0;
|
||||
|
||||
hr = D3D11DEVICE->CreateShaderResourceView(mTexture, &SMViewDesc, &mSRView);
|
||||
|
|
@ -138,8 +131,16 @@ void GFXD3D11Cubemap::initStatic(GFXTexHandle *faces)
|
|||
AssertFatal(false, "GFXD3D11Cubemap::initStatic(GFXTexHandle *faces) - texcube shader resource view creation failure");
|
||||
}
|
||||
|
||||
//Generate mips
|
||||
if (mAutoGenMips && !compressed)
|
||||
{
|
||||
D3D11DEVICECONTEXT->GenerateMips(mSRView);
|
||||
//get mip level count
|
||||
D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
|
||||
mSRView->GetDesc(&viewDesc);
|
||||
mMipMapLevels = viewDesc.TextureCube.MipLevels;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void GFXD3D11Cubemap::initStatic(DDSFile *dds)
|
||||
|
|
@ -151,45 +152,53 @@ void GFXD3D11Cubemap::initStatic(DDSFile *dds)
|
|||
// NOTE - check tex sizes on all faces - they MUST be all same size
|
||||
mTexSize = dds->getWidth();
|
||||
mFaceFormat = dds->getFormat();
|
||||
U32 levels = dds->getMipLevels();
|
||||
mMipMapLevels = dds->getMipLevels();
|
||||
|
||||
D3D11_TEXTURE2D_DESC desc;
|
||||
|
||||
desc.Width = mTexSize;
|
||||
desc.Height = mTexSize;
|
||||
desc.MipLevels = levels;
|
||||
desc.ArraySize = 6;
|
||||
desc.MipLevels = mMipMapLevels;
|
||||
desc.ArraySize = CubeFaces;
|
||||
desc.Format = GFXD3D11TextureFormat[mFaceFormat];
|
||||
desc.SampleDesc.Count = 1;
|
||||
desc.SampleDesc.Quality = 0;
|
||||
desc.Usage = D3D11_USAGE_IMMUTABLE;
|
||||
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||
desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE | D3D11_RESOURCE_MISC_GENERATE_MIPS;
|
||||
desc.CPUAccessFlags = 0;
|
||||
desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;
|
||||
|
||||
D3D11_SUBRESOURCE_DATA* pData = new D3D11_SUBRESOURCE_DATA[6 + levels];
|
||||
|
||||
for (U32 i = 0; i<CubeFaces; i++)
|
||||
D3D11_SUBRESOURCE_DATA* pData = new D3D11_SUBRESOURCE_DATA[CubeFaces * mMipMapLevels];
|
||||
for (U32 currentFace = 0; currentFace < CubeFaces; currentFace++)
|
||||
{
|
||||
if (!dds->mSurfaces[i])
|
||||
if (!dds->mSurfaces[currentFace])
|
||||
continue;
|
||||
|
||||
for(U32 j = 0; j < levels; j++)
|
||||
// convert to Z up
|
||||
const U32 faceIndex = _zUpFaceIndex(currentFace);
|
||||
|
||||
for(U32 currentMip = 0; currentMip < mMipMapLevels; currentMip++)
|
||||
{
|
||||
pData[i + j].pSysMem = dds->mSurfaces[i]->mMips[j];
|
||||
pData[i + j].SysMemPitch = dds->getSurfacePitch(j);
|
||||
pData[i + j].SysMemSlicePitch = dds->getSurfaceSize(j);
|
||||
const U32 dataIndex = faceIndex * mMipMapLevels + currentMip;
|
||||
pData[dataIndex].pSysMem = dds->mSurfaces[currentFace]->mMips[currentMip];
|
||||
pData[dataIndex].SysMemPitch = dds->getSurfacePitch(currentMip);
|
||||
pData[dataIndex].SysMemSlicePitch = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
HRESULT hr = D3D11DEVICE->CreateTexture2D(&desc, pData, &mTexture);
|
||||
HRESULT hr = D3D11DEVICE->CreateTexture2D(&desc, pData, &mTexture);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "GFXD3D11Cubemap::initStatic(DDSFile *dds) - CreateTexture2D failure");
|
||||
}
|
||||
|
||||
delete [] pData;
|
||||
|
||||
D3D11_SHADER_RESOURCE_VIEW_DESC SMViewDesc;
|
||||
SMViewDesc.Format = GFXD3D11TextureFormat[mFaceFormat];
|
||||
SMViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
|
||||
SMViewDesc.TextureCube.MipLevels = levels;
|
||||
SMViewDesc.TextureCube.MipLevels = mMipMapLevels;
|
||||
SMViewDesc.TextureCube.MostDetailedMip = 0;
|
||||
|
||||
hr = D3D11DEVICE->CreateShaderResourceView(mTexture, &SMViewDesc, &mSRView);
|
||||
|
|
@ -209,7 +218,8 @@ void GFXD3D11Cubemap::initDynamic(U32 texSize, GFXFormat faceFormat)
|
|||
mAutoGenMips = true;
|
||||
mTexSize = texSize;
|
||||
mFaceFormat = faceFormat;
|
||||
bool compressed = isCompressed(mFaceFormat);
|
||||
mMipMapLevels = 0;
|
||||
bool compressed = ImageUtil::isCompressedFormat(mFaceFormat);
|
||||
|
||||
UINT bindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||
UINT miscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;
|
||||
|
|
@ -250,6 +260,16 @@ void GFXD3D11Cubemap::initDynamic(U32 texSize, GFXFormat faceFormat)
|
|||
AssertFatal(false, "GFXD3D11Cubemap::initDynamic - CreateTexture2D call failure");
|
||||
}
|
||||
|
||||
//Generate mips
|
||||
if (mAutoGenMips && !compressed)
|
||||
{
|
||||
D3D11DEVICECONTEXT->GenerateMips(mSRView);
|
||||
//get mip level count
|
||||
D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
|
||||
mSRView->GetDesc(&viewDesc);
|
||||
mMipMapLevels = viewDesc.TextureCube.MipLevels;
|
||||
}
|
||||
|
||||
D3D11_RENDER_TARGET_VIEW_DESC viewDesc;
|
||||
viewDesc.Format = desc.Format;
|
||||
viewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
|
||||
|
|
|
|||
|
|
@ -71,7 +71,6 @@ private:
|
|||
|
||||
void releaseSurfaces();
|
||||
|
||||
bool isCompressed(GFXFormat format);
|
||||
/// The callback used to get texture events.
|
||||
/// @see GFXTextureManager::addEventDelegate
|
||||
void _onTextureEvent(GFXTexCallbackCode code);
|
||||
|
|
|
|||
|
|
@ -45,14 +45,6 @@
|
|||
#pragma comment(lib, "dxgi.lib")
|
||||
#pragma comment(lib, "d3d11.lib")
|
||||
|
||||
GFXAdapter::CreateDeviceInstanceDelegate GFXD3D11Device::mCreateDeviceInstance(GFXD3D11Device::createInstance);
|
||||
|
||||
GFXDevice *GFXD3D11Device::createInstance(U32 adapterIndex)
|
||||
{
|
||||
GFXD3D11Device* dev = new GFXD3D11Device(adapterIndex);
|
||||
return dev;
|
||||
}
|
||||
|
||||
class GFXPCD3D11RegisterDevice
|
||||
{
|
||||
public:
|
||||
|
|
@ -79,6 +71,14 @@ static void sgPCD3D11DeviceHandleCommandLine(S32 argc, const char **argv)
|
|||
// Register the command line parsing hook
|
||||
static ProcessRegisterCommandLine sgCommandLine(sgPCD3D11DeviceHandleCommandLine);
|
||||
|
||||
GFXAdapter::CreateDeviceInstanceDelegate GFXD3D11Device::mCreateDeviceInstance(GFXD3D11Device::createInstance);
|
||||
|
||||
GFXDevice *GFXD3D11Device::createInstance(U32 adapterIndex)
|
||||
{
|
||||
GFXD3D11Device* dev = new GFXD3D11Device(adapterIndex);
|
||||
return dev;
|
||||
}
|
||||
|
||||
GFXD3D11Device::GFXD3D11Device(U32 index)
|
||||
{
|
||||
mDeviceSwizzle32 = &Swizzles::bgra;
|
||||
|
|
@ -88,6 +88,9 @@ GFXD3D11Device::GFXD3D11Device(U32 index)
|
|||
|
||||
mAdapterIndex = index;
|
||||
mD3DDevice = NULL;
|
||||
mD3DDeviceContext = NULL;
|
||||
mD3DDevice1 = NULL;
|
||||
mD3DDeviceContext1 = NULL;
|
||||
mUserAnnotation = NULL;
|
||||
mVolatileVB = NULL;
|
||||
|
||||
|
|
@ -104,10 +107,6 @@ GFXD3D11Device::GFXD3D11Device(U32 index)
|
|||
|
||||
mPixVersion = 0.0;
|
||||
|
||||
mVertexShaderTarget = String::EmptyString;
|
||||
mPixelShaderTarget = String::EmptyString;
|
||||
mShaderModel = String::EmptyString;
|
||||
|
||||
mDrawInstancesCount = 0;
|
||||
|
||||
mCardProfiler = NULL;
|
||||
|
|
@ -122,6 +121,7 @@ GFXD3D11Device::GFXD3D11Device(U32 index)
|
|||
mCurrentConstBuffer = NULL;
|
||||
|
||||
mOcclusionQuerySupported = false;
|
||||
mCbufferPartialSupported = false;
|
||||
|
||||
mDebugLayers = false;
|
||||
|
||||
|
|
@ -149,7 +149,7 @@ GFXD3D11Device::~GFXD3D11Device()
|
|||
|
||||
// Free the vertex declarations.
|
||||
VertexDeclMap::Iterator iter = mVertexDecls.begin();
|
||||
for (; iter != mVertexDecls.end(); iter++)
|
||||
for (; iter != mVertexDecls.end(); ++iter)
|
||||
delete iter->value;
|
||||
|
||||
// Forcibly clean up the pools
|
||||
|
|
@ -162,6 +162,7 @@ GFXD3D11Device::~GFXD3D11Device()
|
|||
SAFE_RELEASE(mDeviceDepthStencil);
|
||||
SAFE_RELEASE(mDeviceBackbuffer);
|
||||
SAFE_RELEASE(mUserAnnotation);
|
||||
SAFE_RELEASE(mD3DDeviceContext1);
|
||||
SAFE_RELEASE(mD3DDeviceContext);
|
||||
|
||||
SAFE_DELETE(mCardProfiler);
|
||||
|
|
@ -179,6 +180,7 @@ GFXD3D11Device::~GFXD3D11Device()
|
|||
#endif
|
||||
|
||||
SAFE_RELEASE(mSwapChain);
|
||||
SAFE_RELEASE(mD3DDevice1);
|
||||
SAFE_RELEASE(mD3DDevice);
|
||||
}
|
||||
|
||||
|
|
@ -220,7 +222,7 @@ DXGI_SWAP_CHAIN_DESC GFXD3D11Device::setupPresentParams(const GFXVideoMode &mode
|
|||
d3dpp.BufferCount = !smDisableVSync ? 2 : 1; // triple buffering when vsync is on.
|
||||
d3dpp.BufferDesc.Width = mode.resolution.x;
|
||||
d3dpp.BufferDesc.Height = mode.resolution.y;
|
||||
d3dpp.BufferDesc.Format = GFXD3D11TextureFormat[GFXFormatR8G8B8A8];
|
||||
d3dpp.BufferDesc.Format = GFXD3D11TextureFormat[GFXFormatR8G8B8A8_SRGB];
|
||||
d3dpp.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||
d3dpp.OutputWindow = hwnd;
|
||||
d3dpp.SampleDesc = sampleDesc;
|
||||
|
|
@ -287,7 +289,7 @@ void GFXD3D11Device::enumerateAdapters(Vector<GFXAdapter*> &adapterList)
|
|||
|
||||
UINT numModes = 0;
|
||||
DXGI_MODE_DESC* displayModes = NULL;
|
||||
DXGI_FORMAT format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
DXGI_FORMAT format = GFXD3D11TextureFormat[GFXFormatR8G8B8A8_SRGB];
|
||||
|
||||
// Get the number of elements
|
||||
hr = pOutput->GetDisplayModeList(format, 0, &numModes, NULL);
|
||||
|
|
@ -315,47 +317,10 @@ void GFXD3D11Device::enumerateAdapters(Vector<GFXAdapter*> &adapterList)
|
|||
toAdd->mAvailableModes.push_back(vmAdd);
|
||||
}
|
||||
|
||||
//Check adapater can handle feature level 10
|
||||
D3D_FEATURE_LEVEL deviceFeature;
|
||||
ID3D11Device *pTmpDevice = nullptr;
|
||||
// Create temp Direct3D11 device.
|
||||
bool suitable = true;
|
||||
UINT createDeviceFlags = D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_BGRA_SUPPORT;
|
||||
hr = D3D11CreateDevice(EnumAdapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, createDeviceFlags, NULL, 0, D3D11_SDK_VERSION, &pTmpDevice, &deviceFeature, NULL);
|
||||
|
||||
if (FAILED(hr))
|
||||
suitable = false;
|
||||
|
||||
if (deviceFeature < D3D_FEATURE_LEVEL_10_0)
|
||||
suitable = false;
|
||||
|
||||
//double check we support required bgra format for LEVEL_10_0 & LEVEL_10_1
|
||||
if (deviceFeature == D3D_FEATURE_LEVEL_10_0 || deviceFeature == D3D_FEATURE_LEVEL_10_1)
|
||||
{
|
||||
U32 formatSupported = 0;
|
||||
pTmpDevice->CheckFormatSupport(DXGI_FORMAT_B8G8R8A8_UNORM, &formatSupported);
|
||||
U32 flagsRequired = D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_DISPLAY;
|
||||
if (!(formatSupported && flagsRequired))
|
||||
{
|
||||
Con::printf("DXGI adapter: %s does not support BGRA", Description.c_str());
|
||||
suitable = false;
|
||||
}
|
||||
}
|
||||
|
||||
delete[] displayModes;
|
||||
SAFE_RELEASE(pTmpDevice);
|
||||
SAFE_RELEASE(pOutput);
|
||||
SAFE_RELEASE(EnumAdapter);
|
||||
|
||||
if (suitable)
|
||||
{
|
||||
adapterList.push_back(toAdd);
|
||||
}
|
||||
else
|
||||
{
|
||||
Con::printf("DXGI adapter: %s does not support D3D11 feature level 10 or better", Description.c_str());
|
||||
delete toAdd;
|
||||
}
|
||||
adapterList.push_back(toAdd);
|
||||
}
|
||||
|
||||
SAFE_RELEASE(DXGIFactory);
|
||||
|
|
@ -391,7 +356,7 @@ void GFXD3D11Device::enumerateVideoModes()
|
|||
|
||||
UINT numModes = 0;
|
||||
DXGI_MODE_DESC* displayModes = NULL;
|
||||
DXGI_FORMAT format = GFXD3D11TextureFormat[GFXFormatR8G8B8A8];
|
||||
DXGI_FORMAT format = GFXD3D11TextureFormat[GFXFormatR8G8B8A8_SRGB];
|
||||
|
||||
// Get the number of elements
|
||||
hr = pOutput->GetDisplayModeList(format, 0, &numModes, NULL);
|
||||
|
|
@ -430,8 +395,8 @@ void GFXD3D11Device::enumerateVideoModes()
|
|||
void GFXD3D11Device::init(const GFXVideoMode &mode, PlatformWindow *window)
|
||||
{
|
||||
AssertFatal(window, "GFXD3D11Device::init - must specify a window!");
|
||||
HWND hwnd = (HWND)window->getSystemWindow(PlatformWindow::WindowSystem_Windows);
|
||||
SetFocus(hwnd);//ensure window has focus
|
||||
|
||||
HWND winHwnd = (HWND)window->getSystemWindow( PlatformWindow::WindowSystem_Windows );
|
||||
|
||||
UINT createDeviceFlags = D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_BGRA_SUPPORT;
|
||||
#ifdef TORQUE_DEBUG
|
||||
|
|
@ -439,77 +404,88 @@ void GFXD3D11Device::init(const GFXVideoMode &mode, PlatformWindow *window)
|
|||
mDebugLayers = true;
|
||||
#endif
|
||||
|
||||
DXGI_SWAP_CHAIN_DESC d3dpp = setupPresentParams(mode, winHwnd);
|
||||
|
||||
D3D_FEATURE_LEVEL deviceFeature;
|
||||
// TODO support at least feature level 10 to match GL
|
||||
D3D_FEATURE_LEVEL pFeatureLevels[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0 };
|
||||
U32 nFeatureCount = ARRAYSIZE(pFeatureLevels);
|
||||
D3D_DRIVER_TYPE driverType = D3D_DRIVER_TYPE_HARDWARE;// use D3D_DRIVER_TYPE_REFERENCE for reference device
|
||||
// create a device & device context
|
||||
HRESULT hres = D3D11CreateDevice(NULL,
|
||||
driverType,
|
||||
NULL,
|
||||
createDeviceFlags,
|
||||
NULL,
|
||||
0,
|
||||
D3D11_SDK_VERSION,
|
||||
&mD3DDevice,
|
||||
&mFeatureLevel,
|
||||
&mD3DDeviceContext);
|
||||
// create a device, device context and swap chain using the information in the d3dpp struct
|
||||
HRESULT hres = D3D11CreateDeviceAndSwapChain(NULL,
|
||||
driverType,
|
||||
NULL,
|
||||
createDeviceFlags,
|
||||
pFeatureLevels,
|
||||
nFeatureCount,
|
||||
D3D11_SDK_VERSION,
|
||||
&d3dpp,
|
||||
&mSwapChain,
|
||||
&mD3DDevice,
|
||||
&deviceFeature,
|
||||
&mD3DDeviceContext);
|
||||
|
||||
if(FAILED(hres))
|
||||
{
|
||||
#ifdef TORQUE_DEBUG
|
||||
//try again without debug device layer enabled
|
||||
createDeviceFlags &= ~D3D11_CREATE_DEVICE_DEBUG;
|
||||
hres = D3D11CreateDevice(NULL,
|
||||
driverType,
|
||||
NULL,
|
||||
createDeviceFlags,
|
||||
NULL,
|
||||
0,
|
||||
D3D11_SDK_VERSION,
|
||||
&mD3DDevice,
|
||||
&mFeatureLevel,
|
||||
&mD3DDeviceContext);
|
||||
//if we failed again than we definitely have a problem
|
||||
if (FAILED(hres))
|
||||
AssertFatal(false, "GFXD3D11Device::init - D3D11CreateDeviceAndSwapChain failed!");
|
||||
|
||||
Con::warnf("GFXD3D11Device::init - Debug layers not detected!");
|
||||
mDebugLayers = false;
|
||||
#else
|
||||
//try again without debug device layer enabled
|
||||
createDeviceFlags &= ~D3D11_CREATE_DEVICE_DEBUG;
|
||||
hres = D3D11CreateDeviceAndSwapChain(NULL, driverType,NULL,createDeviceFlags,NULL, 0,
|
||||
D3D11_SDK_VERSION,
|
||||
&d3dpp,
|
||||
&mSwapChain,
|
||||
&mD3DDevice,
|
||||
&deviceFeature,
|
||||
&mD3DDeviceContext);
|
||||
//if we failed again than we definitely have a problem
|
||||
if (FAILED(hres))
|
||||
AssertFatal(false, "GFXD3D11Device::init - D3D11CreateDeviceAndSwapChain failed!");
|
||||
|
||||
Con::warnf("GFXD3D11Device::init - Debug layers not detected!");
|
||||
mDebugLayers = false;
|
||||
#else
|
||||
AssertFatal(false, "GFXD3D11Device::init - D3D11CreateDeviceAndSwapChain failed!");
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef TORQUE_DEBUG
|
||||
_suppressDebugMessages();
|
||||
#endif
|
||||
// Grab DX 11.1 device and context if available and also ID3DUserDefinedAnnotation
|
||||
hres = mD3DDevice->QueryInterface(__uuidof(ID3D11Device1), reinterpret_cast<void**>(&mD3DDevice1));
|
||||
if (SUCCEEDED(hres))
|
||||
{
|
||||
//11.1 context
|
||||
mD3DDeviceContext->QueryInterface(__uuidof(ID3D11DeviceContext1), reinterpret_cast<void**>(&mD3DDeviceContext1));
|
||||
// ID3DUserDefinedAnnotation
|
||||
mD3DDeviceContext->QueryInterface(IID_PPV_ARGS(&mUserAnnotation));
|
||||
//Check what is supported, windows 7 supports very little from 11.1
|
||||
D3D11_FEATURE_DATA_D3D11_OPTIONS options;
|
||||
mD3DDevice1->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &options,
|
||||
sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS));
|
||||
|
||||
//Cbuffer partial updates
|
||||
if (options.ConstantBufferOffsetting && options.ConstantBufferPartialUpdate)
|
||||
mCbufferPartialSupported = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//set the fullscreen state here if we need to
|
||||
if(mode.fullScreen)
|
||||
{
|
||||
hres = mSwapChain->SetFullscreenState(TRUE, NULL);
|
||||
if(FAILED(hres))
|
||||
{
|
||||
AssertFatal(false, "GFXD3D11Device::init- Failed to set fullscreen state!");
|
||||
}
|
||||
}
|
||||
|
||||
mTextureManager = new GFXD3D11TextureManager();
|
||||
|
||||
// Now reacquire all the resources we trashed earlier
|
||||
reacquireDefaultPoolResources();
|
||||
//set vert/pixel shader targets
|
||||
switch (mFeatureLevel)
|
||||
{
|
||||
case D3D_FEATURE_LEVEL_11_0:
|
||||
mVertexShaderTarget = "vs_5_0";
|
||||
mPixelShaderTarget = "ps_5_0";
|
||||
if (deviceFeature >= D3D_FEATURE_LEVEL_11_0)
|
||||
mPixVersion = 5.0f;
|
||||
mShaderModel = "50";
|
||||
break;
|
||||
case D3D_FEATURE_LEVEL_10_1:
|
||||
mVertexShaderTarget = "vs_4_1";
|
||||
mPixelShaderTarget = "ps_4_1";
|
||||
mPixVersion = 4.1f;
|
||||
mShaderModel = "41";
|
||||
break;
|
||||
case D3D_FEATURE_LEVEL_10_0:
|
||||
mVertexShaderTarget = "vs_4_0";
|
||||
mPixelShaderTarget = "ps_4_0";
|
||||
mPixVersion = 4.0f;
|
||||
mShaderModel = "40";
|
||||
break;
|
||||
default:
|
||||
AssertFatal(false, "GFXD3D11Device::init - We don't support this feature level");
|
||||
}
|
||||
else
|
||||
AssertFatal(false, "GFXD3D11Device::init - We don't support anything below feature level 11.");
|
||||
|
||||
D3D11_QUERY_DESC queryDesc;
|
||||
queryDesc.Query = D3D11_QUERY_OCCLUSION;
|
||||
|
|
@ -527,6 +503,68 @@ void GFXD3D11Device::init(const GFXVideoMode &mode, PlatformWindow *window)
|
|||
mCardProfiler = new GFXD3D11CardProfiler();
|
||||
mCardProfiler->init();
|
||||
|
||||
D3D11_TEXTURE2D_DESC desc;
|
||||
desc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
||||
desc.CPUAccessFlags = 0;
|
||||
desc.Format = GFXD3D11TextureFormat[GFXFormatD24S8];
|
||||
desc.MipLevels = 1;
|
||||
desc.ArraySize = 1;
|
||||
desc.Usage = D3D11_USAGE_DEFAULT;
|
||||
desc.Width = mode.resolution.x;
|
||||
desc.Height = mode.resolution.y;
|
||||
desc.SampleDesc.Count =1;
|
||||
desc.SampleDesc.Quality =0;
|
||||
desc.MiscFlags = 0;
|
||||
|
||||
HRESULT hr = mD3DDevice->CreateTexture2D(&desc, NULL, &mDeviceDepthStencil);
|
||||
if(FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "GFXD3D11Device::init - couldn't create device's depth-stencil surface.");
|
||||
}
|
||||
|
||||
D3D11_DEPTH_STENCIL_VIEW_DESC depthDesc;
|
||||
depthDesc.Format = GFXD3D11TextureFormat[GFXFormatD24S8];
|
||||
depthDesc.Flags =0 ;
|
||||
depthDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
|
||||
depthDesc.Texture2D.MipSlice = 0;
|
||||
|
||||
hr = mD3DDevice->CreateDepthStencilView(mDeviceDepthStencil, &depthDesc, &mDeviceDepthStencilView);
|
||||
|
||||
if(FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "GFXD3D11Device::init - couldn't create depth stencil view");
|
||||
}
|
||||
|
||||
hr = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mDeviceBackbuffer);
|
||||
if(FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11Device::init - coudln't retrieve backbuffer ref");
|
||||
|
||||
//create back buffer view
|
||||
D3D11_RENDER_TARGET_VIEW_DESC RTDesc;
|
||||
|
||||
RTDesc.Format = GFXD3D11TextureFormat[GFXFormatR8G8B8A8_SRGB];
|
||||
RTDesc.Texture2D.MipSlice = 0;
|
||||
RTDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
||||
|
||||
hr = mD3DDevice->CreateRenderTargetView(mDeviceBackbuffer, &RTDesc, &mDeviceBackBufferView);
|
||||
|
||||
if(FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11Device::init - couldn't create back buffer target view");
|
||||
|
||||
#ifdef TORQUE_DEBUG
|
||||
String backBufferName = "MainBackBuffer";
|
||||
String depthSteniclName = "MainDepthStencil";
|
||||
String backBuffViewName = "MainBackBuffView";
|
||||
String depthStencViewName = "MainDepthView";
|
||||
mDeviceBackbuffer->SetPrivateData(WKPDID_D3DDebugObjectName, backBufferName.size(), backBufferName.c_str());
|
||||
mDeviceDepthStencil->SetPrivateData(WKPDID_D3DDebugObjectName, depthSteniclName.size(), depthSteniclName.c_str());
|
||||
mDeviceDepthStencilView->SetPrivateData(WKPDID_D3DDebugObjectName, depthStencViewName.size(), depthStencViewName.c_str());
|
||||
mDeviceBackBufferView->SetPrivateData(WKPDID_D3DDebugObjectName, backBuffViewName.size(), backBuffViewName.c_str());
|
||||
|
||||
_suppressDebugMessages();
|
||||
|
||||
#endif
|
||||
|
||||
gScreenShot = new ScreenShotD3D11;
|
||||
|
||||
mInitialized = true;
|
||||
|
|
@ -576,35 +614,14 @@ GFXWindowTarget * GFXD3D11Device::allocWindowTarget(PlatformWindow *window)
|
|||
{
|
||||
AssertFatal(window,"GFXD3D11Device::allocWindowTarget - no window provided!");
|
||||
|
||||
// Allocate the device.
|
||||
init(window->getVideoMode(), window);
|
||||
|
||||
// Set up a new window target...
|
||||
GFXD3D11WindowTarget *gdwt = new GFXD3D11WindowTarget();
|
||||
gdwt->mWindow = window;
|
||||
gdwt->mSize = window->getClientExtent();
|
||||
|
||||
if (!mInitialized)
|
||||
{
|
||||
gdwt->mSecondaryWindow = false;
|
||||
// Allocate the device.
|
||||
init(window->getVideoMode(), window);
|
||||
gdwt->initPresentationParams();
|
||||
gdwt->createSwapChain();
|
||||
gdwt->createBuffersAndViews();
|
||||
|
||||
mSwapChain = gdwt->getSwapChain();
|
||||
mDeviceBackbuffer = gdwt->getBackBuffer();
|
||||
mDeviceDepthStencil = gdwt->getDepthStencil();
|
||||
mDeviceBackBufferView = gdwt->getBackBufferView();
|
||||
mDeviceDepthStencilView = gdwt->getDepthStencilView();
|
||||
|
||||
}
|
||||
else //additional window/s
|
||||
{
|
||||
gdwt->mSecondaryWindow = true;
|
||||
gdwt->initPresentationParams();
|
||||
gdwt->createSwapChain();
|
||||
gdwt->createBuffersAndViews();
|
||||
}
|
||||
|
||||
gdwt->initPresentationParams();
|
||||
gdwt->registerResourceWithDevice(this);
|
||||
|
||||
return gdwt;
|
||||
|
|
@ -618,15 +635,13 @@ GFXTextureTarget* GFXD3D11Device::allocRenderToTextureTarget()
|
|||
return targ;
|
||||
}
|
||||
|
||||
void GFXD3D11Device::beginReset()
|
||||
void GFXD3D11Device::reset(DXGI_SWAP_CHAIN_DESC &d3dpp)
|
||||
{
|
||||
if (!mD3DDevice)
|
||||
return;
|
||||
|
||||
mInitialized = false;
|
||||
|
||||
releaseDefaultPoolResources();
|
||||
|
||||
// Clean up some commonly dangling state. This helps prevents issues with
|
||||
// items that are destroyed by the texture manager callbacks and recreated
|
||||
// later, but still left bound.
|
||||
|
|
@ -637,26 +652,117 @@ void GFXD3D11Device::beginReset()
|
|||
|
||||
mD3DDeviceContext->ClearState();
|
||||
|
||||
//release old buffers and views
|
||||
SAFE_RELEASE(mDeviceDepthStencilView);
|
||||
SAFE_RELEASE(mDeviceBackBufferView);
|
||||
SAFE_RELEASE(mDeviceDepthStencil);
|
||||
SAFE_RELEASE(mDeviceBackbuffer);
|
||||
}
|
||||
DXGI_MODE_DESC displayModes;
|
||||
displayModes.Format = d3dpp.BufferDesc.Format;
|
||||
displayModes.Height = d3dpp.BufferDesc.Height;
|
||||
displayModes.Width = d3dpp.BufferDesc.Width;
|
||||
displayModes.RefreshRate = d3dpp.BufferDesc.RefreshRate;
|
||||
displayModes.Scaling = d3dpp.BufferDesc.Scaling;
|
||||
displayModes.ScanlineOrdering = d3dpp.BufferDesc.ScanlineOrdering;
|
||||
|
||||
void GFXD3D11Device::endReset(GFXD3D11WindowTarget *windowTarget)
|
||||
{
|
||||
//grab new references
|
||||
mDeviceBackbuffer = windowTarget->getBackBuffer();
|
||||
mDeviceDepthStencil = windowTarget->getDepthStencil();
|
||||
mDeviceBackBufferView = windowTarget->getBackBufferView();
|
||||
mDeviceDepthStencilView = windowTarget->getDepthStencilView();
|
||||
HRESULT hr;
|
||||
if (!d3dpp.Windowed)
|
||||
{
|
||||
hr = mSwapChain->ResizeTarget(&displayModes);
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "D3D11Device::reset - failed to resize target!");
|
||||
}
|
||||
}
|
||||
|
||||
// First release all the stuff we allocated from D3DPOOL_DEFAULT
|
||||
releaseDefaultPoolResources();
|
||||
|
||||
//release the backbuffer, depthstencil, and their views
|
||||
SAFE_RELEASE(mDeviceBackBufferView);
|
||||
SAFE_RELEASE(mDeviceBackbuffer);
|
||||
SAFE_RELEASE(mDeviceDepthStencilView);
|
||||
SAFE_RELEASE(mDeviceDepthStencil);
|
||||
|
||||
hr = mSwapChain->ResizeBuffers(d3dpp.BufferCount, d3dpp.BufferDesc.Width, d3dpp.BufferDesc.Height, d3dpp.BufferDesc.Format, d3dpp.Windowed ? 0 : DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH);
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "D3D11Device::reset - failed to resize back buffer!");
|
||||
}
|
||||
|
||||
//recreate backbuffer view. depth stencil view and texture
|
||||
D3D11_TEXTURE2D_DESC desc;
|
||||
desc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
||||
desc.CPUAccessFlags = 0;
|
||||
desc.Format = GFXD3D11TextureFormat[GFXFormatD24S8];
|
||||
desc.MipLevels = 1;
|
||||
desc.ArraySize = 1;
|
||||
desc.Usage = D3D11_USAGE_DEFAULT;
|
||||
desc.Width = d3dpp.BufferDesc.Width;
|
||||
desc.Height = d3dpp.BufferDesc.Height;
|
||||
desc.SampleDesc.Count = 1;
|
||||
desc.SampleDesc.Quality = 0;
|
||||
desc.MiscFlags = 0;
|
||||
|
||||
hr = mD3DDevice->CreateTexture2D(&desc, NULL, &mDeviceDepthStencil);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "GFXD3D11Device::reset - couldn't create device's depth-stencil surface.");
|
||||
}
|
||||
|
||||
D3D11_DEPTH_STENCIL_VIEW_DESC depthDesc;
|
||||
depthDesc.Format = GFXD3D11TextureFormat[GFXFormatD24S8];
|
||||
depthDesc.Flags = 0;
|
||||
depthDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
|
||||
depthDesc.Texture2D.MipSlice = 0;
|
||||
|
||||
hr = mD3DDevice->CreateDepthStencilView(mDeviceDepthStencil, &depthDesc, &mDeviceDepthStencilView);
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "GFXD3D11Device::reset - couldn't create depth stencil view");
|
||||
}
|
||||
|
||||
hr = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mDeviceBackbuffer);
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11Device::reset - coudln't retrieve backbuffer ref");
|
||||
|
||||
//create back buffer view
|
||||
D3D11_RENDER_TARGET_VIEW_DESC RTDesc;
|
||||
|
||||
RTDesc.Format = GFXD3D11TextureFormat[GFXFormatR8G8B8A8_SRGB];
|
||||
RTDesc.Texture2D.MipSlice = 0;
|
||||
RTDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
||||
|
||||
hr = mD3DDevice->CreateRenderTargetView(mDeviceBackbuffer, &RTDesc, &mDeviceBackBufferView);
|
||||
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11Device::reset - couldn't create back buffer target view");
|
||||
|
||||
mD3DDeviceContext->OMSetRenderTargets(1, &mDeviceBackBufferView, mDeviceDepthStencilView);
|
||||
|
||||
// Now reacquire all the resources we trashed earlier
|
||||
reacquireDefaultPoolResources();
|
||||
hr = mSwapChain->SetFullscreenState(!d3dpp.Windowed, NULL);
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "D3D11Device::reset - failed to change screen states!");
|
||||
}
|
||||
|
||||
//Microsoft recommend this, see DXGI documentation
|
||||
if (!d3dpp.Windowed)
|
||||
{
|
||||
displayModes.RefreshRate.Numerator = 0;
|
||||
displayModes.RefreshRate.Denominator = 0;
|
||||
hr = mSwapChain->ResizeTarget(&displayModes);
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "D3D11Device::reset - failed to resize target!");
|
||||
}
|
||||
}
|
||||
|
||||
mInitialized = true;
|
||||
|
||||
// Now re aquire all the resources we trashed earlier
|
||||
reacquireDefaultPoolResources();
|
||||
|
||||
// Mark everything dirty and flush to card, for sanity.
|
||||
updateStates(true);
|
||||
}
|
||||
|
|
@ -668,12 +774,11 @@ void GFXD3D11Device::setupGenericShaders(GenericShaderType type)
|
|||
if(mGenericShader[GSColor] == NULL)
|
||||
{
|
||||
ShaderData *shaderData;
|
||||
//shader model 4.0 is enough for the generic shaders
|
||||
const char* shaderModel = "4.0";
|
||||
|
||||
shaderData = new ShaderData();
|
||||
shaderData->setField("DXVertexShaderFile", String(Con::getVariable("$Core::CommonShaderPath")) + String("/fixedFunction/colorV.hlsl"));
|
||||
shaderData->setField("DXPixelShaderFile", String(Con::getVariable("$Core::CommonShaderPath")) + String("/fixedFunction/colorP.hlsl"));
|
||||
shaderData->setField("pixVersion", shaderModel);
|
||||
shaderData->setField("pixVersion", "5.0");
|
||||
shaderData->registerObject();
|
||||
mGenericShader[GSColor] = shaderData->getShader();
|
||||
mGenericShaderBuffer[GSColor] = mGenericShader[GSColor]->allocConstBuffer();
|
||||
|
|
@ -683,7 +788,7 @@ void GFXD3D11Device::setupGenericShaders(GenericShaderType type)
|
|||
shaderData = new ShaderData();
|
||||
shaderData->setField("DXVertexShaderFile", String(Con::getVariable("$Core::CommonShaderPath")) + String("/fixedFunction/modColorTextureV.hlsl"));
|
||||
shaderData->setField("DXPixelShaderFile", String(Con::getVariable("$Core::CommonShaderPath")) + String("/fixedFunction/modColorTextureP.hlsl"));
|
||||
shaderData->setField("pixVersion", shaderModel);
|
||||
shaderData->setField("pixVersion", "5.0");
|
||||
shaderData->registerObject();
|
||||
mGenericShader[GSModColorTexture] = shaderData->getShader();
|
||||
mGenericShaderBuffer[GSModColorTexture] = mGenericShader[GSModColorTexture]->allocConstBuffer();
|
||||
|
|
@ -693,7 +798,7 @@ void GFXD3D11Device::setupGenericShaders(GenericShaderType type)
|
|||
shaderData = new ShaderData();
|
||||
shaderData->setField("DXVertexShaderFile", String(Con::getVariable("$Core::CommonShaderPath")) + String("/fixedFunction/addColorTextureV.hlsl"));
|
||||
shaderData->setField("DXPixelShaderFile", String(Con::getVariable("$Core::CommonShaderPath")) + String("/fixedFunction/addColorTextureP.hlsl"));
|
||||
shaderData->setField("pixVersion", shaderModel);
|
||||
shaderData->setField("pixVersion", "5.0");
|
||||
shaderData->registerObject();
|
||||
mGenericShader[GSAddColorTexture] = shaderData->getShader();
|
||||
mGenericShaderBuffer[GSAddColorTexture] = mGenericShader[GSAddColorTexture]->allocConstBuffer();
|
||||
|
|
@ -703,7 +808,7 @@ void GFXD3D11Device::setupGenericShaders(GenericShaderType type)
|
|||
shaderData = new ShaderData();
|
||||
shaderData->setField("DXVertexShaderFile", String(Con::getVariable("$Core::CommonShaderPath")) + String("/fixedFunction/textureV.hlsl"));
|
||||
shaderData->setField("DXPixelShaderFile", String(Con::getVariable("$Core::CommonShaderPath")) + String("/fixedFunction/textureP.hlsl"));
|
||||
shaderData->setField("pixVersion", shaderModel);
|
||||
shaderData->setField("pixVersion", "5.0");
|
||||
shaderData->registerObject();
|
||||
mGenericShader[GSTexture] = shaderData->getShader();
|
||||
mGenericShaderBuffer[GSTexture] = mGenericShader[GSTexture]->allocConstBuffer();
|
||||
|
|
@ -763,7 +868,7 @@ void GFXD3D11Device::setShaderConstBufferInternal(GFXShaderConstBuffer* buffer)
|
|||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void GFXD3D11Device::clear(U32 flags, ColorI color, F32 z, U32 stencil)
|
||||
void GFXD3D11Device::clear(U32 flags, const LinearColorF& color, F32 z, U32 stencil)
|
||||
{
|
||||
// Make sure we have flushed our render target state.
|
||||
_updateRenderTargets();
|
||||
|
|
@ -775,12 +880,7 @@ void GFXD3D11Device::clear(U32 flags, ColorI color, F32 z, U32 stencil)
|
|||
|
||||
mD3DDeviceContext->OMGetRenderTargets(1, &rtView, &dsView);
|
||||
|
||||
const FLOAT clearColor[4] = {
|
||||
static_cast<F32>(color.red) * (1.0f / 255.0f),
|
||||
static_cast<F32>(color.green) * (1.0f / 255.0f),
|
||||
static_cast<F32>(color.blue) * (1.0f / 255.0f),
|
||||
static_cast<F32>(color.alpha) * (1.0f / 255.0f)
|
||||
};
|
||||
const FLOAT clearColor[4] = { color.red, color.green, color.blue, color.alpha };
|
||||
|
||||
if (flags & GFXClearTarget && rtView)
|
||||
mD3DDeviceContext->ClearRenderTargetView(rtView, clearColor);
|
||||
|
|
@ -1355,7 +1455,6 @@ String GFXD3D11Device::_createTempShaderInternal(const GFXVertexFormat *vertexFo
|
|||
//make shader
|
||||
mainBodyData.append("VertOut main(VertIn IN){VertOut OUT;");
|
||||
|
||||
bool addedPadding = false;
|
||||
for (U32 i = 0; i < elemCount; i++)
|
||||
{
|
||||
const GFXVertexElement &element = vertexFormat->getElement(i);
|
||||
|
|
@ -1363,8 +1462,6 @@ String GFXD3D11Device::_createTempShaderInternal(const GFXVertexFormat *vertexFo
|
|||
String semanticOut = semantic;
|
||||
String type;
|
||||
|
||||
AssertFatal(!(addedPadding && !element.isSemantic(GFXSemantic::PADDING)), "Padding added before data");
|
||||
|
||||
if (element.isSemantic(GFXSemantic::POSITION))
|
||||
{
|
||||
semantic = "POSITION";
|
||||
|
|
@ -1400,11 +1497,6 @@ String GFXD3D11Device::_createTempShaderInternal(const GFXVertexFormat *vertexFo
|
|||
semantic = String::ToString("BLENDWEIGHT%d", element.getSemanticIndex());
|
||||
semanticOut = semantic;
|
||||
}
|
||||
else if (element.isSemantic(GFXSemantic::PADDING))
|
||||
{
|
||||
addedPadding = true;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Anything that falls thru to here will be a texture coord.
|
||||
|
|
@ -1566,12 +1658,6 @@ GFXVertexDecl* GFXD3D11Device::allocVertexDecl( const GFXVertexFormat *vertexFor
|
|||
vd[i].SemanticName = "BLENDINDICES";
|
||||
vd[i].SemanticIndex = element.getSemanticIndex();
|
||||
}
|
||||
else if (element.isSemantic(GFXSemantic::PADDING))
|
||||
{
|
||||
i--;
|
||||
elemCount--;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Anything that falls thru to here will be a texture coord.
|
||||
|
|
|
|||
|
|
@ -39,6 +39,9 @@
|
|||
#define D3D11 static_cast<GFXD3D11Device*>(GFX)
|
||||
#define D3D11DEVICE D3D11->getDevice()
|
||||
#define D3D11DEVICECONTEXT D3D11->getDeviceContext()
|
||||
// DX 11.1 - always check these are not NULL, dodgy support with win 7
|
||||
#define D3D11DEVICE1 D3D11->getDevice1()
|
||||
#define D3D11DEVICECONTEXT1 D3D11->getDeviceContext1()
|
||||
|
||||
class PlatformWindow;
|
||||
class GFXD3D11ShaderConstBuffer;
|
||||
|
|
@ -126,6 +129,9 @@ protected:
|
|||
IDXGISwapChain *mSwapChain;
|
||||
ID3D11Device* mD3DDevice;
|
||||
ID3D11DeviceContext* mD3DDeviceContext;
|
||||
// DX 11.1
|
||||
ID3D11Device1* mD3DDevice1;
|
||||
ID3D11DeviceContext1* mD3DDeviceContext1;
|
||||
ID3DUserDefinedAnnotation* mUserAnnotation;
|
||||
|
||||
GFXShader* mCurrentShader;
|
||||
|
|
@ -137,18 +143,12 @@ protected:
|
|||
|
||||
F32 mPixVersion;
|
||||
|
||||
D3D_FEATURE_LEVEL mFeatureLevel;
|
||||
// Shader Model targers
|
||||
String mVertexShaderTarget;
|
||||
String mPixelShaderTarget;
|
||||
// String for use with shader macros in the form of shader model version * 10
|
||||
String mShaderModel;
|
||||
|
||||
bool mDebugLayers;
|
||||
|
||||
DXGI_SAMPLE_DESC mMultisampleDesc;
|
||||
|
||||
bool mOcclusionQuerySupported;
|
||||
bool mCbufferPartialSupported;
|
||||
|
||||
U32 mDrawInstancesCount;
|
||||
|
||||
|
|
@ -181,7 +181,7 @@ protected:
|
|||
virtual void setMatrix( GFXMatrixType /*mtype*/, const MatrixF &/*mat*/ ) { };
|
||||
virtual void setLightInternal(U32 /*lightStage*/, const GFXLightInfo /*light*/, bool /*lightEnable*/) { };
|
||||
virtual void setLightMaterialInternal(const GFXLightMaterial /*mat*/) { };
|
||||
virtual void setGlobalAmbientInternal(ColorF /*color*/) { };
|
||||
virtual void setGlobalAmbientInternal(LinearColorF /*color*/) { };
|
||||
|
||||
// }
|
||||
|
||||
|
|
@ -243,7 +243,7 @@ public:
|
|||
|
||||
// Misc rendering control
|
||||
// {
|
||||
virtual void clear( U32 flags, ColorI color, F32 z, U32 stencil );
|
||||
virtual void clear( U32 flags, const LinearColorF& color, F32 z, U32 stencil );
|
||||
virtual bool beginSceneInternal();
|
||||
virtual void endSceneInternal();
|
||||
|
||||
|
|
@ -291,10 +291,13 @@ public:
|
|||
|
||||
ID3D11DeviceContext* getDeviceContext(){ return mD3DDeviceContext; }
|
||||
ID3D11Device* getDevice(){ return mD3DDevice; }
|
||||
IDXGISwapChain* getSwapChain() { return mSwapChain; }
|
||||
//DX 11.1
|
||||
ID3D11DeviceContext1* getDeviceContext1() { return mD3DDeviceContext1; }
|
||||
ID3D11Device1* getDevice1() { return mD3DDevice1; }
|
||||
|
||||
/// Reset
|
||||
void beginReset();
|
||||
void endReset(GFXD3D11WindowTarget *windowTarget);
|
||||
void reset( DXGI_SWAP_CHAIN_DESC &d3dpp );
|
||||
|
||||
virtual void setupGenericShaders( GenericShaderType type = GSColor );
|
||||
|
||||
|
|
@ -308,13 +311,6 @@ public:
|
|||
// Default multisample parameters
|
||||
DXGI_SAMPLE_DESC getMultisampleType() const { return mMultisampleDesc; }
|
||||
|
||||
// Get feature level this gfx device supports
|
||||
D3D_FEATURE_LEVEL getFeatureLevel() const { return mFeatureLevel; }
|
||||
// Shader Model targers
|
||||
const String &getVertexShaderTarget() const { return mVertexShaderTarget; }
|
||||
const String &getPixelShaderTarget() const { return mPixelShaderTarget; }
|
||||
const String &getShaderModel() const { return mShaderModel; }
|
||||
|
||||
// grab the sampler map
|
||||
const SamplerMap &getSamplersMap() const { return mSamplersMap; }
|
||||
SamplerMap &getSamplersMap() { return mSamplersMap; }
|
||||
|
|
|
|||
|
|
@ -54,11 +54,11 @@ void GFXD3D11EnumTranslate::init()
|
|||
GFXD3D11TextureFormat[GFXFormatA8L8] = DXGI_FORMAT_R8G8_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatA8] = DXGI_FORMAT_A8_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatL8] = DXGI_FORMAT_R8_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatDXT1] = DXGI_FORMAT_BC1_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatDXT2] = DXGI_FORMAT_BC1_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatDXT3] = DXGI_FORMAT_BC2_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatDXT4] = DXGI_FORMAT_BC2_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatDXT5] = DXGI_FORMAT_BC3_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatBC1] = DXGI_FORMAT_BC1_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatBC2] = DXGI_FORMAT_BC2_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatBC3] = DXGI_FORMAT_BC3_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatBC4] = DXGI_FORMAT_BC4_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatBC5] = DXGI_FORMAT_BC5_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatR32G32B32A32F] = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||
GFXD3D11TextureFormat[GFXFormatR16G16B16A16F] = DXGI_FORMAT_R16G16B16A16_FLOAT;
|
||||
GFXD3D11TextureFormat[GFXFormatL16] = DXGI_FORMAT_R16_UNORM;
|
||||
|
|
@ -72,8 +72,14 @@ void GFXD3D11EnumTranslate::init()
|
|||
GFXD3D11TextureFormat[GFXFormatD24S8] = DXGI_FORMAT_D24_UNORM_S8_UINT;
|
||||
GFXD3D11TextureFormat[GFXFormatD24FS8] = DXGI_FORMAT_UNKNOWN;
|
||||
GFXD3D11TextureFormat[GFXFormatD16] = DXGI_FORMAT_D16_UNORM;
|
||||
//sRGB
|
||||
GFXD3D11TextureFormat[GFXFormatR8G8B8A8_SRGB] = DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
|
||||
GFXD3D11TextureFormat[GFXFormatR8G8B8A8_LINEAR_FORCE] = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||
GFXD3D11TextureFormat[GFXFormatR8G8B8_SRGB] = DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;
|
||||
GFXD3D11TextureFormat[GFXFormatBC1_SRGB] = DXGI_FORMAT_BC1_UNORM_SRGB;
|
||||
GFXD3D11TextureFormat[GFXFormatBC2_SRGB] = DXGI_FORMAT_BC2_UNORM_SRGB;
|
||||
GFXD3D11TextureFormat[GFXFormatBC3_SRGB] = DXGI_FORMAT_BC3_UNORM_SRGB;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
GFXD3D11TextureFilter[GFXTextureFilterNone] = D3D11_FILTER_MIN_MAG_MIP_POINT;
|
||||
|
|
|
|||
|
|
@ -204,39 +204,6 @@ bool GFXD3D11ConstBufferLayout::setMatrix(const ParamDesc& pd, const GFXShaderCo
|
|||
|
||||
return false;
|
||||
}
|
||||
else if (pd.constType == GFXSCT_Float4x3)
|
||||
{
|
||||
const U32 csize = 48;
|
||||
|
||||
// Loop through and copy
|
||||
bool ret = false;
|
||||
U8* currDestPointer = basePointer + pd.offset;
|
||||
const U8* currSourcePointer = static_cast<const U8*>(data);
|
||||
const U8* endData = currSourcePointer + size;
|
||||
while (currSourcePointer < endData)
|
||||
{
|
||||
#ifdef TORQUE_DOUBLE_CHECK_43MATS
|
||||
Point4F col;
|
||||
((MatrixF*)currSourcePointer)->getRow(3, &col);
|
||||
AssertFatal(col.x == 0.0f && col.y == 0.0f && col.z == 0.0f && col.w == 1.0f, "3rd row used");
|
||||
#endif
|
||||
|
||||
if (dMemcmp(currDestPointer, currSourcePointer, csize) != 0)
|
||||
{
|
||||
dMemcpy(currDestPointer, currSourcePointer, csize);
|
||||
ret = true;
|
||||
}
|
||||
else if (pd.constType == GFXSCT_Float4x3)
|
||||
{
|
||||
ret = true;
|
||||
}
|
||||
|
||||
currDestPointer += csize;
|
||||
currSourcePointer += sizeof(MatrixF);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
PROFILE_SCOPE(GFXD3D11ConstBufferLayout_setMatrix_not4x4);
|
||||
|
|
@ -251,6 +218,9 @@ bool GFXD3D11ConstBufferLayout::setMatrix(const ParamDesc& pd, const GFXShaderCo
|
|||
case GFXSCT_Float3x3 :
|
||||
csize = 44; //This takes up 16+16+12
|
||||
break;
|
||||
case GFXSCT_Float4x3:
|
||||
csize = 48;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(false, "Unhandled case!");
|
||||
return false;
|
||||
|
|
@ -269,6 +239,10 @@ bool GFXD3D11ConstBufferLayout::setMatrix(const ParamDesc& pd, const GFXShaderCo
|
|||
dMemcpy(currDestPointer, currSourcePointer, csize);
|
||||
ret = true;
|
||||
}
|
||||
else if (pd.constType == GFXSCT_Float4x3)
|
||||
{
|
||||
ret = true;
|
||||
}
|
||||
|
||||
currDestPointer += csize;
|
||||
currSourcePointer += sizeof(MatrixF);
|
||||
|
|
@ -303,6 +277,8 @@ GFXD3D11ShaderConstBuffer::GFXD3D11ShaderConstBuffer( GFXD3D11Shader* shader,
|
|||
mPixelConstBufferLayout = pixelLayout;
|
||||
mPixelConstBuffer = new GenericConstBuffer(pixelLayout);
|
||||
|
||||
mDeviceContext = D3D11DEVICECONTEXT;
|
||||
|
||||
_createBuffers();
|
||||
|
||||
}
|
||||
|
|
@ -431,7 +407,7 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const PlaneF&
|
|||
SET_CONSTANT(handle, fv, mVertexConstBuffer, mPixelConstBuffer);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const ColorF& fv)
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const LinearColorF& fv)
|
||||
{
|
||||
SET_CONSTANT(handle, fv, mVertexConstBuffer, mPixelConstBuffer);
|
||||
}
|
||||
|
|
@ -654,8 +630,6 @@ void GFXD3D11ShaderConstBuffer::activate( GFXD3D11ShaderConstBuffer *prevShaderB
|
|||
}
|
||||
}
|
||||
|
||||
ID3D11DeviceContext* devCtx = D3D11DEVICECONTEXT;
|
||||
|
||||
D3D11_MAPPED_SUBRESOURCE pConstData;
|
||||
ZeroMemory(&pConstData, sizeof(D3D11_MAPPED_SUBRESOURCE));
|
||||
|
||||
|
|
@ -670,11 +644,11 @@ void GFXD3D11ShaderConstBuffer::activate( GFXD3D11ShaderConstBuffer *prevShaderB
|
|||
for (U32 i = 0; i < subBuffers.size(); ++i)
|
||||
{
|
||||
const ConstSubBufferDesc &desc = subBuffers[i];
|
||||
devCtx->UpdateSubresource(mConstantBuffersV[i], 0, NULL, buf + desc.start, desc.size, 0);
|
||||
mDeviceContext->UpdateSubresource(mConstantBuffersV[i], 0, NULL, buf + desc.start, desc.size, 0);
|
||||
nbBuffers++;
|
||||
}
|
||||
|
||||
devCtx->VSSetConstantBuffers(0, nbBuffers, mConstantBuffersV);
|
||||
mDeviceContext->VSSetConstantBuffers(0, nbBuffers, mConstantBuffersV);
|
||||
}
|
||||
|
||||
nbBuffers = 0;
|
||||
|
|
@ -688,11 +662,11 @@ void GFXD3D11ShaderConstBuffer::activate( GFXD3D11ShaderConstBuffer *prevShaderB
|
|||
for (U32 i = 0; i < subBuffers.size(); ++i)
|
||||
{
|
||||
const ConstSubBufferDesc &desc = subBuffers[i];
|
||||
devCtx->UpdateSubresource(mConstantBuffersP[i], 0, NULL, buf + desc.start, desc.size, 0);
|
||||
mDeviceContext->UpdateSubresource(mConstantBuffersP[i], 0, NULL, buf + desc.start, desc.size, 0);
|
||||
nbBuffers++;
|
||||
}
|
||||
|
||||
devCtx->PSSetConstantBuffers(0, nbBuffers, mConstantBuffersP);
|
||||
mDeviceContext->PSSetConstantBuffers(0, nbBuffers, mConstantBuffersP);
|
||||
}
|
||||
|
||||
#ifdef TORQUE_DEBUG
|
||||
|
|
@ -790,8 +764,9 @@ bool GFXD3D11Shader::_init()
|
|||
d3dMacros[i+smGlobalMacros.size()].Definition = mMacros[i].value.c_str();
|
||||
}
|
||||
|
||||
//TODO support D3D_FEATURE_LEVEL properly with shaders instead of hard coding at hlsl 5
|
||||
d3dMacros[macroCount - 2].Name = "TORQUE_SM";
|
||||
d3dMacros[macroCount - 2].Definition = D3D11->getShaderModel().c_str();
|
||||
d3dMacros[macroCount - 2].Definition = "50";
|
||||
|
||||
memset(&d3dMacros[macroCount - 1], 0, sizeof(D3D_SHADER_MACRO));
|
||||
|
||||
|
|
@ -809,21 +784,18 @@ bool GFXD3D11Shader::_init()
|
|||
mSamplerDescriptions.clear();
|
||||
mShaderConsts.clear();
|
||||
|
||||
String vertTarget = D3D11->getVertexShaderTarget();
|
||||
String pixTarget = D3D11->getPixelShaderTarget();
|
||||
|
||||
if ( !Con::getBoolVariable( "$shaders::forceLoadCSF", false ) )
|
||||
{
|
||||
if (!mVertexFile.isEmpty() && !_compileShader( mVertexFile, vertTarget, d3dMacros, mVertexConstBufferLayout, mSamplerDescriptions ) )
|
||||
if (!mVertexFile.isEmpty() && !_compileShader( mVertexFile, "vs_5_0", d3dMacros, mVertexConstBufferLayout, mSamplerDescriptions ) )
|
||||
return false;
|
||||
|
||||
if (!mPixelFile.isEmpty() && !_compileShader( mPixelFile, pixTarget, d3dMacros, mPixelConstBufferLayout, mSamplerDescriptions ) )
|
||||
if (!mPixelFile.isEmpty() && !_compileShader( mPixelFile, "ps_5_0", d3dMacros, mPixelConstBufferLayout, mSamplerDescriptions ) )
|
||||
return false;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !_loadCompiledOutput( mVertexFile, vertTarget, mVertexConstBufferLayout, mSamplerDescriptions ) )
|
||||
if ( !_loadCompiledOutput( mVertexFile, "vs_5_0", mVertexConstBufferLayout, mSamplerDescriptions ) )
|
||||
{
|
||||
if ( smLogErrors )
|
||||
Con::errorf( "GFXD3D11Shader::init - Unable to load precompiled vertex shader for '%s'.", mVertexFile.getFullPath().c_str() );
|
||||
|
|
@ -831,7 +803,7 @@ bool GFXD3D11Shader::_init()
|
|||
return false;
|
||||
}
|
||||
|
||||
if ( !_loadCompiledOutput( mPixelFile, pixTarget, mPixelConstBufferLayout, mSamplerDescriptions ) )
|
||||
if ( !_loadCompiledOutput( mPixelFile, "ps_5_0", mPixelConstBufferLayout, mSamplerDescriptions ) )
|
||||
{
|
||||
if ( smLogErrors )
|
||||
Con::errorf( "GFXD3D11Shader::init - Unable to load precompiled pixel shader for '%s'.", mPixelFile.getFullPath().c_str() );
|
||||
|
|
@ -877,12 +849,12 @@ bool GFXD3D11Shader::_compileShader( const Torque::Path &filePath,
|
|||
ID3DBlob* errorBuff = NULL;
|
||||
ID3D11ShaderReflection* reflectionTable = NULL;
|
||||
|
||||
#ifdef TORQUE_DEBUG
|
||||
U32 flags = D3DCOMPILE_DEBUG | D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_WARNINGS_ARE_ERRORS;
|
||||
#else
|
||||
U32 flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_OPTIMIZATION_LEVEL3; //TODO double check load times with D3DCOMPILE_OPTIMIZATION_LEVEL3
|
||||
//recommended flags for NSight, uncomment to use. NSight should be used in release mode only. *Still works with above flags however
|
||||
//flags = D3DCOMPILE_DEBUG | D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_PREFER_FLOW_CONTROL | D3DCOMPILE_SKIP_OPTIMIZATION;
|
||||
#ifdef TORQUE_GFX_VISUAL_DEBUG //for use with NSight, GPU Perf studio, VS graphics debugger
|
||||
U32 flags = D3DCOMPILE_DEBUG | D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_PREFER_FLOW_CONTROL | D3DCOMPILE_SKIP_OPTIMIZATION;
|
||||
#elif defined(TORQUE_DEBUG) //debug build
|
||||
U32 flags = D3DCOMPILE_DEBUG | D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_WARNINGS_ARE_ERRORS;
|
||||
#else //release build
|
||||
U32 flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_OPTIMIZATION_LEVEL3;
|
||||
#endif
|
||||
|
||||
#ifdef D3D11_DEBUG_SPEW
|
||||
|
|
@ -1054,20 +1026,20 @@ bool GFXD3D11Shader::_compileShader( const Torque::Path &filePath,
|
|||
|
||||
return result;
|
||||
}
|
||||
void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *pTable,
|
||||
void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *refTable,
|
||||
GenericConstBufferLayout *bufferLayoutIn,
|
||||
Vector<GFXShaderConstDesc> &samplerDescriptions )
|
||||
{
|
||||
PROFILE_SCOPE( GFXD3D11Shader_GetShaderConstants );
|
||||
|
||||
AssertFatal(pTable, "NULL constant table not allowed, is this an assembly shader?");
|
||||
AssertFatal(refTable, "NULL constant table not allowed, is this an assembly shader?");
|
||||
|
||||
GFXD3D11ConstBufferLayout *bufferLayout = (GFXD3D11ConstBufferLayout*)bufferLayoutIn;
|
||||
Vector<ConstSubBufferDesc> &subBuffers = bufferLayout->getSubBufferDesc();
|
||||
subBuffers.clear();
|
||||
|
||||
D3D11_SHADER_DESC tableDesc;
|
||||
HRESULT hr = pTable->GetDesc(&tableDesc);
|
||||
HRESULT hr = refTable->GetDesc(&tableDesc);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
AssertFatal(false, "Shader Reflection table unable to be created");
|
||||
|
|
@ -1077,7 +1049,7 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *pTable,
|
|||
U32 bufferOffset = 0;
|
||||
for (U32 i = 0; i < tableDesc.ConstantBuffers; i++)
|
||||
{
|
||||
ID3D11ShaderReflectionConstantBuffer* constantBuffer = pTable->GetConstantBufferByIndex(i);
|
||||
ID3D11ShaderReflectionConstantBuffer* constantBuffer = refTable->GetConstantBufferByIndex(i);
|
||||
D3D11_SHADER_BUFFER_DESC constantBufferDesc;
|
||||
|
||||
if (constantBuffer->GetDesc(&constantBufferDesc) == S_OK)
|
||||
|
|
@ -1162,7 +1134,7 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *pTable,
|
|||
{
|
||||
GFXShaderConstDesc desc;
|
||||
D3D11_SHADER_INPUT_BIND_DESC bindDesc;
|
||||
pTable->GetResourceBindingDesc(i, &bindDesc);
|
||||
refTable->GetResourceBindingDesc(i, &bindDesc);
|
||||
|
||||
switch (bindDesc.Type)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -297,6 +297,8 @@ public:
|
|||
class GFXD3D11ShaderConstBuffer : public GFXShaderConstBuffer
|
||||
{
|
||||
friend class GFXD3D11Shader;
|
||||
// Cache device context
|
||||
ID3D11DeviceContext* mDeviceContext;
|
||||
|
||||
public:
|
||||
|
||||
|
|
@ -324,7 +326,7 @@ public:
|
|||
virtual void set(GFXShaderConstHandle* handle, const Point3F& fv);
|
||||
virtual void set(GFXShaderConstHandle* handle, const Point4F& fv);
|
||||
virtual void set(GFXShaderConstHandle* handle, const PlaneF& fv);
|
||||
virtual void set(GFXShaderConstHandle* handle, const ColorF& fv);
|
||||
virtual void set(GFXShaderConstHandle* handle, const LinearColorF& fv);
|
||||
virtual void set(GFXShaderConstHandle* handle, const S32 f);
|
||||
virtual void set(GFXShaderConstHandle* handle, const Point2I& fv);
|
||||
virtual void set(GFXShaderConstHandle* handle, const Point3I& fv);
|
||||
|
|
@ -434,7 +436,7 @@ protected:
|
|||
GenericConstBufferLayout *bufferLayout,
|
||||
Vector<GFXShaderConstDesc> &samplerDescriptions );
|
||||
|
||||
void _getShaderConstants( ID3D11ShaderReflection* pTable,
|
||||
void _getShaderConstants( ID3D11ShaderReflection* refTable,
|
||||
GenericConstBufferLayout *bufferLayout,
|
||||
Vector<GFXShaderConstDesc> &samplerDescriptions );
|
||||
|
||||
|
|
|
|||
|
|
@ -151,29 +151,32 @@ GFXD3D11StateBlock::GFXD3D11StateBlock(const GFXStateBlockDesc& desc)
|
|||
mSamplerDesc[i].MinLOD = 0;
|
||||
mSamplerDesc[i].MaxLOD = FLT_MAX;
|
||||
|
||||
const bool comparison = gfxSamplerState.samplerFunc != GFXCmpNever;
|
||||
|
||||
if (gfxSamplerState.magFilter == GFXTextureFilterPoint && gfxSamplerState.minFilter == GFXTextureFilterPoint && gfxSamplerState.mipFilter == GFXTextureFilterPoint)
|
||||
mSamplerDesc[i].Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
|
||||
mSamplerDesc[i].Filter = comparison ? D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT : D3D11_FILTER_MIN_MAG_MIP_POINT;
|
||||
else if (gfxSamplerState.magFilter == GFXTextureFilterPoint && gfxSamplerState.minFilter == GFXTextureFilterPoint && gfxSamplerState.mipFilter == GFXTextureFilterLinear)
|
||||
mSamplerDesc[i].Filter = D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR;
|
||||
mSamplerDesc[i].Filter = comparison ? D3D11_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR : D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR;
|
||||
else if (gfxSamplerState.magFilter == GFXTextureFilterLinear && gfxSamplerState.minFilter == GFXTextureFilterPoint && gfxSamplerState.mipFilter == GFXTextureFilterPoint)
|
||||
mSamplerDesc[i].Filter = D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT;
|
||||
mSamplerDesc[i].Filter = comparison ? D3D11_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT : D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT;
|
||||
else if (gfxSamplerState.magFilter == GFXTextureFilterLinear && gfxSamplerState.minFilter == GFXTextureFilterPoint && gfxSamplerState.mipFilter == GFXTextureFilterLinear)
|
||||
mSamplerDesc[i].Filter = D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR;
|
||||
mSamplerDesc[i].Filter = comparison ? D3D11_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR : D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR;
|
||||
else if (gfxSamplerState.magFilter == GFXTextureFilterPoint && gfxSamplerState.minFilter == GFXTextureFilterLinear && gfxSamplerState.mipFilter == GFXTextureFilterPoint)
|
||||
mSamplerDesc[i].Filter = D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT;
|
||||
mSamplerDesc[i].Filter = comparison ? D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT : D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT;
|
||||
else if (gfxSamplerState.magFilter == GFXTextureFilterPoint && gfxSamplerState.minFilter == GFXTextureFilterLinear && gfxSamplerState.mipFilter == GFXTextureFilterLinear)
|
||||
mSamplerDesc[i].Filter = D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR;
|
||||
mSamplerDesc[i].Filter = comparison ? D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR : D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR;
|
||||
else if (gfxSamplerState.magFilter == GFXTextureFilterLinear && gfxSamplerState.minFilter == GFXTextureFilterLinear && gfxSamplerState.mipFilter == GFXTextureFilterPoint)
|
||||
mSamplerDesc[i].Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT;
|
||||
mSamplerDesc[i].Filter = comparison ? D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT : D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT;
|
||||
else if (gfxSamplerState.magFilter == GFXTextureFilterLinear && gfxSamplerState.minFilter == GFXTextureFilterLinear && mDesc.samplers[i].mipFilter == GFXTextureFilterLinear)
|
||||
mSamplerDesc[i].Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
||||
mSamplerDesc[i].Filter = comparison ? D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR : D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
||||
else
|
||||
mSamplerDesc[i].Filter = D3D11_FILTER_ANISOTROPIC;
|
||||
mSamplerDesc[i].Filter = comparison ? D3D11_FILTER_COMPARISON_ANISOTROPIC : D3D11_FILTER_ANISOTROPIC;
|
||||
|
||||
mSamplerDesc[i].BorderColor[0] = 1.0f;
|
||||
mSamplerDesc[i].BorderColor[1] = 1.0f;
|
||||
mSamplerDesc[i].BorderColor[2] = 1.0f;
|
||||
mSamplerDesc[i].BorderColor[3] = 1.0f;
|
||||
mSamplerDesc[i].ComparisonFunc = GFXD3D11CmpFunc[gfxSamplerState.samplerFunc];
|
||||
|
||||
hr = D3D11DEVICE->CreateSamplerState(&mSamplerDesc[i], &mSamplerStates[i]);
|
||||
if (FAILED(hr))
|
||||
|
|
|
|||
|
|
@ -248,10 +248,10 @@ void GFXD3D11TextureTarget::activate()
|
|||
stateApplied();
|
||||
|
||||
// Now set all the new surfaces into the appropriate slots.
|
||||
ID3D11RenderTargetView* rtViews[MaxRenderSlotId] = { NULL, NULL, NULL, NULL, NULL, NULL};
|
||||
ID3D11RenderTargetView* rtViews[MaxRenderSlotId] = { NULL, NULL, NULL, NULL, NULL, NULL };
|
||||
|
||||
ID3D11DepthStencilView* dsView = (ID3D11DepthStencilView*)(mTargetViews[GFXTextureTarget::DepthStencil]);
|
||||
for (U32 i = 0; i < 4; i++)
|
||||
for (U32 i = 0; i < 6; i++)
|
||||
{
|
||||
rtViews[i] = (ID3D11RenderTargetView*)mTargetViews[GFXTextureTarget::Color0 + i];
|
||||
}
|
||||
|
|
@ -263,7 +263,7 @@ void GFXD3D11TextureTarget::activate()
|
|||
void GFXD3D11TextureTarget::deactivate()
|
||||
{
|
||||
//re-gen mip maps
|
||||
for (U32 i = 0; i < 4; i++)
|
||||
for (U32 i = 0; i < 6; i++)
|
||||
{
|
||||
ID3D11ShaderResourceView* pSRView = mTargetSRViews[GFXTextureTarget::Color0 + i];
|
||||
if (pSRView)
|
||||
|
|
@ -314,34 +314,21 @@ void GFXD3D11TextureTarget::resurrect()
|
|||
|
||||
GFXD3D11WindowTarget::GFXD3D11WindowTarget()
|
||||
{
|
||||
mWindow = NULL;
|
||||
mBackBuffer = NULL;
|
||||
mDepthStencilView = NULL;
|
||||
mDepthStencil = NULL;
|
||||
mBackBufferView = NULL;
|
||||
mSecondaryWindow = false;
|
||||
mWindow = NULL;
|
||||
mBackbuffer = NULL;
|
||||
}
|
||||
|
||||
GFXD3D11WindowTarget::~GFXD3D11WindowTarget()
|
||||
{
|
||||
SAFE_RELEASE(mDepthStencilView)
|
||||
SAFE_RELEASE(mDepthStencil);
|
||||
SAFE_RELEASE(mBackBufferView);
|
||||
SAFE_RELEASE(mBackBuffer);
|
||||
SAFE_RELEASE(mSwapChain);
|
||||
SAFE_RELEASE(mBackbuffer);
|
||||
}
|
||||
|
||||
void GFXD3D11WindowTarget::initPresentationParams()
|
||||
{
|
||||
// Get some video mode related info.
|
||||
const GFXVideoMode &vm = mWindow->getVideoMode();
|
||||
HWND hwnd = (HWND)mWindow->getSystemWindow(PlatformWindow::WindowSystem_Windows);
|
||||
|
||||
// Do some validation...
|
||||
if (vm.fullScreen && mSecondaryWindow)
|
||||
{
|
||||
AssertFatal(false, "GFXD3D11WindowTarget::initPresentationParams - Cannot go fullscreen with secondary window!");
|
||||
}
|
||||
GFXVideoMode vm = mWindow->getVideoMode();
|
||||
Win32Window* win = static_cast<Win32Window*>(mWindow);
|
||||
HWND hwnd = win->getHWND();
|
||||
|
||||
mPresentationParams = D3D11->setupPresentParams(vm, hwnd);
|
||||
}
|
||||
|
|
@ -360,178 +347,40 @@ GFXFormat GFXD3D11WindowTarget::getFormat()
|
|||
|
||||
bool GFXD3D11WindowTarget::present()
|
||||
{
|
||||
return (mSwapChain->Present(!D3D11->smDisableVSync, 0) == S_OK);
|
||||
return (D3D11->getSwapChain()->Present(!D3D11->smDisableVSync, 0) == S_OK);
|
||||
}
|
||||
|
||||
void GFXD3D11WindowTarget::createSwapChain()
|
||||
void GFXD3D11WindowTarget::setImplicitSwapChain()
|
||||
{
|
||||
//create dxgi factory & swapchain
|
||||
IDXGIFactory1* DXGIFactory;
|
||||
HRESULT hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), reinterpret_cast<void**>(&DXGIFactory));
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11WindowTarget::createSwapChain - couldn't create dxgi factory.");
|
||||
|
||||
hr = DXGIFactory->CreateSwapChain(D3D11DEVICE, &mPresentationParams, &mSwapChain);
|
||||
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11WindowTarget::createSwapChain - couldn't create swap chain.");
|
||||
|
||||
SAFE_RELEASE(DXGIFactory);
|
||||
}
|
||||
|
||||
void GFXD3D11WindowTarget::createBuffersAndViews()
|
||||
{
|
||||
//release old if they exist
|
||||
SAFE_RELEASE(mDepthStencilView);
|
||||
SAFE_RELEASE(mDepthStencil);
|
||||
SAFE_RELEASE(mBackBufferView);
|
||||
SAFE_RELEASE(mBackBuffer);
|
||||
|
||||
//grab video mode
|
||||
const GFXVideoMode &vm = mWindow->getVideoMode();
|
||||
//create depth/stencil
|
||||
D3D11_TEXTURE2D_DESC desc;
|
||||
desc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
||||
desc.CPUAccessFlags = 0;
|
||||
desc.Format = GFXD3D11TextureFormat[GFXFormatD24S8];
|
||||
desc.MipLevels = 1;
|
||||
desc.ArraySize = 1;
|
||||
desc.Usage = D3D11_USAGE_DEFAULT;
|
||||
desc.Width = vm.resolution.x;
|
||||
desc.Height = vm.resolution.y;
|
||||
desc.SampleDesc.Count = 1;
|
||||
desc.SampleDesc.Quality = 0;
|
||||
desc.MiscFlags = 0;
|
||||
|
||||
HRESULT hr = D3D11DEVICE->CreateTexture2D(&desc, NULL, &mDepthStencil);
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11WindowTarget::createBuffersAndViews - couldn't create device's depth-stencil surface.");
|
||||
|
||||
D3D11_DEPTH_STENCIL_VIEW_DESC depthDesc;
|
||||
depthDesc.Format = GFXD3D11TextureFormat[GFXFormatD24S8];
|
||||
depthDesc.Flags = 0;
|
||||
depthDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
|
||||
depthDesc.Texture2D.MipSlice = 0;
|
||||
|
||||
hr = D3D11DEVICE->CreateDepthStencilView(mDepthStencil, &depthDesc, &mDepthStencilView);
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11WindowTarget::createBuffersAndViews - couldn't create depth stencil view");
|
||||
|
||||
setBackBuffer();
|
||||
|
||||
//create back buffer view
|
||||
D3D11_RENDER_TARGET_VIEW_DESC RTDesc;
|
||||
RTDesc.Format = GFXD3D11TextureFormat[GFXFormatR8G8B8A8];
|
||||
RTDesc.Texture2D.MipSlice = 0;
|
||||
RTDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
||||
|
||||
hr = D3D11DEVICE->CreateRenderTargetView(mBackBuffer, &RTDesc, &mBackBufferView);
|
||||
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11WindowTarget::createBuffersAndViews - couldn't create back buffer target view");
|
||||
|
||||
//debug names
|
||||
#ifdef TORQUE_DEBUG
|
||||
if (!mSecondaryWindow)
|
||||
{
|
||||
String backBufferName = "MainBackBuffer";
|
||||
String depthSteniclName = "MainDepthStencil";
|
||||
String backBuffViewName = "MainBackBuffView";
|
||||
String depthStencViewName = "MainDepthView";
|
||||
mBackBuffer->SetPrivateData(WKPDID_D3DDebugObjectName, backBufferName.size(), backBufferName.c_str());
|
||||
mDepthStencil->SetPrivateData(WKPDID_D3DDebugObjectName, depthSteniclName.size(), depthSteniclName.c_str());
|
||||
mDepthStencilView->SetPrivateData(WKPDID_D3DDebugObjectName, depthStencViewName.size(), depthStencViewName.c_str());
|
||||
mBackBufferView->SetPrivateData(WKPDID_D3DDebugObjectName, backBuffViewName.size(), backBuffViewName.c_str());
|
||||
}
|
||||
#endif
|
||||
if (!mBackbuffer)
|
||||
D3D11->mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mBackbuffer);
|
||||
}
|
||||
|
||||
void GFXD3D11WindowTarget::resetMode()
|
||||
{
|
||||
HRESULT hr;
|
||||
if (mSwapChain)
|
||||
{
|
||||
// The current video settings.
|
||||
DXGI_SWAP_CHAIN_DESC desc;
|
||||
hr = mSwapChain->GetDesc(&desc);
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11WindowTarget::resetMode - failed to get swap chain description!");
|
||||
|
||||
bool fullscreen = !desc.Windowed;
|
||||
Point2I backbufferSize(desc.BufferDesc.Width, desc.BufferDesc.Height);
|
||||
|
||||
// The settings we are now applying.
|
||||
const GFXVideoMode &vm = mWindow->getVideoMode();
|
||||
|
||||
// Early out if none of the settings which require a device reset
|
||||
// have changed.
|
||||
if (backbufferSize == vm.resolution &&
|
||||
fullscreen == vm.fullScreen)
|
||||
return;
|
||||
}
|
||||
|
||||
//release old buffers and views
|
||||
SAFE_RELEASE(mDepthStencilView)
|
||||
SAFE_RELEASE(mDepthStencil);
|
||||
SAFE_RELEASE(mBackBufferView);
|
||||
SAFE_RELEASE(mBackBuffer);
|
||||
|
||||
if(!mSecondaryWindow)
|
||||
D3D11->beginReset();
|
||||
|
||||
mWindow->setSuppressReset(true);
|
||||
|
||||
// Setup our presentation params.
|
||||
initPresentationParams();
|
||||
|
||||
if (!mPresentationParams.Windowed)
|
||||
{
|
||||
mPresentationParams.BufferDesc.RefreshRate.Numerator = 0;
|
||||
mPresentationParams.BufferDesc.RefreshRate.Denominator = 0;
|
||||
hr = mSwapChain->ResizeTarget(&mPresentationParams.BufferDesc);
|
||||
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11WindowTarget::resetMode - failed to resize target!");
|
||||
|
||||
}
|
||||
|
||||
hr = mSwapChain->ResizeBuffers(mPresentationParams.BufferCount, mPresentationParams.BufferDesc.Width, mPresentationParams.BufferDesc.Height,
|
||||
mPresentationParams.BufferDesc.Format, mPresentationParams.Windowed ? 0 : DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH);
|
||||
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11WindowTarget::resetMode - failed to resize back buffer!");
|
||||
|
||||
hr = mSwapChain->SetFullscreenState(!mPresentationParams.Windowed, NULL);
|
||||
|
||||
if (FAILED(hr))
|
||||
AssertFatal(false, "GFXD3D11WindowTarget::resetMode - failed to change screen states!");
|
||||
// Otherwise, we have to reset the device, if we're the implicit swapchain.
|
||||
D3D11->reset(mPresentationParams);
|
||||
|
||||
// Update our size, too.
|
||||
mSize = Point2I(mPresentationParams.BufferDesc.Width, mPresentationParams.BufferDesc.Height);
|
||||
|
||||
mWindow->setSuppressReset(false);
|
||||
|
||||
//re-create buffers and views
|
||||
createBuffersAndViews();
|
||||
|
||||
if (!mSecondaryWindow)
|
||||
D3D11->endReset(this);
|
||||
GFX->beginReset();
|
||||
}
|
||||
|
||||
void GFXD3D11WindowTarget::zombify()
|
||||
{
|
||||
SAFE_RELEASE(mBackBuffer);
|
||||
SAFE_RELEASE(mBackbuffer);
|
||||
}
|
||||
|
||||
void GFXD3D11WindowTarget::resurrect()
|
||||
{
|
||||
setBackBuffer();
|
||||
}
|
||||
|
||||
void GFXD3D11WindowTarget::setBackBuffer()
|
||||
{
|
||||
if (!mBackBuffer)
|
||||
mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mBackBuffer);
|
||||
setImplicitSwapChain();
|
||||
}
|
||||
|
||||
void GFXD3D11WindowTarget::activate()
|
||||
|
|
@ -542,10 +391,10 @@ void GFXD3D11WindowTarget::activate()
|
|||
ID3D11RenderTargetView* rtViews[8] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
|
||||
|
||||
D3D11DEVICECONTEXT->OMSetRenderTargets(8, rtViews, NULL);
|
||||
D3D11DEVICECONTEXT->OMSetRenderTargets(1, &mBackBufferView, mDepthStencilView);
|
||||
D3D11DEVICECONTEXT->OMSetRenderTargets(1, &D3D11->mDeviceBackBufferView, D3D11->mDeviceDepthStencilView);
|
||||
|
||||
DXGI_SWAP_CHAIN_DESC pp;
|
||||
mSwapChain->GetDesc(&pp);
|
||||
D3D11->mSwapChain->GetDesc(&pp);
|
||||
|
||||
// Update our video mode here, too.
|
||||
GFXVideoMode vm;
|
||||
|
|
@ -563,35 +412,5 @@ void GFXD3D11WindowTarget::resolveTo(GFXTextureObject *tex)
|
|||
D3D11_TEXTURE2D_DESC desc;
|
||||
ID3D11Texture2D* surf = ((GFXD3D11TextureObject*)(tex))->get2DTex();
|
||||
surf->GetDesc(&desc);
|
||||
D3D11DEVICECONTEXT->ResolveSubresource(surf, 0, mBackBuffer, 0, desc.Format);
|
||||
}
|
||||
|
||||
IDXGISwapChain *GFXD3D11WindowTarget::getSwapChain()
|
||||
{
|
||||
mSwapChain->AddRef();
|
||||
return mSwapChain;
|
||||
}
|
||||
|
||||
ID3D11Texture2D *GFXD3D11WindowTarget::getBackBuffer()
|
||||
{
|
||||
mBackBuffer->AddRef();
|
||||
return mBackBuffer;
|
||||
}
|
||||
|
||||
ID3D11Texture2D *GFXD3D11WindowTarget::getDepthStencil()
|
||||
{
|
||||
mDepthStencil->AddRef();
|
||||
return mDepthStencil;
|
||||
}
|
||||
|
||||
ID3D11RenderTargetView* GFXD3D11WindowTarget::getBackBufferView()
|
||||
{
|
||||
mBackBufferView->AddRef();
|
||||
return mBackBufferView;
|
||||
}
|
||||
|
||||
ID3D11DepthStencilView* GFXD3D11WindowTarget::getDepthStencilView()
|
||||
{
|
||||
mDepthStencilView->AddRef();
|
||||
return mDepthStencilView;
|
||||
D3D11DEVICECONTEXT->ResolveSubresource(surf, 0, D3D11->mDeviceBackbuffer, 0, desc.Format);
|
||||
}
|
||||
|
|
@ -76,11 +76,7 @@ class GFXD3D11WindowTarget : public GFXWindowTarget
|
|||
friend class GFXD3D11Device;
|
||||
|
||||
/// Our backbuffer
|
||||
ID3D11Texture2D *mBackBuffer;
|
||||
ID3D11Texture2D *mDepthStencil;
|
||||
ID3D11RenderTargetView* mBackBufferView;
|
||||
ID3D11DepthStencilView* mDepthStencilView;
|
||||
IDXGISwapChain *mSwapChain;
|
||||
ID3D11Texture2D *mBackbuffer;
|
||||
|
||||
/// Maximum size we can render to.
|
||||
Point2I mSize;
|
||||
|
|
@ -89,9 +85,6 @@ class GFXD3D11WindowTarget : public GFXWindowTarget
|
|||
/// Internal interface that notifies us we need to reset our video mode.
|
||||
void resetMode();
|
||||
|
||||
/// Is this a secondary window
|
||||
bool mSecondaryWindow;
|
||||
|
||||
public:
|
||||
|
||||
GFXD3D11WindowTarget();
|
||||
|
|
@ -102,9 +95,7 @@ public:
|
|||
virtual bool present();
|
||||
|
||||
void initPresentationParams();
|
||||
void createSwapChain();
|
||||
void createBuffersAndViews();
|
||||
void setBackBuffer();
|
||||
void setImplicitSwapChain();
|
||||
|
||||
virtual void activate();
|
||||
|
||||
|
|
@ -112,13 +103,6 @@ public:
|
|||
void resurrect();
|
||||
|
||||
virtual void resolveTo( GFXTextureObject *tex );
|
||||
|
||||
// These are all reference counted and must be released by whomever uses the get* function
|
||||
IDXGISwapChain *getSwapChain();
|
||||
ID3D11Texture2D *getBackBuffer();
|
||||
ID3D11Texture2D *getDepthStencil();
|
||||
ID3D11RenderTargetView* getBackBufferView();
|
||||
ID3D11DepthStencilView* getDepthStencilView();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include "gfx/D3D11/gfxD3D11Device.h"
|
||||
#include "gfx/D3D11/gfxD3D11EnumTranslate.h"
|
||||
#include "gfx/bitmap/bitmapUtils.h"
|
||||
#include "gfx/bitmap/imageUtils.h"
|
||||
#include "gfx/gfxCardProfile.h"
|
||||
#include "gfx/gfxStringEnumTranslate.h"
|
||||
#include "core/strings/unicode.h"
|
||||
|
|
@ -139,7 +140,7 @@ void GFXD3D11TextureManager::_innerCreateTexture( GFXD3D11TextureObject *retTex,
|
|||
}
|
||||
else
|
||||
{
|
||||
UINT numQualityLevels = 0;
|
||||
U32 numQualityLevels = 0;
|
||||
|
||||
switch (antialiasLevel)
|
||||
{
|
||||
|
|
@ -151,7 +152,6 @@ void GFXD3D11TextureManager::_innerCreateTexture( GFXD3D11TextureObject *retTex,
|
|||
default:
|
||||
{
|
||||
antialiasLevel = 0;
|
||||
UINT numQualityLevels;
|
||||
D3D11DEVICE->CheckMultisampleQualityLevels(d3dTextureFormat, antialiasLevel, &numQualityLevels);
|
||||
AssertFatal(numQualityLevels, "Invalid AA level!");
|
||||
break;
|
||||
|
|
@ -287,7 +287,7 @@ bool GFXD3D11TextureManager::_loadTexture(GFXTextureObject *aTexture, GBitmap *p
|
|||
const bool supportsAutoMips = GFX->getCardProfiler()->queryProfile("autoMipMapLevel", true);
|
||||
|
||||
// Helper bool
|
||||
const bool isCompressedTexFmt = aTexture->mFormat >= GFXFormatDXT1 && aTexture->mFormat <= GFXFormatDXT5;
|
||||
const bool isCompressedTexFmt = ImageUtil::isCompressedFormat(aTexture->mFormat);
|
||||
|
||||
// Settings for mipmap generation
|
||||
U32 maxDownloadMip = pDL->getNumMipLevels();
|
||||
|
|
@ -312,10 +312,10 @@ bool GFXD3D11TextureManager::_loadTexture(GFXTextureObject *aTexture, GBitmap *p
|
|||
|
||||
switch(texture->mFormat)
|
||||
{
|
||||
case GFXFormatR8G8B8:
|
||||
case GFXFormatR8G8B8:
|
||||
case GFXFormatR8G8B8_SRGB:
|
||||
{
|
||||
PROFILE_SCOPE(Swizzle24_Upload);
|
||||
AssertFatal(pDL->getFormat() == GFXFormatR8G8B8, "Assumption failed");
|
||||
|
||||
U8* Bits = new U8[pDL->getWidth(i) * pDL->getHeight(i) * 4];
|
||||
dMemcpy(Bits, pDL->getBits(i), pDL->getWidth(i) * pDL->getHeight(i) * 3);
|
||||
|
|
@ -330,6 +330,7 @@ bool GFXD3D11TextureManager::_loadTexture(GFXTextureObject *aTexture, GBitmap *p
|
|||
|
||||
case GFXFormatR8G8B8A8:
|
||||
case GFXFormatR8G8B8X8:
|
||||
case GFXFormatR8G8B8A8_SRGB:
|
||||
{
|
||||
PROFILE_SCOPE(Swizzle32_Upload);
|
||||
copyBuffer = new U8[pDL->getWidth(i) * pDL->getHeight(i) * pDL->getBytesPerPixel()];
|
||||
|
|
@ -360,9 +361,9 @@ bool GFXD3D11TextureManager::_loadTexture(GFXTextureObject *aTexture, GBitmap *p
|
|||
switch( texture->mFormat )
|
||||
{
|
||||
case GFXFormatR8G8B8:
|
||||
case GFXFormatR8G8B8_SRGB:
|
||||
{
|
||||
PROFILE_SCOPE(Swizzle24_Upload);
|
||||
AssertFatal(pDL->getFormat() == GFXFormatR8G8B8, "Assumption failed");
|
||||
|
||||
U8* Bits = new U8[pDL->getWidth(i) * pDL->getHeight(i) * 4];
|
||||
dMemcpy(Bits, pDL->getBits(i), pDL->getWidth(i) * pDL->getHeight(i) * 3);
|
||||
|
|
@ -375,6 +376,7 @@ bool GFXD3D11TextureManager::_loadTexture(GFXTextureObject *aTexture, GBitmap *p
|
|||
|
||||
case GFXFormatR8G8B8A8:
|
||||
case GFXFormatR8G8B8X8:
|
||||
case GFXFormatR8G8B8A8_SRGB:
|
||||
{
|
||||
PROFILE_SCOPE(Swizzle32_Upload);
|
||||
dev->getDeviceSwizzle32()->ToBuffer(mapping.pData, pDL->getBits(i), pDL->getWidth(i) * pDL->getHeight(i) * pDL->getBytesPerPixel());
|
||||
|
|
@ -417,7 +419,7 @@ bool GFXD3D11TextureManager::_loadTexture(GFXTextureObject *inTex, void *raw)
|
|||
|
||||
U8* Bits = NULL;
|
||||
|
||||
if(texture->mFormat == GFXFormatR8G8B8)
|
||||
if(texture->mFormat == GFXFormatR8G8B8 || texture->mFormat == GFXFormatR8G8B8_SRGB)
|
||||
{
|
||||
// convert 24 bit to 32 bit
|
||||
Bits = new U8[texture->getWidth() * texture->getHeight() * texture->getDepth() * 4];
|
||||
|
|
@ -430,8 +432,10 @@ bool GFXD3D11TextureManager::_loadTexture(GFXTextureObject *inTex, void *raw)
|
|||
switch(texture->mFormat)
|
||||
{
|
||||
case GFXFormatR8G8B8:
|
||||
case GFXFormatR8G8B8_SRGB:
|
||||
case GFXFormatR8G8B8A8:
|
||||
case GFXFormatR8G8B8X8:
|
||||
case GFXFormatR8G8B8A8_SRGB:
|
||||
bytesPerPix = 4;
|
||||
break;
|
||||
}
|
||||
|
|
@ -444,7 +448,7 @@ bool GFXD3D11TextureManager::_loadTexture(GFXTextureObject *inTex, void *raw)
|
|||
box.top = 0;
|
||||
box.bottom = texture->getHeight();
|
||||
|
||||
if(texture->mFormat == GFXFormatR8G8B8) // converted format also for volume textures
|
||||
if(texture->mFormat == GFXFormatR8G8B8 || texture->mFormat == GFXFormatR8G8B8_SRGB) // converted format also for volume textures
|
||||
dev->getDeviceContext()->UpdateSubresource(texture->get3DTex(), 0, &box, Bits, texture->getWidth() * bytesPerPix, texture->getHeight() * bytesPerPix);
|
||||
else
|
||||
dev->getDeviceContext()->UpdateSubresource(texture->get3DTex(), 0, &box, raw, texture->getWidth() * bytesPerPix, texture->getHeight() * bytesPerPix);
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ GFXLockedRect *GFXD3D11TextureObject::lock(U32 mipLevel /*= 0*/, RectI *inRect /
|
|||
mLockTex->getWidth() != getWidth() ||
|
||||
mLockTex->getHeight() != getHeight() )
|
||||
{
|
||||
mLockTex.set( getWidth(), getHeight(), mFormat, &GFXSystemMemProfile, avar("%s() - mLockTex (line %d)", __FUNCTION__, __LINE__) );
|
||||
mLockTex.set( getWidth(), getHeight(), mFormat, &GFXSystemMemTextureProfile, avar("%s() - mLockTex (line %d)", __FUNCTION__, __LINE__) );
|
||||
}
|
||||
|
||||
PROFILE_START(GFXD3D11TextureObject_lockRT);
|
||||
|
|
@ -180,8 +180,8 @@ bool GFXD3D11TextureObject::copyToBmp(GBitmap* bmp)
|
|||
// check format limitations
|
||||
// at the moment we only support RGBA for the source (other 4 byte formats should
|
||||
// be easy to add though)
|
||||
AssertFatal(mFormat == GFXFormatR8G8B8A8 || mFormat == GFXFormatR8G8B8A8_LINEAR_FORCE, "copyToBmp: invalid format");
|
||||
if (mFormat != GFXFormatR8G8B8A8 && mFormat != GFXFormatR8G8B8A8_LINEAR_FORCE)
|
||||
AssertFatal(mFormat == GFXFormatR8G8B8A8 || mFormat == GFXFormatR8G8B8A8_LINEAR_FORCE || mFormat == GFXFormatR8G8B8A8_SRGB, "copyToBmp: invalid format");
|
||||
if (mFormat != GFXFormatR8G8B8A8 && mFormat != GFXFormatR8G8B8A8_LINEAR_FORCE && mFormat != GFXFormatR8G8B8A8_SRGB)
|
||||
return false;
|
||||
|
||||
PROFILE_START(GFXD3D11TextureObject_copyToBmp);
|
||||
|
|
@ -197,7 +197,8 @@ bool GFXD3D11TextureObject::copyToBmp(GBitmap* bmp)
|
|||
const U32 sourceBytesPerPixel = 4;
|
||||
U32 destBytesPerPixel = 0;
|
||||
|
||||
if (bmp->getFormat() == GFXFormatR8G8B8A8 || bmp->getFormat() == GFXFormatR8G8B8A8_LINEAR_FORCE)
|
||||
const GFXFormat fmt = bmp->getFormat();
|
||||
if (fmt == GFXFormatR8G8B8A8 || fmt == GFXFormatR8G8B8A8_LINEAR_FORCE || fmt == GFXFormatR8G8B8A8_SRGB)
|
||||
destBytesPerPixel = 4;
|
||||
else if(bmp->getFormat() == GFXFormatR8G8B8)
|
||||
destBytesPerPixel = 3;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue