Factor renderability check into GetTextureUsage

Trac #20875 Signed-off-by: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@1109 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent e32d5699
...@@ -95,15 +95,15 @@ static bool IsTextureFormatRenderable(D3DFORMAT format) ...@@ -95,15 +95,15 @@ static bool IsTextureFormatRenderable(D3DFORMAT format)
return false; return false;
} }
static inline DWORD GetTextureUsage(bool rendertarget, D3DFORMAT fmt) static inline DWORD GetTextureUsage(D3DFORMAT d3dfmt, GLenum glusage, bool forceRenderable)
{ {
DWORD usage = 0; DWORD d3dusage = 0;
if(rendertarget) if(forceRenderable || (IsTextureFormatRenderable(d3dfmt) && (glusage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE)))
{ {
usage |= D3DUSAGE_RENDERTARGET; d3dusage |= D3DUSAGE_RENDERTARGET;
} }
return usage; return d3dusage;
} }
Image::Image() Image::Image()
...@@ -2033,11 +2033,10 @@ void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL ...@@ -2033,11 +2033,10 @@ void Texture2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GL
GLenum format = gl::ExtractFormat(internalformat); GLenum format = gl::ExtractFormat(internalformat);
GLenum type = gl::ExtractType(internalformat); GLenum type = gl::ExtractType(internalformat);
D3DFORMAT d3dfmt = ConvertTextureFormatType(format, type); D3DFORMAT d3dfmt = ConvertTextureFormatType(format, type);
const bool renderTarget = IsTextureFormatRenderable(d3dfmt) && (mUsage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE); DWORD d3dusage = GetTextureUsage(d3dfmt, mUsage, false);
DWORD usage = GetTextureUsage(renderTarget, d3dfmt);
delete mTexStorage; delete mTexStorage;
mTexStorage = new TextureStorage2D(levels, d3dfmt, usage, width, height); mTexStorage = new TextureStorage2D(levels, d3dfmt, d3dusage, width, height);
mImmutable = true; mImmutable = true;
for (int level = 0; level < levels; level++) for (int level = 0; level < levels; level++)
...@@ -2196,12 +2195,11 @@ void Texture2D::createTexture() ...@@ -2196,12 +2195,11 @@ void Texture2D::createTexture()
GLsizei width = mImageArray[0].getWidth(); GLsizei width = mImageArray[0].getWidth();
GLsizei height = mImageArray[0].getHeight(); GLsizei height = mImageArray[0].getHeight();
GLint levels = creationLevels(width, height); GLint levels = creationLevels(width, height);
D3DFORMAT format = mImageArray[0].getD3DFormat(); D3DFORMAT d3dfmt = mImageArray[0].getD3DFormat();
const bool renderTarget = IsTextureFormatRenderable(format) && (mUsage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE); DWORD d3dusage = GetTextureUsage(d3dfmt, mUsage, false);
DWORD usage = GetTextureUsage(renderTarget, format);
delete mTexStorage; delete mTexStorage;
mTexStorage = new TextureStorage2D(levels, format, usage, width, height); mTexStorage = new TextureStorage2D(levels, d3dfmt, d3dusage, width, height);
if (mTexStorage->isManaged()) if (mTexStorage->isManaged())
{ {
...@@ -2241,10 +2239,10 @@ void Texture2D::convertToRenderTarget() ...@@ -2241,10 +2239,10 @@ void Texture2D::convertToRenderTarget()
GLsizei width = mImageArray[0].getWidth(); GLsizei width = mImageArray[0].getWidth();
GLsizei height = mImageArray[0].getHeight(); GLsizei height = mImageArray[0].getHeight();
GLint levels = creationLevels(width, height); GLint levels = creationLevels(width, height);
D3DFORMAT format = mImageArray[0].getD3DFormat(); D3DFORMAT d3dfmt = mImageArray[0].getD3DFormat();
DWORD usage = GetTextureUsage(true, format); DWORD d3dusage = GetTextureUsage(d3dfmt, GL_FRAMEBUFFER_ATTACHMENT_ANGLE, true);
newTexStorage = new TextureStorage2D(levels, format, usage, width, height); newTexStorage = new TextureStorage2D(levels, d3dfmt, d3dusage, width, height);
if (mTexStorage != NULL) if (mTexStorage != NULL)
{ {
...@@ -2724,12 +2722,11 @@ void TextureCubeMap::createTexture() ...@@ -2724,12 +2722,11 @@ void TextureCubeMap::createTexture()
{ {
GLsizei size = mImageArray[0][0].getWidth(); GLsizei size = mImageArray[0][0].getWidth();
GLint levels = creationLevels(size, 0); GLint levels = creationLevels(size, 0);
D3DFORMAT format = mImageArray[0][0].getD3DFormat(); D3DFORMAT d3dfmt = mImageArray[0][0].getD3DFormat();
const bool renderTarget = IsTextureFormatRenderable(format) && (mUsage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE); DWORD d3dusage = GetTextureUsage(d3dfmt, mUsage, false);
DWORD usage = GetTextureUsage(renderTarget, format);
delete mTexStorage; delete mTexStorage;
mTexStorage = new TextureStorageCubeMap(levels, format, usage, size); mTexStorage = new TextureStorageCubeMap(levels, d3dfmt, d3dusage, size);
if (mTexStorage->isManaged()) if (mTexStorage->isManaged())
{ {
...@@ -2773,10 +2770,10 @@ void TextureCubeMap::convertToRenderTarget() ...@@ -2773,10 +2770,10 @@ void TextureCubeMap::convertToRenderTarget()
{ {
GLsizei size = mImageArray[0][0].getWidth(); GLsizei size = mImageArray[0][0].getWidth();
GLint levels = creationLevels(size, 0); GLint levels = creationLevels(size, 0);
D3DFORMAT format = mImageArray[0][0].getD3DFormat(); D3DFORMAT d3dfmt = mImageArray[0][0].getD3DFormat();
DWORD usage = GetTextureUsage(true, format); DWORD d3dusage = GetTextureUsage(d3dfmt, GL_FRAMEBUFFER_ATTACHMENT_ANGLE, true);
newTexStorage = new TextureStorageCubeMap(levels, format, usage, size); newTexStorage = new TextureStorageCubeMap(levels, d3dfmt, d3dusage, size);
if (mTexStorage != NULL) if (mTexStorage != NULL)
{ {
...@@ -2961,11 +2958,10 @@ void TextureCubeMap::storage(GLsizei levels, GLenum internalformat, GLsizei size ...@@ -2961,11 +2958,10 @@ void TextureCubeMap::storage(GLsizei levels, GLenum internalformat, GLsizei size
GLenum format = gl::ExtractFormat(internalformat); GLenum format = gl::ExtractFormat(internalformat);
GLenum type = gl::ExtractType(internalformat); GLenum type = gl::ExtractType(internalformat);
D3DFORMAT d3dfmt = ConvertTextureFormatType(format, type); D3DFORMAT d3dfmt = ConvertTextureFormatType(format, type);
const bool renderTarget = IsTextureFormatRenderable(d3dfmt) && (mUsage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE); DWORD d3dusage = GetTextureUsage(d3dfmt, mUsage, false);
DWORD usage = GetTextureUsage(renderTarget, d3dfmt);
delete mTexStorage; delete mTexStorage;
mTexStorage = new TextureStorageCubeMap(levels, d3dfmt, usage, size); mTexStorage = new TextureStorageCubeMap(levels, d3dfmt, d3dusage, size);
mImmutable = true; mImmutable = true;
for (int level = 0; level < levels; level++) for (int level = 0; level < levels; level++)
......
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