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 ...@@ -151,10 +151,12 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch
{ {
ID3D11Texture2D *surfaceTexture = swapchain->getOffscreenTexture(); ID3D11Texture2D *surfaceTexture = swapchain->getOffscreenTexture();
mTexture = surfaceTexture; mTexture = surfaceTexture;
mSRV = NULL;
D3D11_TEXTURE2D_DESC desc; D3D11_TEXTURE2D_DESC desc;
surfaceTexture->GetDesc(&desc); surfaceTexture->GetDesc(&desc);
initializeSRV(desc.Format, desc.MipLevels);
initializeRenderTarget(desc.Format, desc.Width, desc.Height); initializeRenderTarget(desc.Format, desc.Width, desc.Height);
} }
...@@ -162,6 +164,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum ...@@ -162,6 +164,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum
: TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, forceRenderable)) : TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, forceRenderable))
{ {
mTexture = NULL; mTexture = NULL;
mSRV = NULL;
DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat); DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat);
// if the width or height is not positive this should be treated as an incomplete texture // 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 // we handle that here by skipping the d3d texture creation
...@@ -195,6 +198,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum ...@@ -195,6 +198,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum
} }
} }
initializeSRV(format, levels + mLodOffset);
initializeRenderTarget(format, width, height); initializeRenderTarget(format, width, height);
} }
...@@ -220,6 +224,11 @@ ID3D11Texture2D *TextureStorage11_2D::getBaseTexture() const ...@@ -220,6 +224,11 @@ ID3D11Texture2D *TextureStorage11_2D::getBaseTexture() const
return mTexture; return mTexture;
} }
ID3D11ShaderResourceView *TextureStorage11_2D::getSRV() const
{
return mSRV;
}
void TextureStorage11_2D::generateMipmap(int level) void TextureStorage11_2D::generateMipmap(int level)
{ {
// TODO // TODO
...@@ -261,10 +270,35 @@ void TextureStorage11_2D::initializeRenderTarget(DXGI_FORMAT format, int width, ...@@ -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_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size)
: TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, forceRenderable)) : TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, forceRenderable))
{ {
mTexture = NULL; mTexture = NULL;
mSRV = NULL;
DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat); DXGI_FORMAT format = gl_d3d11::ConvertTextureFormat(internalformat);
// if the size is not positive this should be treated as an incomplete texture // if the size is not positive this should be treated as an incomplete texture
// we handle that here by skipping the d3d texture creation // we handle that here by skipping the d3d texture creation
...@@ -299,6 +333,7 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe ...@@ -299,6 +333,7 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe
} }
} }
initializeSRV(format, levels + mLodOffset);
initializeRenderTarget(format, size); initializeRenderTarget(format, size);
} }
...@@ -324,6 +359,11 @@ ID3D11Texture2D *TextureStorage11_Cube::getBaseTexture() const ...@@ -324,6 +359,11 @@ ID3D11Texture2D *TextureStorage11_Cube::getBaseTexture() const
return mTexture; return mTexture;
} }
ID3D11ShaderResourceView *TextureStorage11_Cube::getSRV() const
{
return mSRV;
}
void TextureStorage11_Cube::generateMipmap(int face, int level) void TextureStorage11_Cube::generateMipmap(int face, int level)
{ {
// TODO // TODO
...@@ -374,4 +414,28 @@ void TextureStorage11_Cube::initializeRenderTarget(DXGI_FORMAT format, int size) ...@@ -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 ...@@ -36,6 +36,7 @@ class TextureStorage11 : public TextureStorage
UINT getBindFlags() const; UINT getBindFlags() const;
virtual ID3D11Texture2D *getBaseTexture() const = 0; virtual ID3D11Texture2D *getBaseTexture() const = 0;
virtual ID3D11ShaderResourceView *getSRV() const = 0;
virtual RenderTarget *getRenderTarget() const { return NULL; } virtual RenderTarget *getRenderTarget() const { return NULL; }
virtual RenderTarget *getRenderTarget(GLenum faceTarget) const { return NULL; } virtual RenderTarget *getRenderTarget(GLenum faceTarget) const { return NULL; }
virtual void generateMipmap(int level) {}; virtual void generateMipmap(int level) {};
...@@ -70,14 +71,17 @@ class TextureStorage11_2D : public TextureStorage11 ...@@ -70,14 +71,17 @@ class TextureStorage11_2D : public TextureStorage11
virtual RenderTarget *getRenderTarget() const; virtual RenderTarget *getRenderTarget() const;
virtual ID3D11Texture2D *getBaseTexture() const; virtual ID3D11Texture2D *getBaseTexture() const;
virtual ID3D11ShaderResourceView *getSRV() const;
virtual void generateMipmap(int level); virtual void generateMipmap(int level);
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D); DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D);
void initializeRenderTarget(DXGI_FORMAT format, int width, int height); void initializeRenderTarget(DXGI_FORMAT format, int width, int height);
void initializeSRV(DXGI_FORMAT format, int levels);
ID3D11Texture2D *mTexture; ID3D11Texture2D *mTexture;
ID3D11ShaderResourceView *mSRV;
RenderTarget11 *mRenderTarget; RenderTarget11 *mRenderTarget;
}; };
...@@ -91,14 +95,17 @@ class TextureStorage11_Cube : public TextureStorage11 ...@@ -91,14 +95,17 @@ class TextureStorage11_Cube : public TextureStorage11
virtual RenderTarget *getRenderTarget(GLenum faceTarget) const; virtual RenderTarget *getRenderTarget(GLenum faceTarget) const;
virtual ID3D11Texture2D *getBaseTexture() const; virtual ID3D11Texture2D *getBaseTexture() const;
virtual ID3D11ShaderResourceView *getSRV() const;
virtual void generateMipmap(int face, int level); virtual void generateMipmap(int face, int level);
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube); DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube);
void initializeRenderTarget(DXGI_FORMAT format, int size); void initializeRenderTarget(DXGI_FORMAT format, int size);
void initializeSRV(DXGI_FORMAT format, int levels);
ID3D11Texture2D *mTexture; ID3D11Texture2D *mTexture;
ID3D11ShaderResourceView *mSRV;
RenderTarget11 *mRenderTarget[6]; 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