Added a texture object to RenderTarget11.

TRAC #22416 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1867 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent d67f9ce0
...@@ -16,47 +16,14 @@ ...@@ -16,47 +16,14 @@
namespace rx namespace rx
{ {
static ID3D11Texture2D *getTextureResource(ID3D11View *view) static unsigned int getRTVSubresourceIndex(ID3D11Texture2D *texture, ID3D11RenderTargetView *view)
{
ID3D11Resource *textureResource = NULL;
view->GetResource(&textureResource);
if (!textureResource)
{
return NULL;
}
ID3D11Texture2D *texture = NULL;
HRESULT result = textureResource->QueryInterface(IID_ID3D11Texture2D, (void**)&texture);
textureResource->Release();
textureResource = NULL;
if (FAILED(result))
{
return NULL;
}
return texture;
}
static unsigned int getRTVSubresourceIndex(ID3D11RenderTargetView *view)
{ {
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
view->GetDesc(&rtvDesc); view->GetDesc(&rtvDesc);
ID3D11Texture2D *texture = getTextureResource(view);
if (!texture)
{
ERR("Failed to extract the ID3D11Texture2D from the render target view.");
return 0;
}
D3D11_TEXTURE2D_DESC texDesc; D3D11_TEXTURE2D_DESC texDesc;
texture->GetDesc(&texDesc); texture->GetDesc(&texDesc);
texture->Release();
texture = NULL;
unsigned int mipSlice = 0; unsigned int mipSlice = 0;
unsigned int arraySlice = 0; unsigned int arraySlice = 0;
unsigned int mipLevels = texDesc.MipLevels; unsigned int mipLevels = texDesc.MipLevels;
...@@ -111,24 +78,14 @@ static unsigned int getRTVSubresourceIndex(ID3D11RenderTargetView *view) ...@@ -111,24 +78,14 @@ static unsigned int getRTVSubresourceIndex(ID3D11RenderTargetView *view)
return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels); return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels);
} }
static unsigned int getDSVSubresourceIndex(ID3D11DepthStencilView *view) static unsigned int getDSVSubresourceIndex(ID3D11Texture2D *texture, ID3D11DepthStencilView *view)
{ {
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
view->GetDesc(&dsvDesc); view->GetDesc(&dsvDesc);
ID3D11Texture2D *texture = getTextureResource(view);
if (!texture)
{
ERR("Failed to extract the ID3D11Texture2D from the depth stencil view.");
return 0;
}
D3D11_TEXTURE2D_DESC texDesc; D3D11_TEXTURE2D_DESC texDesc;
texture->GetDesc(&texDesc); texture->GetDesc(&texDesc);
texture->Release();
texture = NULL;
unsigned int mipSlice = 0; unsigned int mipSlice = 0;
unsigned int arraySlice = 0; unsigned int arraySlice = 0;
unsigned int mipLevels = texDesc.MipLevels; unsigned int mipLevels = texDesc.MipLevels;
...@@ -177,53 +134,63 @@ static unsigned int getDSVSubresourceIndex(ID3D11DepthStencilView *view) ...@@ -177,53 +134,63 @@ static unsigned int getDSVSubresourceIndex(ID3D11DepthStencilView *view)
return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels); return D3D11CalcSubresource(mipSlice, arraySlice, mipLevels);
} }
RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height) RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11Texture2D *tex, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height)
{ {
mRenderer = Renderer11::makeRenderer11(renderer); mRenderer = Renderer11::makeRenderer11(renderer);
mTexture = tex;
mRenderTarget = rtv; mRenderTarget = rtv;
mDepthStencil = NULL; mDepthStencil = NULL;
mShaderResource = srv; mShaderResource = srv;
if (mRenderTarget) if (mRenderTarget && mTexture)
{ {
D3D11_RENDER_TARGET_VIEW_DESC desc; D3D11_RENDER_TARGET_VIEW_DESC desc;
mRenderTarget->GetDesc(&desc); mRenderTarget->GetDesc(&desc);
mSubresourceIndex = getRTVSubresourceIndex(mRenderTarget); D3D11_TEXTURE2D_DESC texDesc;
mTexture->GetDesc(&texDesc);
mSubresourceIndex = getRTVSubresourceIndex(mTexture, mRenderTarget);
mWidth = width; mWidth = width;
mHeight = height; mHeight = height;
mSamples = (texDesc.SampleDesc.Count > 1) ? texDesc.SampleDesc.Count : 0;
mInternalFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format); mInternalFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format);
mActualFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format); mActualFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format);
mSamples = 1; // TEMP?
} }
} }
RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height) RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ID3D11Texture2D *tex, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height)
{ {
mRenderer = Renderer11::makeRenderer11(renderer); mRenderer = Renderer11::makeRenderer11(renderer);
mTexture = tex;
mRenderTarget = NULL; mRenderTarget = NULL;
mDepthStencil = dsv; mDepthStencil = dsv;
mShaderResource = srv; mShaderResource = srv;
mTexture = tex;
if (mDepthStencil) if (mDepthStencil && mTexture)
{ {
D3D11_DEPTH_STENCIL_VIEW_DESC desc; D3D11_DEPTH_STENCIL_VIEW_DESC desc;
mDepthStencil->GetDesc(&desc); mDepthStencil->GetDesc(&desc);
mSubresourceIndex = getDSVSubresourceIndex(mDepthStencil); D3D11_TEXTURE2D_DESC texDesc;
mTexture->GetDesc(&texDesc);
mSubresourceIndex = getDSVSubresourceIndex(mTexture, mDepthStencil);
mWidth = width; mWidth = width;
mHeight = height; mHeight = height;
mSamples = (texDesc.SampleDesc.Count > 1) ? texDesc.SampleDesc.Count : 0;
mInternalFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format); mInternalFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format);
mActualFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format); mActualFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format);
mSamples = 1; // TEMP?
} }
} }
RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples, bool depth) RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples, bool depth)
{ {
mRenderer = Renderer11::makeRenderer11(renderer); mRenderer = Renderer11::makeRenderer11(renderer);
mTexture = NULL;
mRenderTarget = NULL; mRenderTarget = NULL;
mDepthStencil = NULL; mDepthStencil = NULL;
mShaderResource = NULL; mShaderResource = NULL;
...@@ -234,12 +201,11 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -234,12 +201,11 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
if (supportedSamples < 0) if (supportedSamples < 0)
{ {
gl::error(GL_OUT_OF_MEMORY); gl::error(GL_OUT_OF_MEMORY);
return; return;
} }
HRESULT result = E_FAIL; HRESULT result = D3DERR_INVALIDCALL;
if (width > 0 && height > 0) if (width > 0 && height > 0)
{ {
// Create texture resource // Create texture resource
...@@ -255,10 +221,9 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -255,10 +221,9 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
desc.CPUAccessFlags = 0; desc.CPUAccessFlags = 0;
desc.MiscFlags = 0; desc.MiscFlags = 0;
desc.BindFlags = (depth ? D3D11_BIND_DEPTH_STENCIL : (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE)); desc.BindFlags = (depth ? D3D11_BIND_DEPTH_STENCIL : (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE));
ID3D11Texture2D *rtTexture = NULL;
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateTexture2D(&desc, NULL, &rtTexture); HRESULT result = device->CreateTexture2D(&desc, NULL, &mTexture);
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY) if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
{ {
...@@ -274,13 +239,13 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -274,13 +239,13 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
dsvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_DSV_DIMENSION_TEXTURE2D : D3D11_DSV_DIMENSION_TEXTURE2DMS; dsvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_DSV_DIMENSION_TEXTURE2D : D3D11_DSV_DIMENSION_TEXTURE2DMS;
dsvDesc.Texture2D.MipSlice = 0; dsvDesc.Texture2D.MipSlice = 0;
dsvDesc.Flags = 0; dsvDesc.Flags = 0;
result = device->CreateDepthStencilView(rtTexture, &dsvDesc, &mDepthStencil); result = device->CreateDepthStencilView(mTexture, &dsvDesc, &mDepthStencil);
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY) if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
{ {
rtTexture->Release(); mTexture->Release();
mTexture = NULL;
gl::error(GL_OUT_OF_MEMORY); gl::error(GL_OUT_OF_MEMORY);
return;
} }
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
} }
...@@ -290,11 +255,12 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -290,11 +255,12 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
rtvDesc.Format = requestedFormat; rtvDesc.Format = requestedFormat;
rtvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_RTV_DIMENSION_TEXTURE2D : D3D11_RTV_DIMENSION_TEXTURE2DMS; rtvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_RTV_DIMENSION_TEXTURE2D : D3D11_RTV_DIMENSION_TEXTURE2DMS;
rtvDesc.Texture2D.MipSlice = 0; rtvDesc.Texture2D.MipSlice = 0;
result = device->CreateRenderTargetView(rtTexture, &rtvDesc, &mRenderTarget); result = device->CreateRenderTargetView(mTexture, &rtvDesc, &mRenderTarget);
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY) if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
{ {
rtTexture->Release(); mTexture->Release();
mTexture = NULL;
gl::error(GL_OUT_OF_MEMORY); gl::error(GL_OUT_OF_MEMORY);
return; return;
} }
...@@ -305,12 +271,14 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -305,12 +271,14 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
srvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS; srvDesc.ViewDimension = (supportedSamples == 0) ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS;
srvDesc.Texture2D.MostDetailedMip = 0; srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = 1; srvDesc.Texture2D.MipLevels = 1;
result = device->CreateShaderResourceView(rtTexture, &srvDesc, &mShaderResource); result = device->CreateShaderResourceView(mTexture, &srvDesc, &mShaderResource);
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY) if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
{ {
rtTexture->Release(); mTexture->Release();
mTexture = NULL;
mRenderTarget->Release(); mRenderTarget->Release();
mRenderTarget = NULL;
gl::error(GL_OUT_OF_MEMORY); gl::error(GL_OUT_OF_MEMORY);
return; return;
} }
...@@ -328,6 +296,12 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -328,6 +296,12 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
RenderTarget11::~RenderTarget11() RenderTarget11::~RenderTarget11()
{ {
if (mTexture)
{
mTexture->Release();
mTexture = NULL;
}
if (mRenderTarget) if (mRenderTarget)
{ {
mRenderTarget->Release(); mRenderTarget->Release();
...@@ -353,6 +327,16 @@ RenderTarget11 *RenderTarget11::makeRenderTarget11(RenderTarget *target) ...@@ -353,6 +327,16 @@ RenderTarget11 *RenderTarget11::makeRenderTarget11(RenderTarget *target)
return static_cast<rx::RenderTarget11*>(target); return static_cast<rx::RenderTarget11*>(target);
} }
ID3D11Texture2D *RenderTarget11::getTexture() const
{
if (mTexture)
{
mTexture->AddRef();
}
return mTexture;
}
// Adds reference, caller must call Release // Adds reference, caller must call Release
ID3D11RenderTargetView *RenderTarget11::getRenderTargetView() const ID3D11RenderTargetView *RenderTarget11::getRenderTargetView() const
{ {
......
...@@ -22,14 +22,17 @@ class Renderer11; ...@@ -22,14 +22,17 @@ class Renderer11;
class RenderTarget11 : public RenderTarget class RenderTarget11 : public RenderTarget
{ {
public: public:
RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height); RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11Texture2D *tex, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height);
RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height); RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ID3D11Texture2D *tex, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height);
RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples, bool depth); RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples, bool depth);
virtual ~RenderTarget11(); virtual ~RenderTarget11();
static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget); static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget);
// Adds reference, caller must call Release // Adds reference, caller must call Release
ID3D11Texture2D *getTexture() const;
// Adds reference, caller must call Release
ID3D11RenderTargetView *getRenderTargetView() const; ID3D11RenderTargetView *getRenderTargetView() const;
// Adds reference, caller must call Release // Adds reference, caller must call Release
...@@ -44,6 +47,7 @@ class RenderTarget11 : public RenderTarget ...@@ -44,6 +47,7 @@ class RenderTarget11 : public RenderTarget
DISALLOW_COPY_AND_ASSIGN(RenderTarget11); DISALLOW_COPY_AND_ASSIGN(RenderTarget11);
unsigned int mSubresourceIndex; unsigned int mSubresourceIndex;
ID3D11Texture2D *mTexture;
ID3D11RenderTargetView *mRenderTarget; ID3D11RenderTargetView *mRenderTarget;
ID3D11DepthStencilView *mDepthStencil; ID3D11DepthStencilView *mDepthStencil;
ID3D11ShaderResourceView *mShaderResource; ID3D11ShaderResourceView *mShaderResource;
......
...@@ -2568,12 +2568,14 @@ RenderTarget *Renderer11::createRenderTarget(SwapChain *swapChain, bool depth) ...@@ -2568,12 +2568,14 @@ RenderTarget *Renderer11::createRenderTarget(SwapChain *swapChain, bool depth)
RenderTarget11 *renderTarget = NULL; RenderTarget11 *renderTarget = NULL;
if (depth) if (depth)
{ {
renderTarget = new RenderTarget11(this, swapChain11->getDepthStencil(), NULL, renderTarget = new RenderTarget11(this, swapChain11->getDepthStencil(),
swapChain11->getDepthStencilTexture(), NULL,
swapChain11->getWidth(), swapChain11->getHeight()); swapChain11->getWidth(), swapChain11->getHeight());
} }
else else
{ {
renderTarget = new RenderTarget11(this, swapChain11->getRenderTarget(), renderTarget = new RenderTarget11(this, swapChain11->getRenderTarget(),
swapChain11->getOffscreenTexture(),
swapChain11->getRenderTargetShaderResource(), swapChain11->getRenderTargetShaderResource(),
swapChain11->getWidth(), swapChain11->getHeight()); swapChain11->getWidth(), swapChain11->getHeight());
} }
......
...@@ -682,6 +682,16 @@ ID3D11DepthStencilView *SwapChain11::getDepthStencil() ...@@ -682,6 +682,16 @@ ID3D11DepthStencilView *SwapChain11::getDepthStencil()
return mDepthStencilDSView; return mDepthStencilDSView;
} }
ID3D11Texture2D *SwapChain11::getDepthStencilTexture()
{
if (mDepthStencilTexture)
{
mDepthStencilTexture->AddRef();
}
return mDepthStencilTexture;
}
SwapChain11 *SwapChain11::makeSwapChain11(SwapChain *swapChain) SwapChain11 *SwapChain11::makeSwapChain11(SwapChain *swapChain)
{ {
ASSERT(HAS_DYNAMIC_TYPE(rx::SwapChain11*, swapChain)); ASSERT(HAS_DYNAMIC_TYPE(rx::SwapChain11*, swapChain));
......
...@@ -32,6 +32,7 @@ class SwapChain11 : public SwapChain ...@@ -32,6 +32,7 @@ class SwapChain11 : public SwapChain
virtual ID3D11RenderTargetView *getRenderTarget(); virtual ID3D11RenderTargetView *getRenderTarget();
virtual ID3D11ShaderResourceView *getRenderTargetShaderResource(); virtual ID3D11ShaderResourceView *getRenderTargetShaderResource();
virtual ID3D11Texture2D *getDepthStencilTexture();
virtual ID3D11DepthStencilView *getDepthStencil(); virtual ID3D11DepthStencilView *getDepthStencil();
EGLint getWidth() const { return mWidth; } EGLint getWidth() const { return mWidth; }
......
...@@ -324,7 +324,11 @@ RenderTarget *TextureStorage11_2D::getRenderTarget(int level) ...@@ -324,7 +324,11 @@ RenderTarget *TextureStorage11_2D::getRenderTarget(int level)
} }
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
mRenderTarget[level] = new RenderTarget11(mRenderer, rtv, srv, // RenderTarget11 expects to be the owner of the resources it is given but TextureStorage11
// also needs to keep a reference to the texture.
mTexture->AddRef();
mRenderTarget[level] = new RenderTarget11(mRenderer, rtv, mTexture, srv,
std::max(mTextureWidth >> level, 1U), std::max(mTextureWidth >> level, 1U),
std::max(mTextureHeight >> level, 1U)); std::max(mTextureHeight >> level, 1U));
} }
...@@ -509,7 +513,11 @@ RenderTarget *TextureStorage11_Cube::getRenderTarget(GLenum faceTarget, int leve ...@@ -509,7 +513,11 @@ RenderTarget *TextureStorage11_Cube::getRenderTarget(GLenum faceTarget, int leve
} }
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
mRenderTarget[faceIdx][level] = new RenderTarget11(mRenderer, rtv, srv, // RenderTarget11 expects to be the owner of the resources it is given but TextureStorage11
// also needs to keep a reference to the texture.
mTexture->AddRef();
mRenderTarget[faceIdx][level] = new RenderTarget11(mRenderer, rtv, mTexture, srv,
std::max(mTextureWidth >> level, 1U), std::max(mTextureWidth >> level, 1U),
std::max(mTextureHeight >> level, 1U)); std::max(mTextureHeight >> level, 1U));
} }
......
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