Commit a2d97f13 by Geoff Lang Committed by Shannon Woods

RenderTarget11 now always attempts to create an SRV if the format exists and…

RenderTarget11 now always attempts to create an SRV if the format exists and specifies the bind parameters based on which formats are available. TRAC #23211 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang
parent aacabd66
...@@ -355,7 +355,7 @@ Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain) ...@@ -355,7 +355,7 @@ Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL) Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
{ {
mRenderTarget = renderer->createRenderTarget(width, height, format, samples, false); mRenderTarget = renderer->createRenderTarget(width, height, format, samples);
if (mRenderTarget) if (mRenderTarget)
{ {
...@@ -401,7 +401,7 @@ DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *sw ...@@ -401,7 +401,7 @@ DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *sw
DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
{ {
mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples, true); mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples);
mWidth = mDepthStencil->getWidth(); mWidth = mDepthStencil->getWidth();
mHeight = mDepthStencil->getHeight(); mHeight = mDepthStencil->getHeight();
......
...@@ -236,7 +236,7 @@ RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ...@@ -236,7 +236,7 @@ RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv,
} }
} }
RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum internalFormat, GLsizei samples, bool depthStencil) RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum internalFormat, GLsizei samples)
{ {
mRenderer = Renderer11::makeRenderer11(renderer); mRenderer = Renderer11::makeRenderer11(renderer);
mTexture = NULL; mTexture = NULL;
...@@ -248,10 +248,10 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -248,10 +248,10 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
DXGI_FORMAT texFormat = gl_d3d11::GetTexFormat(internalFormat, clientVersion); DXGI_FORMAT texFormat = gl_d3d11::GetTexFormat(internalFormat, clientVersion);
DXGI_FORMAT srvFormat = gl_d3d11::GetSRVFormat(internalFormat, clientVersion); DXGI_FORMAT srvFormat = gl_d3d11::GetSRVFormat(internalFormat, clientVersion);
DXGI_FORMAT rtvFormat = gl_d3d11::GetSRVFormat(internalFormat, clientVersion); DXGI_FORMAT rtvFormat = gl_d3d11::GetRTVFormat(internalFormat, clientVersion);
DXGI_FORMAT dsvFormat = gl_d3d11::GetDSVFormat(internalFormat, clientVersion); DXGI_FORMAT dsvFormat = gl_d3d11::GetDSVFormat(internalFormat, clientVersion);
int supportedSamples = mRenderer->getNearestSupportedSamples(depthStencil ? dsvFormat : rtvFormat, samples); int supportedSamples = mRenderer->getNearestSupportedSamples(texFormat, samples);
if (supportedSamples < 0) if (supportedSamples < 0)
{ {
gl::error(GL_OUT_OF_MEMORY); gl::error(GL_OUT_OF_MEMORY);
...@@ -272,7 +272,9 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -272,7 +272,9 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
desc.CPUAccessFlags = 0; desc.CPUAccessFlags = 0;
desc.MiscFlags = 0; desc.MiscFlags = 0;
desc.BindFlags = (depthStencil ? D3D11_BIND_DEPTH_STENCIL : (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE)); desc.BindFlags = ((srvFormat != DXGI_FORMAT_UNKNOWN) ? D3D11_BIND_SHADER_RESOURCE : 0) |
((dsvFormat != DXGI_FORMAT_UNKNOWN) ? D3D11_BIND_DEPTH_STENCIL : 0) |
((rtvFormat != DXGI_FORMAT_UNKNOWN) ? D3D11_BIND_RENDER_TARGET : 0);
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
ID3D11Texture2D *texture = NULL; ID3D11Texture2D *texture = NULL;
...@@ -286,10 +288,26 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -286,10 +288,26 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
} }
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
if (depthStencil) if (srvFormat != DXGI_FORMAT_UNKNOWN)
{ {
ASSERT(dsvFormat != DXGI_FORMAT_UNKNOWN); D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = srvFormat;
srvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS;
srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = 1;
result = device->CreateShaderResourceView(mTexture, &srvDesc, &mShaderResource);
if (result == E_OUTOFMEMORY)
{
SafeRelease(mTexture);
gl::error(GL_OUT_OF_MEMORY);
return;
}
ASSERT(SUCCEEDED(result));
}
if (dsvFormat != DXGI_FORMAT_UNKNOWN)
{
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
dsvDesc.Format = dsvFormat; dsvDesc.Format = dsvFormat;
dsvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_DSV_DIMENSION_TEXTURE2D : D3D11_DSV_DIMENSION_TEXTURE2DMS; dsvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_DSV_DIMENSION_TEXTURE2D : D3D11_DSV_DIMENSION_TEXTURE2DMS;
...@@ -299,16 +317,16 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -299,16 +317,16 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
if (result == E_OUTOFMEMORY) if (result == E_OUTOFMEMORY)
{ {
mTexture->Release(); SafeRelease(mTexture);
mTexture = NULL; SafeRelease(mShaderResource);
gl::error(GL_OUT_OF_MEMORY); gl::error(GL_OUT_OF_MEMORY);
return;
} }
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
} }
else
{
ASSERT(rtvFormat != DXGI_FORMAT_UNKNOWN && srvFormat != DXGI_FORMAT_UNKNOWN);
if (rtvFormat != DXGI_FORMAT_UNKNOWN)
{
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = rtvFormat; rtvDesc.Format = rtvFormat;
rtvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_RTV_DIMENSION_TEXTURE2D : D3D11_RTV_DIMENSION_TEXTURE2DMS; rtvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_RTV_DIMENSION_TEXTURE2D : D3D11_RTV_DIMENSION_TEXTURE2DMS;
...@@ -317,26 +335,9 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -317,26 +335,9 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
if (result == E_OUTOFMEMORY) if (result == E_OUTOFMEMORY)
{ {
mTexture->Release(); SafeRelease(mTexture);
mTexture = NULL; SafeRelease(mShaderResource);
gl::error(GL_OUT_OF_MEMORY); SafeRelease(mDepthStencil);
return;
}
ASSERT(SUCCEEDED(result));
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = srvFormat;
srvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS;
srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = 1;
result = device->CreateShaderResourceView(mTexture, &srvDesc, &mShaderResource);
if (result == E_OUTOFMEMORY)
{
mTexture->Release();
mTexture = NULL;
mRenderTarget->Release();
mRenderTarget = NULL;
gl::error(GL_OUT_OF_MEMORY); gl::error(GL_OUT_OF_MEMORY);
return; return;
} }
......
...@@ -22,7 +22,7 @@ class RenderTarget11 : public RenderTarget ...@@ -22,7 +22,7 @@ class RenderTarget11 : public RenderTarget
public: public:
RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth); RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth);
RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth); RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth);
RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum internalFormat, GLsizei samples, bool depth); RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum internalFormat, GLsizei samples);
virtual ~RenderTarget11(); virtual ~RenderTarget11();
static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget); static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget);
......
...@@ -227,7 +227,7 @@ class Renderer ...@@ -227,7 +227,7 @@ class Renderer
// RenderTarget creation // RenderTarget creation
virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth) = 0; virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth) = 0;
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth) = 0; virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples) = 0;
// Shader operations // Shader operations
virtual ShaderExecutable *loadExecutable(const void *function, size_t length, rx::ShaderType type) = 0; virtual ShaderExecutable *loadExecutable(const void *function, size_t length, rx::ShaderType type) = 0;
......
...@@ -2855,9 +2855,9 @@ RenderTarget *Renderer11::createRenderTarget(SwapChain *swapChain, bool depth) ...@@ -2855,9 +2855,9 @@ RenderTarget *Renderer11::createRenderTarget(SwapChain *swapChain, bool depth)
return renderTarget; return renderTarget;
} }
RenderTarget *Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth) RenderTarget *Renderer11::createRenderTarget(int width, int height, GLenum format, GLsizei samples)
{ {
RenderTarget11 *renderTarget = new RenderTarget11(this, width, height, format, samples, depth); RenderTarget11 *renderTarget = new RenderTarget11(this, width, height, format, samples);
return renderTarget; return renderTarget;
} }
......
...@@ -171,7 +171,7 @@ class Renderer11 : public Renderer ...@@ -171,7 +171,7 @@ class Renderer11 : public Renderer
// RenderTarget creation // RenderTarget creation
virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth); virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth);
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth); virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples);
// Shader operations // Shader operations
virtual ShaderExecutable *loadExecutable(const void *function, size_t length, rx::ShaderType type); virtual ShaderExecutable *loadExecutable(const void *function, size_t length, rx::ShaderType type);
......
...@@ -2977,7 +2977,7 @@ RenderTarget *Renderer9::createRenderTarget(SwapChain *swapChain, bool depth) ...@@ -2977,7 +2977,7 @@ RenderTarget *Renderer9::createRenderTarget(SwapChain *swapChain, bool depth)
return renderTarget; return renderTarget;
} }
RenderTarget *Renderer9::createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth) RenderTarget *Renderer9::createRenderTarget(int width, int height, GLenum format, GLsizei samples)
{ {
RenderTarget9 *renderTarget = new RenderTarget9(this, width, height, format, samples); RenderTarget9 *renderTarget = new RenderTarget9(this, width, height, format, samples);
return renderTarget; return renderTarget;
......
...@@ -189,7 +189,7 @@ class Renderer9 : public Renderer ...@@ -189,7 +189,7 @@ class Renderer9 : public Renderer
// RenderTarget creation // RenderTarget creation
virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth); virtual RenderTarget *createRenderTarget(SwapChain *swapChain, bool depth);
virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples, bool depth); virtual RenderTarget *createRenderTarget(int width, int height, GLenum format, GLsizei samples);
// Shader operations // Shader operations
virtual ShaderExecutable *loadExecutable(const void *function, size_t length, rx::ShaderType type); virtual ShaderExecutable *loadExecutable(const void *function, size_t length, rx::ShaderType type);
......
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