Commit ba8a0bf8 by Austin Kinross Committed by Jamie Madill

Add plumbing for D3D11 device caps

BUG=angleproject:1002 Change-Id: Id24783c75377ea92a73a43f2605693e07f63dc15 Reviewed-on: https://chromium-review.googlesource.com/270545Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarAustin Kinross <aukinros@microsoft.com>
parent 749fe340
...@@ -86,7 +86,7 @@ Clear11::ClearShader Clear11::CreateClearShader(ID3D11Device *device, DXGI_FORMA ...@@ -86,7 +86,7 @@ Clear11::ClearShader Clear11::CreateClearShader(ID3D11Device *device, DXGI_FORMA
Clear11::Clear11(Renderer11 *renderer) Clear11::Clear11(Renderer11 *renderer)
: mRenderer(renderer), mClearBlendStates(StructLessThan<ClearBlendInfo>), mClearDepthStencilStates(StructLessThan<ClearDepthStencilInfo>), : mRenderer(renderer), mClearBlendStates(StructLessThan<ClearBlendInfo>), mClearDepthStencilStates(StructLessThan<ClearDepthStencilInfo>),
mVertexBuffer(NULL), mRasterizerState(NULL), mSupportsClearView(false) mVertexBuffer(NULL), mRasterizerState(NULL)
{ {
TRACE_EVENT0("gpu.angle", "Clear11::Clear11"); TRACE_EVENT0("gpu.angle", "Clear11::Clear11");
...@@ -121,7 +121,7 @@ Clear11::Clear11(Renderer11 *renderer) ...@@ -121,7 +121,7 @@ Clear11::Clear11(Renderer11 *renderer)
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mRasterizerState, "Clear11 masked clear rasterizer state"); d3d11::SetDebugName(mRasterizerState, "Clear11 masked clear rasterizer state");
if (renderer->getFeatureLevel() <= D3D_FEATURE_LEVEL_9_3) if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
mFloatClearShader = CreateClearShader(device, DXGI_FORMAT_R32G32B32A32_FLOAT, g_VS_ClearFloat, g_PS_ClearFloat_FL9); mFloatClearShader = CreateClearShader(device, DXGI_FORMAT_R32G32B32A32_FLOAT, g_VS_ClearFloat, g_PS_ClearFloat_FL9);
} }
...@@ -135,13 +135,6 @@ Clear11::Clear11(Renderer11 *renderer) ...@@ -135,13 +135,6 @@ Clear11::Clear11(Renderer11 *renderer)
mUintClearShader = CreateClearShader(device, DXGI_FORMAT_R32G32B32A32_UINT, g_VS_ClearUint, g_PS_ClearUint ); mUintClearShader = CreateClearShader(device, DXGI_FORMAT_R32G32B32A32_UINT, g_VS_ClearUint, g_PS_ClearUint );
mIntClearShader = CreateClearShader(device, DXGI_FORMAT_R32G32B32A32_SINT, g_VS_ClearSint, g_PS_ClearSint ); mIntClearShader = CreateClearShader(device, DXGI_FORMAT_R32G32B32A32_SINT, g_VS_ClearSint, g_PS_ClearSint );
} }
if (renderer->getDeviceContext1IfSupported())
{
D3D11_FEATURE_DATA_D3D11_OPTIONS d3d11Options;
device->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &d3d11Options, sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS));
mSupportsClearView = (d3d11Options.ClearView != FALSE);
}
} }
Clear11::~Clear11() Clear11::~Clear11()
...@@ -284,7 +277,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams, const gl ...@@ -284,7 +277,7 @@ gl::Error Clear11::clearFramebuffer(const ClearParameters &clearParams, const gl
// Every channel either does not exist in the render target or is masked out // Every channel either does not exist in the render target or is masked out
continue; continue;
} }
else if ((!mSupportsClearView && needScissoredClear) || clearParams.colorClearType != GL_FLOAT || else if ((!(mRenderer->getRenderer11DeviceCaps().supportsClearView) && needScissoredClear) || clearParams.colorClearType != GL_FLOAT ||
(formatInfo.redBits > 0 && !clearParams.colorMaskRed) || (formatInfo.redBits > 0 && !clearParams.colorMaskRed) ||
(formatInfo.greenBits > 0 && !clearParams.colorMaskGreen) || (formatInfo.greenBits > 0 && !clearParams.colorMaskGreen) ||
(formatInfo.blueBits > 0 && !clearParams.colorMaskBlue) || (formatInfo.blueBits > 0 && !clearParams.colorMaskBlue) ||
......
...@@ -77,8 +77,6 @@ class Clear11 : angle::NonCopyable ...@@ -77,8 +77,6 @@ class Clear11 : angle::NonCopyable
ID3D11Buffer *mVertexBuffer; ID3D11Buffer *mVertexBuffer;
ID3D11RasterizerState *mRasterizerState; ID3D11RasterizerState *mRasterizerState;
bool mSupportsClearView;
}; };
} }
......
...@@ -32,9 +32,6 @@ Image11::Image11(Renderer11 *renderer) ...@@ -32,9 +32,6 @@ Image11::Image11(Renderer11 *renderer)
mAssociatedImageIndex(gl::ImageIndex::MakeInvalid()), mAssociatedImageIndex(gl::ImageIndex::MakeInvalid()),
mRecoveredFromStorageCount(0) mRecoveredFromStorageCount(0)
{ {
// mRenderer should remain unchanged during the lifetime of the Image11 object.
// This lets us safely use mRenderer (and its Feature Level) in Image11's methods.
mFeatureLevel = renderer->getFeatureLevel();
} }
Image11::~Image11() Image11::~Image11()
...@@ -88,10 +85,15 @@ bool Image11::isDirty() const ...@@ -88,10 +85,15 @@ bool Image11::isDirty() const
// AND mStagingTexture doesn't exist AND mStagingTexture doesn't need to be recovered from TextureStorage // AND mStagingTexture doesn't exist AND mStagingTexture doesn't need to be recovered from TextureStorage
// AND the texture doesn't require init data (i.e. a blank new texture will suffice) // AND the texture doesn't require init data (i.e. a blank new texture will suffice)
// then isDirty should still return false. // then isDirty should still return false.
if (mDirty && !mStagingTexture && !mRecoverFromStorage && !(d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel).dataInitializerFunction != NULL)) if (mDirty && !mStagingTexture && !mRecoverFromStorage)
{
const Renderer11DeviceCaps &deviceCaps = mRenderer->getRenderer11DeviceCaps();
const d3d11::TextureFormat formatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, deviceCaps);
if (formatInfo.dataInitializerFunction == nullptr)
{ {
return false; return false;
} }
}
return mDirty; return mDirty;
} }
...@@ -216,7 +218,7 @@ bool Image11::redefine(GLenum target, GLenum internalformat, const gl::Extents & ...@@ -216,7 +218,7 @@ bool Image11::redefine(GLenum target, GLenum internalformat, const gl::Extents &
mTarget = target; mTarget = target;
// compute the d3d format that will be used // compute the d3d format that will be used
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, mFeatureLevel); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, mRenderer->getRenderer11DeviceCaps());
mDXGIFormat = formatInfo.texFormat; mDXGIFormat = formatInfo.texFormat;
mRenderable = (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN); mRenderable = (formatInfo.rtvFormat != DXGI_FORMAT_UNKNOWN);
...@@ -249,7 +251,7 @@ gl::Error Image11::loadData(const gl::Box &area, const gl::PixelUnpackState &unp ...@@ -249,7 +251,7 @@ gl::Error Image11::loadData(const gl::Box &area, const gl::PixelUnpackState &unp
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mDXGIFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mDXGIFormat);
GLuint outputPixelSize = dxgiFormatInfo.pixelBytes; GLuint outputPixelSize = dxgiFormatInfo.pixelBytes;
const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel); const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, mRenderer->getRenderer11DeviceCaps());
LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(type); LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(type);
D3D11_MAPPED_SUBRESOURCE mappedImage; D3D11_MAPPED_SUBRESOURCE mappedImage;
...@@ -283,7 +285,7 @@ gl::Error Image11::loadCompressedData(const gl::Box &area, const void *input) ...@@ -283,7 +285,7 @@ gl::Error Image11::loadCompressedData(const gl::Box &area, const void *input)
ASSERT(area.x % outputBlockWidth == 0); ASSERT(area.x % outputBlockWidth == 0);
ASSERT(area.y % outputBlockHeight == 0); ASSERT(area.y % outputBlockHeight == 0);
const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel); const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(mInternalFormat, mRenderer->getRenderer11DeviceCaps());
LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(GL_UNSIGNED_BYTE); LoadImageFunction loadFunction = d3dFormatInfo.loadFunctions.at(GL_UNSIGNED_BYTE);
D3D11_MAPPED_SUBRESOURCE mappedImage; D3D11_MAPPED_SUBRESOURCE mappedImage;
...@@ -537,11 +539,11 @@ gl::Error Image11::createStagingTexture() ...@@ -537,11 +539,11 @@ gl::Error Image11::createStagingTexture()
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0; desc.MiscFlags = 0;
if (d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel).dataInitializerFunction != NULL) if (d3d11::GetTextureFormatInfo(mInternalFormat, mRenderer->getRenderer11DeviceCaps()).dataInitializerFunction != NULL)
{ {
std::vector<D3D11_SUBRESOURCE_DATA> initialData; std::vector<D3D11_SUBRESOURCE_DATA> initialData;
std::vector< std::vector<BYTE> > textureData; std::vector< std::vector<BYTE> > textureData;
d3d11::GenerateInitialTextureData(mInternalFormat, mFeatureLevel, width, height, mDepth, d3d11::GenerateInitialTextureData(mInternalFormat, mRenderer->getRenderer11DeviceCaps(), width, height, mDepth,
lodOffset + 1, &initialData, &textureData); lodOffset + 1, &initialData, &textureData);
result = device->CreateTexture3D(&desc, initialData.data(), &newTexture); result = device->CreateTexture3D(&desc, initialData.data(), &newTexture);
...@@ -577,11 +579,11 @@ gl::Error Image11::createStagingTexture() ...@@ -577,11 +579,11 @@ gl::Error Image11::createStagingTexture()
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0; desc.MiscFlags = 0;
if (d3d11::GetTextureFormatInfo(mInternalFormat, mFeatureLevel).dataInitializerFunction != NULL) if (d3d11::GetTextureFormatInfo(mInternalFormat, mRenderer->getRenderer11DeviceCaps()).dataInitializerFunction != NULL)
{ {
std::vector<D3D11_SUBRESOURCE_DATA> initialData; std::vector<D3D11_SUBRESOURCE_DATA> initialData;
std::vector< std::vector<BYTE> > textureData; std::vector< std::vector<BYTE> > textureData;
d3d11::GenerateInitialTextureData(mInternalFormat, mFeatureLevel, width, height, 1, d3d11::GenerateInitialTextureData(mInternalFormat, mRenderer->getRenderer11DeviceCaps(), width, height, 1,
lodOffset + 1, &initialData, &textureData); lodOffset + 1, &initialData, &textureData);
result = device->CreateTexture2D(&desc, initialData.data(), &newTexture); result = device->CreateTexture2D(&desc, initialData.data(), &newTexture);
......
...@@ -65,7 +65,6 @@ class Image11 : public ImageD3D ...@@ -65,7 +65,6 @@ class Image11 : public ImageD3D
void releaseStagingTexture(); void releaseStagingTexture();
Renderer11 *mRenderer; Renderer11 *mRenderer;
D3D_FEATURE_LEVEL mFeatureLevel;
DXGI_FORMAT mDXGIFormat; DXGI_FORMAT mDXGIFormat;
ID3D11Resource *mStagingTexture; ID3D11Resource *mStagingTexture;
......
...@@ -202,7 +202,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac ...@@ -202,7 +202,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::PixelUnpackState &unpac
GLenum unsizedFormat = gl::GetInternalFormatInfo(destinationFormat).format; GLenum unsizedFormat = gl::GetInternalFormatInfo(destinationFormat).format;
GLenum sourceFormat = gl::GetSizedInternalFormat(unsizedFormat, sourcePixelsType); GLenum sourceFormat = gl::GetSizedInternalFormat(unsizedFormat, sourcePixelsType);
const d3d11::TextureFormat &sourceFormatInfo = d3d11::GetTextureFormatInfo(sourceFormat, mRenderer->getFeatureLevel()); const d3d11::TextureFormat &sourceFormatInfo = d3d11::GetTextureFormatInfo(sourceFormat, mRenderer->getRenderer11DeviceCaps());
DXGI_FORMAT srvFormat = sourceFormatInfo.srvFormat; DXGI_FORMAT srvFormat = sourceFormatInfo.srvFormat;
ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN); ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN);
Buffer11 *bufferStorage11 = GetAs<Buffer11>(sourceBuffer.getImplementation()); Buffer11 *bufferStorage11 = GetAs<Buffer11>(sourceBuffer.getImplementation());
......
...@@ -425,7 +425,7 @@ gl::Error RenderStateCache::getSamplerState(const gl::SamplerState &samplerState ...@@ -425,7 +425,7 @@ gl::Error RenderStateCache::getSamplerState(const gl::SamplerState &samplerState
samplerDesc.MinLOD = samplerState.minLod; samplerDesc.MinLOD = samplerState.minLod;
samplerDesc.MaxLOD = samplerState.maxLod; samplerDesc.MaxLOD = samplerState.maxLod;
if (mRenderer->getFeatureLevel() <= D3D_FEATURE_LEVEL_9_3) if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
// Check that maxLOD is nearly FLT_MAX (1000.0f is the default), since 9_3 doesn't support anything other than FLT_MAX. // Check that maxLOD is nearly FLT_MAX (1000.0f is the default), since 9_3 doesn't support anything other than FLT_MAX.
// Note that Feature Level 9_* only supports GL ES 2.0, so the consumer of ANGLE can't modify the Max LOD themselves. // Note that Feature Level 9_* only supports GL ES 2.0, so the consumer of ANGLE can't modify the Max LOD themselves.
......
...@@ -382,7 +382,7 @@ unsigned int SurfaceRenderTarget11::getSubresourceIndex() const ...@@ -382,7 +382,7 @@ unsigned int SurfaceRenderTarget11::getSubresourceIndex() const
DXGI_FORMAT SurfaceRenderTarget11::getDXGIFormat() const DXGI_FORMAT SurfaceRenderTarget11::getDXGIFormat() const
{ {
return d3d11::GetTextureFormatInfo(getInternalFormat(), mRenderer->getFeatureLevel()).texFormat; return d3d11::GetTextureFormatInfo(getInternalFormat(), mRenderer->getRenderer11DeviceCaps()).texFormat;
} }
} }
...@@ -189,7 +189,9 @@ Renderer11::Renderer11(egl::Display *display) ...@@ -189,7 +189,9 @@ Renderer11::Renderer11(egl::Display *display)
mSyncQuery = NULL; mSyncQuery = NULL;
mSupportsConstantBufferOffsets = false; mRenderer11DeviceCaps.supportsClearView = false;
mRenderer11DeviceCaps.supportsConstantBufferOffsets = false;
mRenderer11DeviceCaps.supportsDXGI1_2 = false;
mD3d11Module = NULL; mD3d11Module = NULL;
mDxgiModule = NULL; mDxgiModule = NULL;
...@@ -323,7 +325,7 @@ egl::Error Renderer11::initialize() ...@@ -323,7 +325,7 @@ egl::Error Renderer11::initialize()
mAvailableFeatureLevels.size(), mAvailableFeatureLevels.size(),
D3D11_SDK_VERSION, D3D11_SDK_VERSION,
&mDevice, &mDevice,
&mFeatureLevel, &(mRenderer11DeviceCaps.featureLevel),
&mDeviceContext); &mDeviceContext);
} }
...@@ -346,7 +348,7 @@ egl::Error Renderer11::initialize() ...@@ -346,7 +348,7 @@ egl::Error Renderer11::initialize()
mAvailableFeatureLevels.size(), mAvailableFeatureLevels.size(),
D3D11_SDK_VERSION, D3D11_SDK_VERSION,
&mDevice, &mDevice,
&mFeatureLevel, &(mRenderer11DeviceCaps.featureLevel),
&mDeviceContext); &mDeviceContext);
// Cleanup done by destructor // Cleanup done by destructor
...@@ -463,10 +465,11 @@ egl::Error Renderer11::initialize() ...@@ -463,10 +465,11 @@ egl::Error Renderer11::initialize()
SafeRelease(dxgiDevice); SafeRelease(dxgiDevice);
IDXGIAdapter2 *dxgiAdapter2 = d3d11::DynamicCastComObject<IDXGIAdapter2>(mDxgiAdapter); IDXGIAdapter2 *dxgiAdapter2 = d3d11::DynamicCastComObject<IDXGIAdapter2>(mDxgiAdapter);
mRenderer11DeviceCaps.supportsDXGI1_2 = (dxgiAdapter2 != nullptr);
// On D3D_FEATURE_LEVEL_9_*, IDXGIAdapter::GetDesc returns "Software Adapter" for the description string. // On D3D_FEATURE_LEVEL_9_*, IDXGIAdapter::GetDesc returns "Software Adapter" for the description string.
// If DXGI1.2 is available then IDXGIAdapter2::GetDesc2 can be used to get the actual hardware values. // If DXGI1.2 is available then IDXGIAdapter2::GetDesc2 can be used to get the actual hardware values.
if (mFeatureLevel <= D3D_FEATURE_LEVEL_9_3 && dxgiAdapter2 != NULL) if (mRenderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3 && dxgiAdapter2 != NULL)
{ {
DXGI_ADAPTER_DESC2 adapterDesc2 = { 0 }; DXGI_ADAPTER_DESC2 adapterDesc2 = { 0 };
dxgiAdapter2->GetDesc2(&adapterDesc2); dxgiAdapter2->GetDesc2(&adapterDesc2);
...@@ -572,11 +575,15 @@ void Renderer11::initializeDevice() ...@@ -572,11 +575,15 @@ void Renderer11::initializeDevice()
const gl::Caps &rendererCaps = getRendererCaps(); const gl::Caps &rendererCaps = getRendererCaps();
if (getDeviceContext1IfSupported()) if (mDeviceContext1)
{ {
D3D11_FEATURE_DATA_D3D11_OPTIONS d3d11Options; D3D11_FEATURE_DATA_D3D11_OPTIONS d3d11Options;
mDevice->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &d3d11Options, sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS)); HRESULT result = mDevice->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS, &d3d11Options, sizeof(D3D11_FEATURE_DATA_D3D11_OPTIONS));
mSupportsConstantBufferOffsets = (d3d11Options.ConstantBufferOffsetting != FALSE); if (SUCCEEDED(result))
{
mRenderer11DeviceCaps.supportsClearView = (d3d11Options.ClearView != FALSE);
mRenderer11DeviceCaps.supportsConstantBufferOffsets = (d3d11Options.ConstantBufferOffsetting != FALSE);
}
} }
mForceSetVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits); mForceSetVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits);
...@@ -641,7 +648,7 @@ egl::ConfigSet Renderer11::generateConfigs() const ...@@ -641,7 +648,7 @@ egl::ConfigSet Renderer11::generateConfigs() const
config.configCaveat = EGL_NONE; config.configCaveat = EGL_NONE;
config.configID = static_cast<EGLint>(configs.size() + 1); config.configID = static_cast<EGLint>(configs.size() + 1);
// Can only support a conformant ES2 with feature level greater than 10.0. // Can only support a conformant ES2 with feature level greater than 10.0.
config.conformant = (mFeatureLevel >= D3D_FEATURE_LEVEL_10_0) ? (EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT_KHR) : EGL_NONE; config.conformant = (mRenderer11DeviceCaps.featureLevel >= D3D_FEATURE_LEVEL_10_0) ? (EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT_KHR) : EGL_NONE;
config.depthSize = depthStencilBufferFormatInfo.depthBits; config.depthSize = depthStencilBufferFormatInfo.depthBits;
config.level = 0; config.level = 0;
config.matchNativePixmap = EGL_NONE; config.matchNativePixmap = EGL_NONE;
...@@ -654,7 +661,7 @@ egl::ConfigSet Renderer11::generateConfigs() const ...@@ -654,7 +661,7 @@ egl::ConfigSet Renderer11::generateConfigs() const
config.nativeVisualID = 0; config.nativeVisualID = 0;
config.nativeVisualType = EGL_NONE; config.nativeVisualType = EGL_NONE;
// Can't support ES3 at all without feature level 10.0 // Can't support ES3 at all without feature level 10.0
config.renderableType = EGL_OPENGL_ES2_BIT | ((mFeatureLevel >= D3D_FEATURE_LEVEL_10_0) ? EGL_OPENGL_ES3_BIT_KHR : 0); config.renderableType = EGL_OPENGL_ES2_BIT | ((mRenderer11DeviceCaps.featureLevel >= D3D_FEATURE_LEVEL_10_0) ? EGL_OPENGL_ES3_BIT_KHR : 0);
config.sampleBuffers = 0; // FIXME: enumerate multi-sampling config.sampleBuffers = 0; // FIXME: enumerate multi-sampling
config.samples = 0; config.samples = 0;
config.stencilSize = depthStencilBufferFormatInfo.stencilBits; config.stencilSize = depthStencilBufferFormatInfo.stencilBits;
...@@ -896,7 +903,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data, ...@@ -896,7 +903,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data,
Buffer11 *bufferStorage = GetImplAs<Buffer11>(uniformBuffer); Buffer11 *bufferStorage = GetImplAs<Buffer11>(uniformBuffer);
ID3D11Buffer *constantBuffer; ID3D11Buffer *constantBuffer;
if (mSupportsConstantBufferOffsets) if (mRenderer11DeviceCaps.supportsConstantBufferOffsets)
{ {
constantBuffer = bufferStorage->getBuffer(BUFFER_USAGE_UNIFORM); constantBuffer = bufferStorage->getBuffer(BUFFER_USAGE_UNIFORM);
} }
...@@ -914,7 +921,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data, ...@@ -914,7 +921,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data,
mCurrentConstantBufferVSOffset[uniformBufferIndex] != uniformBufferOffset || mCurrentConstantBufferVSOffset[uniformBufferIndex] != uniformBufferOffset ||
mCurrentConstantBufferVSSize[uniformBufferIndex] != uniformBufferSize) mCurrentConstantBufferVSSize[uniformBufferIndex] != uniformBufferSize)
{ {
if (mSupportsConstantBufferOffsets && uniformBufferSize != 0) if (mRenderer11DeviceCaps.supportsConstantBufferOffsets && uniformBufferSize != 0)
{ {
UINT firstConstant = 0, numConstants = 0; UINT firstConstant = 0, numConstants = 0;
CalculateConstantBufferParams(uniformBufferOffset, uniformBufferSize, &firstConstant, &numConstants); CalculateConstantBufferParams(uniformBufferOffset, uniformBufferSize, &firstConstant, &numConstants);
...@@ -952,7 +959,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data, ...@@ -952,7 +959,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data,
Buffer11 *bufferStorage = GetImplAs<Buffer11>(uniformBuffer); Buffer11 *bufferStorage = GetImplAs<Buffer11>(uniformBuffer);
ID3D11Buffer *constantBuffer; ID3D11Buffer *constantBuffer;
if (mSupportsConstantBufferOffsets) if (mRenderer11DeviceCaps.supportsConstantBufferOffsets)
{ {
constantBuffer = bufferStorage->getBuffer(BUFFER_USAGE_UNIFORM); constantBuffer = bufferStorage->getBuffer(BUFFER_USAGE_UNIFORM);
} }
...@@ -970,7 +977,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data, ...@@ -970,7 +977,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data,
mCurrentConstantBufferPSOffset[uniformBufferIndex] != uniformBufferOffset || mCurrentConstantBufferPSOffset[uniformBufferIndex] != uniformBufferOffset ||
mCurrentConstantBufferPSSize[uniformBufferIndex] != uniformBufferSize) mCurrentConstantBufferPSSize[uniformBufferIndex] != uniformBufferSize)
{ {
if (mSupportsConstantBufferOffsets && uniformBufferSize != 0) if (mRenderer11DeviceCaps.supportsConstantBufferOffsets && uniformBufferSize != 0)
{ {
UINT firstConstant = 0, numConstants = 0; UINT firstConstant = 0, numConstants = 0;
CalculateConstantBufferParams(uniformBufferOffset, uniformBufferSize, &firstConstant, &numConstants); CalculateConstantBufferParams(uniformBufferOffset, uniformBufferSize, &firstConstant, &numConstants);
...@@ -1154,7 +1161,7 @@ void Renderer11::setViewport(const gl::Rectangle &viewport, float zNear, float z ...@@ -1154,7 +1161,7 @@ void Renderer11::setViewport(const gl::Rectangle &viewport, float zNear, float z
int dxMinViewportBoundsX = -dxMaxViewportBoundsX; int dxMinViewportBoundsX = -dxMaxViewportBoundsX;
int dxMinViewportBoundsY = -dxMaxViewportBoundsY; int dxMinViewportBoundsY = -dxMaxViewportBoundsY;
if (mFeatureLevel <= D3D_FEATURE_LEVEL_9_3) if (mRenderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
// Feature Level 9 viewports shouldn't exceed the dimensions of the rendertarget. // Feature Level 9 viewports shouldn't exceed the dimensions of the rendertarget.
dxMaxViewportBoundsX = mRenderTargetDesc.width; dxMaxViewportBoundsX = mRenderTargetDesc.width;
...@@ -1183,7 +1190,7 @@ void Renderer11::setViewport(const gl::Rectangle &viewport, float zNear, float z ...@@ -1183,7 +1190,7 @@ void Renderer11::setViewport(const gl::Rectangle &viewport, float zNear, float z
mCurFar = actualZFar; mCurFar = actualZFar;
// On Feature Level 9_*, we must emulate large and/or negative viewports in the shaders using viewAdjust (like the D3D9 renderer). // On Feature Level 9_*, we must emulate large and/or negative viewports in the shaders using viewAdjust (like the D3D9 renderer).
if (mFeatureLevel <= D3D_FEATURE_LEVEL_9_3) if (mRenderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
mVertexConstants.viewAdjust[0] = static_cast<float>((actualViewport.width - dxViewportWidth) + 2 * (actualViewport.x - dxViewportTopLeftX)) / dxViewport.Width; mVertexConstants.viewAdjust[0] = static_cast<float>((actualViewport.width - dxViewportWidth) + 2 * (actualViewport.x - dxViewportTopLeftX)) / dxViewport.Width;
mVertexConstants.viewAdjust[1] = static_cast<float>((actualViewport.height - dxViewportHeight) + 2 * (actualViewport.y - dxViewportTopLeftY)) / dxViewport.Height; mVertexConstants.viewAdjust[1] = static_cast<float>((actualViewport.height - dxViewportHeight) + 2 * (actualViewport.y - dxViewportTopLeftY)) / dxViewport.Height;
...@@ -2372,7 +2379,7 @@ bool Renderer11::getShareHandleSupport() const ...@@ -2372,7 +2379,7 @@ bool Renderer11::getShareHandleSupport() const
} }
// Also disable share handles on Feature Level 9_3, since it doesn't support share handles on RGBA8 textures/swapchains. // Also disable share handles on Feature Level 9_3, since it doesn't support share handles on RGBA8 textures/swapchains.
if (mFeatureLevel <= D3D_FEATURE_LEVEL_9_3) if (mRenderer11DeviceCaps.featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
return false; return false;
} }
...@@ -2394,7 +2401,7 @@ bool Renderer11::getPostSubBufferSupport() const ...@@ -2394,7 +2401,7 @@ bool Renderer11::getPostSubBufferSupport() const
int Renderer11::getMajorShaderModel() const int Renderer11::getMajorShaderModel() const
{ {
switch (mFeatureLevel) switch (mRenderer11DeviceCaps.featureLevel)
{ {
case D3D_FEATURE_LEVEL_11_0: return D3D11_SHADER_MAJOR_VERSION; // 5 case D3D_FEATURE_LEVEL_11_0: return D3D11_SHADER_MAJOR_VERSION; // 5
case D3D_FEATURE_LEVEL_10_1: return D3D10_1_SHADER_MAJOR_VERSION; // 4 case D3D_FEATURE_LEVEL_10_1: return D3D10_1_SHADER_MAJOR_VERSION; // 4
...@@ -2406,7 +2413,7 @@ int Renderer11::getMajorShaderModel() const ...@@ -2406,7 +2413,7 @@ int Renderer11::getMajorShaderModel() const
int Renderer11::getMinorShaderModel() const int Renderer11::getMinorShaderModel() const
{ {
switch (mFeatureLevel) switch (mRenderer11DeviceCaps.featureLevel)
{ {
case D3D_FEATURE_LEVEL_11_0: return D3D11_SHADER_MINOR_VERSION; // 0 case D3D_FEATURE_LEVEL_11_0: return D3D11_SHADER_MINOR_VERSION; // 0
case D3D_FEATURE_LEVEL_10_1: return D3D10_1_SHADER_MINOR_VERSION; // 1 case D3D_FEATURE_LEVEL_10_1: return D3D10_1_SHADER_MINOR_VERSION; // 1
...@@ -2418,7 +2425,7 @@ int Renderer11::getMinorShaderModel() const ...@@ -2418,7 +2425,7 @@ int Renderer11::getMinorShaderModel() const
std::string Renderer11::getShaderModelSuffix() const std::string Renderer11::getShaderModelSuffix() const
{ {
switch (mFeatureLevel) switch (mRenderer11DeviceCaps.featureLevel)
{ {
case D3D_FEATURE_LEVEL_11_0: return ""; case D3D_FEATURE_LEVEL_11_0: return "";
case D3D_FEATURE_LEVEL_10_1: return ""; case D3D_FEATURE_LEVEL_10_1: return "";
...@@ -2656,7 +2663,7 @@ void Renderer11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView ...@@ -2656,7 +2663,7 @@ void Renderer11::setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView
gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTargetD3D **outRT) gl::Error Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples, RenderTargetD3D **outRT)
{ {
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(format, mFeatureLevel); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(format, mRenderer11DeviceCaps);
const gl::TextureCaps &textureCaps = getRendererTextureCaps().get(format); const gl::TextureCaps &textureCaps = getRendererTextureCaps().get(format);
GLuint supportedSamples = textureCaps.getNearestSamples(samples); GLuint supportedSamples = textureCaps.getNearestSamples(samples);
...@@ -3030,7 +3037,7 @@ bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const ...@@ -3030,7 +3037,7 @@ bool Renderer11::supportsFastCopyBufferToTexture(GLenum internalFormat) const
ASSERT(getRendererExtensions().pixelBufferObject); ASSERT(getRendererExtensions().pixelBufferObject);
const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat); const gl::InternalFormat &internalFormatInfo = gl::GetInternalFormatInfo(internalFormat);
const d3d11::TextureFormat &d3d11FormatInfo = d3d11::GetTextureFormatInfo(internalFormat, mFeatureLevel); const d3d11::TextureFormat &d3d11FormatInfo = d3d11::GetTextureFormatInfo(internalFormat, mRenderer11DeviceCaps);
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3d11FormatInfo.texFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3d11FormatInfo.texFormat);
// sRGB formats do not work with D3D11 buffer SRVs // sRGB formats do not work with D3D11 buffer SRVs
...@@ -3512,7 +3519,7 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const ...@@ -3512,7 +3519,7 @@ gl::Error Renderer11::blitRenderbufferRect(const gl::Rectangle &readRect, const
bool Renderer11::isES3Capable() const bool Renderer11::isES3Capable() const
{ {
return (d3d11_gl::GetMaximumClientVersion(mFeatureLevel) > 2); return (d3d11_gl::GetMaximumClientVersion(mRenderer11DeviceCaps.featureLevel) > 2);
}; };
ID3D11Texture2D *Renderer11::resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource) ID3D11Texture2D *Renderer11::resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource)
...@@ -3575,22 +3582,22 @@ bool Renderer11::getLUID(LUID *adapterLuid) const ...@@ -3575,22 +3582,22 @@ bool Renderer11::getLUID(LUID *adapterLuid) const
VertexConversionType Renderer11::getVertexConversionType(const gl::VertexFormat &vertexFormat) const VertexConversionType Renderer11::getVertexConversionType(const gl::VertexFormat &vertexFormat) const
{ {
return d3d11::GetVertexFormatInfo(vertexFormat, mFeatureLevel).conversionType; return d3d11::GetVertexFormatInfo(vertexFormat, mRenderer11DeviceCaps.featureLevel).conversionType;
} }
GLenum Renderer11::getVertexComponentType(const gl::VertexFormat &vertexFormat) const GLenum Renderer11::getVertexComponentType(const gl::VertexFormat &vertexFormat) const
{ {
return d3d11::GetDXGIFormatInfo(d3d11::GetVertexFormatInfo(vertexFormat, mFeatureLevel).nativeFormat).componentType; return d3d11::GetDXGIFormatInfo(d3d11::GetVertexFormatInfo(vertexFormat, mRenderer11DeviceCaps.featureLevel).nativeFormat).componentType;
} }
void Renderer11::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap *outTextureCaps, gl::Extensions *outExtensions) const void Renderer11::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap *outTextureCaps, gl::Extensions *outExtensions) const
{ {
d3d11_gl::GenerateCaps(mDevice, mDeviceContext, outCaps, outTextureCaps, outExtensions); d3d11_gl::GenerateCaps(mDevice, mDeviceContext, mRenderer11DeviceCaps, outCaps, outTextureCaps, outExtensions);
} }
Workarounds Renderer11::generateWorkarounds() const Workarounds Renderer11::generateWorkarounds() const
{ {
return d3d11::GenerateWorkarounds(mFeatureLevel); return d3d11::GenerateWorkarounds(mRenderer11DeviceCaps.featureLevel);
} }
void Renderer11::setShaderResource(gl::SamplerType shaderType, UINT resourceSlot, ID3D11ShaderResourceView *srv) void Renderer11::setShaderResource(gl::SamplerType shaderType, UINT resourceSlot, ID3D11ShaderResourceView *srv)
......
...@@ -39,6 +39,14 @@ class RenderTarget11; ...@@ -39,6 +39,14 @@ class RenderTarget11;
class Trim11; class Trim11;
struct PackPixelsParams; struct PackPixelsParams;
struct Renderer11DeviceCaps
{
D3D_FEATURE_LEVEL featureLevel;
bool supportsDXGI1_2; // Support for DXGI 1.2
bool supportsClearView; // Support for ID3D11DeviceContext1::ClearView
bool supportsConstantBufferOffsets; // Support for Constant buffer offset
};
enum enum
{ {
MAX_VERTEX_UNIFORM_VECTORS_D3D11 = 1024, MAX_VERTEX_UNIFORM_VECTORS_D3D11 = 1024,
...@@ -257,7 +265,7 @@ class Renderer11 : public RendererD3D ...@@ -257,7 +265,7 @@ class Renderer11 : public RendererD3D
bool colorBlit, bool depthBlit, bool stencilBlit); bool colorBlit, bool depthBlit, bool stencilBlit);
bool isES3Capable() const; bool isES3Capable() const;
D3D_FEATURE_LEVEL getFeatureLevel() const { return mFeatureLevel; }; const Renderer11DeviceCaps &getRenderer11DeviceCaps() { return mRenderer11DeviceCaps; };
RendererClass getRendererClass() const override { return RENDERER_D3D11; } RendererClass getRendererClass() const override { return RENDERER_D3D11; }
...@@ -405,11 +413,8 @@ class Renderer11 : public RendererD3D ...@@ -405,11 +413,8 @@ class Renderer11 : public RendererD3D
// Sync query // Sync query
ID3D11Query *mSyncQuery; ID3D11Query *mSyncQuery;
// Constant buffer offset support
bool mSupportsConstantBufferOffsets;
ID3D11Device *mDevice; ID3D11Device *mDevice;
D3D_FEATURE_LEVEL mFeatureLevel; Renderer11DeviceCaps mRenderer11DeviceCaps;
ID3D11DeviceContext *mDeviceContext; ID3D11DeviceContext *mDeviceContext;
ID3D11DeviceContext1 *mDeviceContext1; ID3D11DeviceContext1 *mDeviceContext1;
IDXGIAdapter *mDxgiAdapter; IDXGIAdapter *mDxgiAdapter;
......
...@@ -110,7 +110,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei ...@@ -110,7 +110,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
releaseOffscreenTexture(); releaseOffscreenTexture();
const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer->getFeatureLevel()); const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer->getRenderer11DeviceCaps());
// If the app passed in a share handle, open the resource // If the app passed in a share handle, open the resource
// See EGL_ANGLE_d3d_share_handle_client_buffer // See EGL_ANGLE_d3d_share_handle_client_buffer
...@@ -232,7 +232,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei ...@@ -232,7 +232,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
d3d11::SetDebugName(mOffscreenSRView, "Offscreen back buffer shader resource"); d3d11::SetDebugName(mOffscreenSRView, "Offscreen back buffer shader resource");
const d3d11::TextureFormat &depthBufferFormatInfo = d3d11::GetTextureFormatInfo(mDepthBufferFormat, mRenderer->getFeatureLevel()); const d3d11::TextureFormat &depthBufferFormatInfo = d3d11::GetTextureFormatInfo(mDepthBufferFormat, mRenderer->getRenderer11DeviceCaps());
if (mDepthBufferFormat != GL_NONE) if (mDepthBufferFormat != GL_NONE)
{ {
...@@ -349,7 +349,7 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight) ...@@ -349,7 +349,7 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
// Resize swap chain // Resize swap chain
DXGI_SWAP_CHAIN_DESC desc; DXGI_SWAP_CHAIN_DESC desc;
mSwapChain->GetDesc(&desc); mSwapChain->GetDesc(&desc);
const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer->getFeatureLevel()); const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer->getRenderer11DeviceCaps());
HRESULT result = mSwapChain->ResizeBuffers(desc.BufferCount, backbufferWidth, backbufferHeight, backbufferFormatInfo.texFormat, 0); HRESULT result = mSwapChain->ResizeBuffers(desc.BufferCount, backbufferWidth, backbufferHeight, backbufferFormatInfo.texFormat, 0);
if (FAILED(result)) if (FAILED(result))
...@@ -416,7 +416,7 @@ EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swap ...@@ -416,7 +416,7 @@ EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swap
if (mNativeWindow.getNativeWindow()) if (mNativeWindow.getNativeWindow())
{ {
const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer->getFeatureLevel()); const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer->getRenderer11DeviceCaps());
HRESULT result = mNativeWindow.createSwapChain(device, mRenderer->getDxgiFactory(), HRESULT result = mNativeWindow.createSwapChain(device, mRenderer->getDxgiFactory(),
backbufferFormatInfo.texFormat, backbufferFormatInfo.texFormat,
......
...@@ -95,11 +95,11 @@ TextureStorage11::~TextureStorage11() ...@@ -95,11 +95,11 @@ TextureStorage11::~TextureStorage11()
mSrvCache.clear(); mSrvCache.clear();
} }
DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel, bool renderTarget) DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget)
{ {
UINT bindFlags = 0; UINT bindFlags = 0;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalFormat, featureLevel); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalFormat, renderer11DeviceCaps);
if (formatInfo.srvFormat != DXGI_FORMAT_UNKNOWN) if (formatInfo.srvFormat != DXGI_FORMAT_UNKNOWN)
{ {
bindFlags |= D3D11_BIND_SHADER_RESOURCE; bindFlags |= D3D11_BIND_SHADER_RESOURCE;
...@@ -116,16 +116,16 @@ DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat, D3D_FEATURE_L ...@@ -116,16 +116,16 @@ DWORD TextureStorage11::GetTextureBindFlags(GLenum internalFormat, D3D_FEATURE_L
return bindFlags; return bindFlags;
} }
DWORD TextureStorage11::GetTextureMiscFlags(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel, bool renderTarget, int levels) DWORD TextureStorage11::GetTextureMiscFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget, int levels)
{ {
UINT miscFlags = 0; UINT miscFlags = 0;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalFormat, featureLevel); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalFormat, renderer11DeviceCaps);
if (renderTarget && levels > 1) if (renderTarget && levels > 1)
{ {
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(formatInfo.srvFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(formatInfo.srvFormat);
if (dxgiFormatInfo.nativeMipmapSupport(featureLevel)) if (dxgiFormatInfo.nativeMipmapSupport(renderer11DeviceCaps.featureLevel))
{ {
miscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS; miscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS;
} }
...@@ -202,7 +202,7 @@ gl::Error TextureStorage11::getSRV(const gl::SamplerState &samplerState, ID3D11S ...@@ -202,7 +202,7 @@ gl::Error TextureStorage11::getSRV(const gl::SamplerState &samplerState, ID3D11S
// Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level, which corresponds to GL level 0) // Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level, which corresponds to GL level 0)
mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - samplerState.baseLevel); mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - samplerState.baseLevel);
if (mRenderer->getFeatureLevel() <= D3D_FEATURE_LEVEL_9_3) if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
ASSERT(!swizzleRequired); ASSERT(!swizzleRequired);
ASSERT(mipLevels == 1 || mipLevels == mMipLevels); ASSERT(mipLevels == 1 || mipLevels == mMipLevels);
...@@ -295,7 +295,7 @@ gl::Error TextureStorage11::getSRVLevels(GLint baseLevel, GLint maxLevel, ID3D11 ...@@ -295,7 +295,7 @@ gl::Error TextureStorage11::getSRVLevels(GLint baseLevel, GLint maxLevel, ID3D11
// Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level, which corresponds to GL level 0) // Make sure there's 'mipLevels' mipmap levels below the base level (offset by the top level, which corresponds to GL level 0)
mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - baseLevel); mipLevels = std::min(mipLevels, mMipLevels - mTopLevel - baseLevel);
if (mRenderer->getFeatureLevel() <= D3D_FEATURE_LEVEL_9_3) if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
ASSERT(mipLevels == 1 || mipLevels == mMipLevels); ASSERT(mipLevels == 1 || mipLevels == mMipLevels);
} }
...@@ -498,7 +498,7 @@ gl::Error TextureStorage11::copySubresourceLevel(ID3D11Resource* dstTexture, uns ...@@ -498,7 +498,7 @@ gl::Error TextureStorage11::copySubresourceLevel(ID3D11Resource* dstTexture, uns
// D3D11 can't perform partial CopySubresourceRegion on depth/stencil textures, so pSrcBox should be NULL. // D3D11 can't perform partial CopySubresourceRegion on depth/stencil textures, so pSrcBox should be NULL.
D3D11_BOX srcBox; D3D11_BOX srcBox;
D3D11_BOX *pSrcBox = NULL; D3D11_BOX *pSrcBox = NULL;
if (mRenderer->getFeatureLevel() <= D3D_FEATURE_LEVEL_9_3) if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
// However, D3D10Level9 doesn't always perform CopySubresourceRegion correctly unless the source box // However, D3D10Level9 doesn't always perform CopySubresourceRegion correctly unless the source box
// is specified. This is okay, since we don't perform CopySubresourceRegion on depth/stencil // is specified. This is okay, since we don't perform CopySubresourceRegion on depth/stencil
...@@ -623,7 +623,7 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index, ImageD3D *image ...@@ -623,7 +623,7 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index, ImageD3D *image
UINT srcRowPitch = internalFormatInfo.computeRowPitch(type, width, unpack.alignment, unpack.rowLength); UINT srcRowPitch = internalFormatInfo.computeRowPitch(type, width, unpack.alignment, unpack.rowLength);
UINT srcDepthPitch = internalFormatInfo.computeDepthPitch(type, width, height, unpack.alignment, unpack.rowLength); UINT srcDepthPitch = internalFormatInfo.computeDepthPitch(type, width, height, unpack.alignment, unpack.rowLength);
const d3d11::TextureFormat &d3d11Format = d3d11::GetTextureFormatInfo(image->getInternalFormat(), mRenderer->getFeatureLevel()); const d3d11::TextureFormat &d3d11Format = d3d11::GetTextureFormatInfo(image->getInternalFormat(), mRenderer->getRenderer11DeviceCaps());
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3d11Format.texFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3d11Format.texFormat);
size_t outputPixelSize = dxgiFormatInfo.pixelBytes; size_t outputPixelSize = dxgiFormatInfo.pixelBytes;
...@@ -711,7 +711,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap ...@@ -711,7 +711,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap
mRenderTargetFormat = rtvDesc.Format; mRenderTargetFormat = rtvDesc.Format;
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mTextureFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(mTextureFormat);
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(dxgiFormatInfo.internalFormat, mRenderer->getFeatureLevel()); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(dxgiFormatInfo.internalFormat, mRenderer->getRenderer11DeviceCaps());
mSwizzleTextureFormat = formatInfo.swizzleTexFormat; mSwizzleTextureFormat = formatInfo.swizzleTexFormat;
mSwizzleShaderResourceFormat = formatInfo.swizzleSRVFormat; mSwizzleShaderResourceFormat = formatInfo.swizzleSRVFormat;
mSwizzleRenderTargetFormat = formatInfo.swizzleRTVFormat; mSwizzleRenderTargetFormat = formatInfo.swizzleRTVFormat;
...@@ -723,8 +723,8 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap ...@@ -723,8 +723,8 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swap
TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly) TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly)
: TextureStorage11(renderer, : TextureStorage11(renderer,
GetTextureBindFlags(internalformat, renderer->getFeatureLevel(), renderTarget), GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget),
GetTextureMiscFlags(internalformat, renderer->getFeatureLevel(), renderTarget, levels)), GetTextureMiscFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget, levels)),
mTexture(NULL), mTexture(NULL),
mSwizzleTexture(NULL), mSwizzleTexture(NULL),
mLevelZeroTexture(NULL), mLevelZeroTexture(NULL),
...@@ -740,7 +740,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, GLenum internalfo ...@@ -740,7 +740,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer11 *renderer, GLenum internalfo
mInternalFormat = internalformat; mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getFeatureLevel()); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getRenderer11DeviceCaps());
mTextureFormat = formatInfo.texFormat; mTextureFormat = formatInfo.texFormat;
mShaderResourceFormat = formatInfo.srvFormat; mShaderResourceFormat = formatInfo.srvFormat;
mDepthStencilFormat = formatInfo.dsvFormat; mDepthStencilFormat = formatInfo.dsvFormat;
...@@ -1088,7 +1088,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend ...@@ -1088,7 +1088,7 @@ gl::Error TextureStorage11_2D::getRenderTarget(const gl::ImageIndex &index, Rend
// On Feature Level 9_3, this is unlikely to be useful. The renderer can't create SRVs on the individual levels of the texture, // On Feature Level 9_3, this is unlikely to be useful. The renderer can't create SRVs on the individual levels of the texture,
// so methods like generateMipmap can't do anything useful with non-zero-level RTVs. // so methods like generateMipmap can't do anything useful with non-zero-level RTVs.
// Therefore if level > 0 on 9_3 then there's almost certainly something wrong. // Therefore if level > 0 on 9_3 then there's almost certainly something wrong.
ASSERT(!(mRenderer->getFeatureLevel() <= D3D_FEATURE_LEVEL_9_3 && level > 0)); ASSERT(!(mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3 && level > 0));
if (!mRenderTarget[level]) if (!mRenderTarget[level])
{ {
...@@ -1310,8 +1310,8 @@ gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel, ID3D11Render ...@@ -1310,8 +1310,8 @@ gl::Error TextureStorage11_2D::getSwizzleRenderTarget(int mipLevel, ID3D11Render
TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly) TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly)
: TextureStorage11(renderer, : TextureStorage11(renderer,
GetTextureBindFlags(internalformat, renderer->getFeatureLevel(), renderTarget), GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget),
GetTextureMiscFlags(internalformat, renderer->getFeatureLevel(), renderTarget, levels)) GetTextureMiscFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget, levels))
{ {
mTexture = NULL; mTexture = NULL;
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
...@@ -1336,7 +1336,7 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum intern ...@@ -1336,7 +1336,7 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer11 *renderer, GLenum intern
mInternalFormat = internalformat; mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getFeatureLevel()); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getRenderer11DeviceCaps());
mTextureFormat = formatInfo.texFormat; mTextureFormat = formatInfo.texFormat;
mShaderResourceFormat = formatInfo.srvFormat; mShaderResourceFormat = formatInfo.srvFormat;
mDepthStencilFormat = formatInfo.dsvFormat; mDepthStencilFormat = formatInfo.dsvFormat;
...@@ -1784,7 +1784,7 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, Re ...@@ -1784,7 +1784,7 @@ gl::Error TextureStorage11_Cube::getRenderTarget(const gl::ImageIndex &index, Re
srvDesc.Texture2DArray.FirstArraySlice = faceIndex; srvDesc.Texture2DArray.FirstArraySlice = faceIndex;
srvDesc.Texture2DArray.ArraySize = 1; srvDesc.Texture2DArray.ArraySize = 1;
if (mRenderer->getFeatureLevel() <= D3D_FEATURE_LEVEL_9_3) if (mRenderer->getRenderer11DeviceCaps().featureLevel <= D3D_FEATURE_LEVEL_9_3)
{ {
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
} }
...@@ -1996,8 +1996,8 @@ gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel, ID3D11Rend ...@@ -1996,8 +1996,8 @@ gl::Error TextureStorage11_Cube::getSwizzleRenderTarget(int mipLevel, ID3D11Rend
TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth, int levels) GLsizei width, GLsizei height, GLsizei depth, int levels)
: TextureStorage11(renderer, : TextureStorage11(renderer,
GetTextureBindFlags(internalformat, renderer->getFeatureLevel(), renderTarget), GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget),
GetTextureMiscFlags(internalformat, renderer->getFeatureLevel(), renderTarget, levels)) GetTextureMiscFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget, levels))
{ {
mTexture = NULL; mTexture = NULL;
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
...@@ -2011,7 +2011,7 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, GLenum internalfo ...@@ -2011,7 +2011,7 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer11 *renderer, GLenum internalfo
mInternalFormat = internalformat; mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getFeatureLevel()); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getRenderer11DeviceCaps());
mTextureFormat = formatInfo.texFormat; mTextureFormat = formatInfo.texFormat;
mShaderResourceFormat = formatInfo.srvFormat; mShaderResourceFormat = formatInfo.srvFormat;
mDepthStencilFormat = formatInfo.dsvFormat; mDepthStencilFormat = formatInfo.dsvFormat;
...@@ -2378,8 +2378,8 @@ gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel, ID3D11Render ...@@ -2378,8 +2378,8 @@ gl::Error TextureStorage11_3D::getSwizzleRenderTarget(int mipLevel, ID3D11Render
TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, GLenum internalformat, bool renderTarget, TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
GLsizei width, GLsizei height, GLsizei depth, int levels) GLsizei width, GLsizei height, GLsizei depth, int levels)
: TextureStorage11(renderer, : TextureStorage11(renderer,
GetTextureBindFlags(internalformat, renderer->getFeatureLevel(), renderTarget), GetTextureBindFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget),
GetTextureMiscFlags(internalformat, renderer->getFeatureLevel(), renderTarget, levels)) GetTextureMiscFlags(internalformat, renderer->getRenderer11DeviceCaps(), renderTarget, levels))
{ {
mTexture = NULL; mTexture = NULL;
mSwizzleTexture = NULL; mSwizzleTexture = NULL;
...@@ -2391,7 +2391,7 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, GLenum ...@@ -2391,7 +2391,7 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer11 *renderer, GLenum
mInternalFormat = internalformat; mInternalFormat = internalformat;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getFeatureLevel()); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalformat, renderer->getRenderer11DeviceCaps());
mTextureFormat = formatInfo.texFormat; mTextureFormat = formatInfo.texFormat;
mShaderResourceFormat = formatInfo.srvFormat; mShaderResourceFormat = formatInfo.srvFormat;
mDepthStencilFormat = formatInfo.dsvFormat; mDepthStencilFormat = formatInfo.dsvFormat;
......
...@@ -28,14 +28,15 @@ class RenderTarget11; ...@@ -28,14 +28,15 @@ class RenderTarget11;
class Renderer11; class Renderer11;
class SwapChain11; class SwapChain11;
class Image11; class Image11;
struct Renderer11DeviceCaps;
class TextureStorage11 : public TextureStorage class TextureStorage11 : public TextureStorage
{ {
public: public:
virtual ~TextureStorage11(); virtual ~TextureStorage11();
static DWORD GetTextureBindFlags(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel, bool renderTarget); static DWORD GetTextureBindFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget);
static DWORD GetTextureMiscFlags(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel, bool renderTarget, int levels); static DWORD GetTextureMiscFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget, int levels);
UINT getBindFlags() const; UINT getBindFlags() const;
UINT getMiscFlags() const; UINT getMiscFlags() const;
......
...@@ -152,7 +152,8 @@ gl::Error VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &attri ...@@ -152,7 +152,8 @@ gl::Error VertexBuffer11::storeVertexAttributes(const gl::VertexAttribute &attri
} }
gl::VertexFormat vertexFormat(attrib, currentValue.Type); gl::VertexFormat vertexFormat(attrib, currentValue.Type);
const d3d11::VertexFormat &vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormat, mRenderer->getFeatureLevel()); const D3D_FEATURE_LEVEL featureLevel = mRenderer->getRenderer11DeviceCaps().featureLevel;
const d3d11::VertexFormat &vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormat, featureLevel);
ASSERT(vertexFormatInfo.copyFunction != NULL); ASSERT(vertexFormatInfo.copyFunction != NULL);
vertexFormatInfo.copyFunction(input, inputStride, count, output); vertexFormatInfo.copyFunction(input, inputStride, count, output);
...@@ -176,7 +177,8 @@ gl::Error VertexBuffer11::getSpaceRequired(const gl::VertexAttribute &attrib, GL ...@@ -176,7 +177,8 @@ gl::Error VertexBuffer11::getSpaceRequired(const gl::VertexAttribute &attrib, GL
} }
gl::VertexFormat vertexFormat(attrib); gl::VertexFormat vertexFormat(attrib);
const d3d11::VertexFormat &vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormat, mRenderer->getFeatureLevel()); const D3D_FEATURE_LEVEL featureLevel = mRenderer->getRenderer11DeviceCaps().featureLevel;
const d3d11::VertexFormat &vertexFormatInfo = d3d11::GetVertexFormatInfo(vertexFormat, featureLevel);
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(vertexFormatInfo.nativeFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(vertexFormatInfo.nativeFormat);
unsigned int elementSize = dxgiFormatInfo.pixelBytes; unsigned int elementSize = dxgiFormatInfo.pixelBytes;
if (elementSize <= std::numeric_limits<unsigned int>::max() / elementCount) if (elementSize <= std::numeric_limits<unsigned int>::max() / elementCount)
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
// formats. // formats.
#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" #include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
#include "libANGLE/formatutils.h" #include "libANGLE/formatutils.h"
#include "libANGLE/renderer/Renderer.h" #include "libANGLE/renderer/Renderer.h"
#include "libANGLE/renderer/d3d/copyimage.h" #include "libANGLE/renderer/d3d/copyimage.h"
...@@ -1028,12 +1028,12 @@ static D3D11ES3FormatMap BuildD3D11FormatMap() ...@@ -1028,12 +1028,12 @@ static D3D11ES3FormatMap BuildD3D11FormatMap()
return map; return map;
} }
const TextureFormat &GetTextureFormatInfo(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel) const TextureFormat &GetTextureFormatInfo(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps)
{ {
static const D3D11ES3FormatMap formatMap = BuildD3D11FormatMap(); static const D3D11ES3FormatMap formatMap = BuildD3D11FormatMap();
static const D3D11ES3FormatMap formatMapFL9_3Override = BuildD3D11_FL9_3FormatOverrideMap(); static const D3D11ES3FormatMap formatMapFL9_3Override = BuildD3D11_FL9_3FormatOverrideMap();
if (featureLevel == D3D_FEATURE_LEVEL_9_3) if (renderer11DeviceCaps.featureLevel == D3D_FEATURE_LEVEL_9_3)
{ {
// First see if the internalFormat has a special map for FL9_3 // First see if the internalFormat has a special map for FL9_3
D3D11ES3FormatMap::const_iterator fl9_3Iter = formatMapFL9_3Override.find(internalFormat); D3D11ES3FormatMap::const_iterator fl9_3Iter = formatMapFL9_3Override.find(internalFormat);
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
namespace rx namespace rx
{ {
struct Renderer11DeviceCaps;
namespace d3d11 namespace d3d11
{ {
...@@ -78,7 +79,7 @@ struct TextureFormat ...@@ -78,7 +79,7 @@ struct TextureFormat
typedef std::map<GLenum, LoadImageFunction> LoadFunctionMap; typedef std::map<GLenum, LoadImageFunction> LoadFunctionMap;
LoadFunctionMap loadFunctions; LoadFunctionMap loadFunctions;
}; };
const TextureFormat &GetTextureFormatInfo(GLenum internalFormat, D3D_FEATURE_LEVEL featureLevel); const TextureFormat &GetTextureFormatInfo(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps);
struct VertexFormat struct VertexFormat
{ {
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
// specific to the D3D11 renderer. // specific to the D3D11 renderer.
#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
#include "libANGLE/renderer/d3d/d3d11/formatutils11.h" #include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" #include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
#include "libANGLE/renderer/d3d/FramebufferD3D.h" #include "libANGLE/renderer/d3d/FramebufferD3D.h"
...@@ -245,11 +246,11 @@ GLint GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel) ...@@ -245,11 +246,11 @@ GLint GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel)
} }
} }
static gl::TextureCaps GenerateTextureFormatCaps(GLint maxClientVersion, GLenum internalFormat, ID3D11Device *device) static gl::TextureCaps GenerateTextureFormatCaps(GLint maxClientVersion, GLenum internalFormat, ID3D11Device *device, const Renderer11DeviceCaps &renderer11DeviceCaps)
{ {
gl::TextureCaps textureCaps; gl::TextureCaps textureCaps;
const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalFormat, device->GetFeatureLevel()); const d3d11::TextureFormat &formatInfo = d3d11::GetTextureFormatInfo(internalFormat, renderer11DeviceCaps);
UINT formatSupport; UINT formatSupport;
if (SUCCEEDED(device->CheckFormatSupport(formatInfo.texFormat, &formatSupport))) if (SUCCEEDED(device->CheckFormatSupport(formatInfo.texFormat, &formatSupport)))
...@@ -957,15 +958,14 @@ static size_t GetMaximumStreamOutputSeparateComponents(D3D_FEATURE_LEVEL feature ...@@ -957,15 +958,14 @@ static size_t GetMaximumStreamOutputSeparateComponents(D3D_FEATURE_LEVEL feature
} }
} }
void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions) void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, const Renderer11DeviceCaps &renderer11DeviceCaps, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions)
{ {
D3D_FEATURE_LEVEL featureLevel = device->GetFeatureLevel();
GLuint maxSamples = 0; GLuint maxSamples = 0;
D3D_FEATURE_LEVEL featureLevel = renderer11DeviceCaps.featureLevel;
const gl::FormatSet &allFormats = gl::GetAllSizedInternalFormats(); const gl::FormatSet &allFormats = gl::GetAllSizedInternalFormats();
for (gl::FormatSet::const_iterator internalFormat = allFormats.begin(); internalFormat != allFormats.end(); ++internalFormat) for (gl::FormatSet::const_iterator internalFormat = allFormats.begin(); internalFormat != allFormats.end(); ++internalFormat)
{ {
gl::TextureCaps textureCaps = GenerateTextureFormatCaps(GetMaximumClientVersion(featureLevel), *internalFormat, device); gl::TextureCaps textureCaps = GenerateTextureFormatCaps(GetMaximumClientVersion(featureLevel), *internalFormat, device, renderer11DeviceCaps);
textureCapsMap->insert(*internalFormat, textureCaps); textureCapsMap->insert(*internalFormat, textureCaps);
maxSamples = std::max(maxSamples, textureCaps.getMaxSamples()); maxSamples = std::max(maxSamples, textureCaps.getMaxSamples());
...@@ -1131,11 +1131,11 @@ void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsi ...@@ -1131,11 +1131,11 @@ void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsi
*levelOffset = upsampleCount; *levelOffset = upsampleCount;
} }
void GenerateInitialTextureData(GLint internalFormat, D3D_FEATURE_LEVEL featureLevel, GLuint width, GLuint height, GLuint depth, void GenerateInitialTextureData(GLint internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, GLuint width, GLuint height, GLuint depth,
GLuint mipLevels, std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData, GLuint mipLevels, std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData,
std::vector< std::vector<BYTE> > *outData) std::vector< std::vector<BYTE> > *outData)
{ {
const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(internalFormat, featureLevel); const d3d11::TextureFormat &d3dFormatInfo = d3d11::GetTextureFormatInfo(internalFormat, renderer11DeviceCaps);
ASSERT(d3dFormatInfo.dataInitializerFunction != NULL); ASSERT(d3dFormatInfo.dataInitializerFunction != NULL);
const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3dFormatInfo.texFormat); const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(d3dFormatInfo.texFormat);
......
...@@ -25,6 +25,7 @@ namespace rx ...@@ -25,6 +25,7 @@ namespace rx
{ {
class RenderTarget11; class RenderTarget11;
struct Workarounds; struct Workarounds;
struct Renderer11DeviceCaps;
namespace gl_d3d11 namespace gl_d3d11
{ {
...@@ -51,7 +52,7 @@ namespace d3d11_gl ...@@ -51,7 +52,7 @@ namespace d3d11_gl
{ {
GLint GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel); GLint GetMaximumClientVersion(D3D_FEATURE_LEVEL featureLevel);
void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions); void GenerateCaps(ID3D11Device *device, ID3D11DeviceContext *deviceContext, const Renderer11DeviceCaps &renderer11DeviceCaps, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions);
} }
...@@ -60,7 +61,7 @@ namespace d3d11 ...@@ -60,7 +61,7 @@ namespace d3d11
void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset); void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset);
void GenerateInitialTextureData(GLint internalFormat, D3D_FEATURE_LEVEL featureLevel, GLuint width, GLuint height, GLuint depth, void GenerateInitialTextureData(GLint internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, GLuint width, GLuint height, GLuint depth,
GLuint mipLevels, std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData, GLuint mipLevels, std::vector<D3D11_SUBRESOURCE_DATA> *outSubresourceData,
std::vector< std::vector<BYTE> > *outData); std::vector< std::vector<BYTE> > *outData);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment