Create ShaderResourceViews for TextureStorage objects

TRAC #22250 Author: Shannon Woods Signed-off-by: Nicolas Capens Signed-off-by: Daniel Koch git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1660 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 00c0d15f
......@@ -151,10 +151,12 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch
{
ID3D11Texture2D *surfaceTexture = swapchain->getOffscreenTexture();
mTexture = surfaceTexture;
mSRV = NULL;
D3D11_TEXTURE2D_DESC desc;
surfaceTexture->GetDesc(&desc);
initializeSRV(desc.Format, desc.MipLevels);
initializeRenderTarget(desc.Format, desc.Width, desc.Height);
}
......@@ -162,6 +164,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum
: TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, forceRenderable))
{
mTexture = NULL;
mSRV = NULL;
DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat);
// if the width or height is not positive this should be treated as an incomplete texture
// we handle that here by skipping the d3d texture creation
......@@ -195,6 +198,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum
}
}
initializeSRV(format, levels + mLodOffset);
initializeRenderTarget(format, width, height);
}
......@@ -220,6 +224,11 @@ ID3D11Texture2D *TextureStorage11_2D::getBaseTexture() const
return mTexture;
}
ID3D11ShaderResourceView *TextureStorage11_2D::getSRV() const
{
return mSRV;
}
void TextureStorage11_2D::generateMipmap(int level)
{
// TODO
......@@ -261,10 +270,35 @@ void TextureStorage11_2D::initializeRenderTarget(DXGI_FORMAT format, int width,
}
}
void TextureStorage11_2D::initializeSRV(DXGI_FORMAT format, int levels)
{
ASSERT(mSRV == NULL);
if (mTexture)
{
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.MipLevels = levels;
ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateShaderResourceView(mTexture, &srvDesc, &mSRV);
if (result == E_OUTOFMEMORY)
{
return error(GL_OUT_OF_MEMORY);
}
ASSERT(SUCCEEDED(result));
}
}
TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size)
: TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, forceRenderable))
{
mTexture = NULL;
mSRV = NULL;
DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat);
// if the size is not positive this should be treated as an incomplete texture
// we handle that here by skipping the d3d texture creation
......@@ -299,6 +333,7 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe
}
}
initializeSRV(format, levels + mLodOffset);
initializeRenderTarget(format, size);
}
......@@ -324,6 +359,11 @@ ID3D11Texture2D *TextureStorage11_Cube::getBaseTexture() const
return mTexture;
}
ID3D11ShaderResourceView *TextureStorage11_Cube::getSRV() const
{
return mSRV;
}
void TextureStorage11_Cube::generateMipmap(int face, int level)
{
// TODO
......@@ -374,4 +414,28 @@ void TextureStorage11_Cube::initializeRenderTarget(DXGI_FORMAT format, int size)
}
}
void TextureStorage11_Cube::initializeSRV(DXGI_FORMAT format, int levels)
{
ASSERT(mSRV == NULL);
if (mTexture)
{
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
srvDesc.TextureCube.MipLevels = levels;
srvDesc.TextureCube.MostDetailedMip = 0;
ID3D11Device *device = mRenderer->getDevice();
HRESULT result = device->CreateShaderResourceView(mTexture, &srvDesc, &mSRV);
if (result == E_OUTOFMEMORY)
{
return error(GL_OUT_OF_MEMORY);
}
ASSERT(SUCCEEDED(result));
}
}
}
\ No newline at end of file
......@@ -36,6 +36,7 @@ class TextureStorage11 : public TextureStorage
UINT getBindFlags() const;
virtual ID3D11Texture2D *getBaseTexture() const = 0;
virtual ID3D11ShaderResourceView *getSRV() const = 0;
virtual RenderTarget *getRenderTarget() const { return NULL; }
virtual RenderTarget *getRenderTarget(GLenum faceTarget) const { return NULL; }
virtual void generateMipmap(int level) {};
......@@ -70,14 +71,17 @@ class TextureStorage11_2D : public TextureStorage11
virtual RenderTarget *getRenderTarget() const;
virtual ID3D11Texture2D *getBaseTexture() const;
virtual ID3D11ShaderResourceView *getSRV() const;
virtual void generateMipmap(int level);
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D);
void initializeRenderTarget(DXGI_FORMAT format, int width, int height);
void initializeSRV(DXGI_FORMAT format, int levels);
ID3D11Texture2D *mTexture;
ID3D11ShaderResourceView *mSRV;
RenderTarget11 *mRenderTarget;
};
......@@ -91,14 +95,17 @@ class TextureStorage11_Cube : public TextureStorage11
virtual RenderTarget *getRenderTarget(GLenum faceTarget) const;
virtual ID3D11Texture2D *getBaseTexture() const;
virtual ID3D11ShaderResourceView *getSRV() const;
virtual void generateMipmap(int face, int level);
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube);
void initializeRenderTarget(DXGI_FORMAT format, int size);
void initializeSRV(DXGI_FORMAT format, int levels);
ID3D11Texture2D *mTexture;
ID3D11ShaderResourceView *mSRV;
RenderTarget11 *mRenderTarget[6];
};
......
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