Texture storage classes determine the bind flags through the new helper methods.

TRAC #22972 Signed-off-by: Jamie Madill Signed-off-by: Nicolas Capens Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2321 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 803be0a9
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "libGLESv2/renderer/RenderTarget11.h" #include "libGLESv2/renderer/RenderTarget11.h"
#include "libGLESv2/renderer/SwapChain11.h" #include "libGLESv2/renderer/SwapChain11.h"
#include "libGLESv2/renderer/renderer11_utils.h" #include "libGLESv2/renderer/renderer11_utils.h"
#include "libGLESv2/renderer/formatutils11.h"
#include "libGLESv2/utilities.h" #include "libGLESv2/utilities.h"
#include "libGLESv2/main.h" #include "libGLESv2/main.h"
...@@ -47,44 +48,25 @@ TextureStorage11 *TextureStorage11::makeTextureStorage11(TextureStorage *storage ...@@ -47,44 +48,25 @@ TextureStorage11 *TextureStorage11::makeTextureStorage11(TextureStorage *storage
return static_cast<TextureStorage11*>(storage); return static_cast<TextureStorage11*>(storage);
} }
DWORD TextureStorage11::GetTextureBindFlags(DXGI_FORMAT format, GLenum glusage, bool forceRenderable) DWORD TextureStorage11::GetTextureBindFlags(GLint internalFormat, GLuint clientVersion, GLenum glusage)
{ {
UINT bindFlags = D3D11_BIND_SHADER_RESOURCE; UINT bindFlags = 0;
if (d3d11::IsDepthStencilFormat(format)) if (gl_d3d11::GetSRVFormat(internalFormat, clientVersion) != DXGI_FORMAT_UNKNOWN)
{
bindFlags |= D3D11_BIND_SHADER_RESOURCE;
}
if (gl_d3d11::GetDSVFormat(internalFormat, clientVersion) != DXGI_FORMAT_UNKNOWN)
{ {
bindFlags |= D3D11_BIND_DEPTH_STENCIL; bindFlags |= D3D11_BIND_DEPTH_STENCIL;
} }
else if(forceRenderable || (TextureStorage11::IsTextureFormatRenderable(format) && (glusage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE))) if (gl_d3d11::GetRTVFormat(internalFormat, clientVersion) != DXGI_FORMAT_UNKNOWN &&
glusage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE)
{ {
bindFlags |= D3D11_BIND_RENDER_TARGET; bindFlags |= D3D11_BIND_RENDER_TARGET;
} }
return bindFlags;
}
bool TextureStorage11::IsTextureFormatRenderable(DXGI_FORMAT format) return bindFlags;
{
switch(format)
{
case DXGI_FORMAT_R8G8B8A8_UNORM:
case DXGI_FORMAT_A8_UNORM:
case DXGI_FORMAT_R32G32B32A32_FLOAT:
case DXGI_FORMAT_R32G32B32_FLOAT:
case DXGI_FORMAT_R16G16B16A16_FLOAT:
case DXGI_FORMAT_B8G8R8A8_UNORM:
case DXGI_FORMAT_R8_UNORM:
case DXGI_FORMAT_R8G8_UNORM:
case DXGI_FORMAT_R16_FLOAT:
case DXGI_FORMAT_R16G16_FLOAT:
return true;
case DXGI_FORMAT_BC1_UNORM:
case DXGI_FORMAT_BC2_UNORM:
case DXGI_FORMAT_BC3_UNORM:
return false;
default:
UNREACHABLE();
return false;
}
} }
UINT TextureStorage11::getBindFlags() const UINT TextureStorage11::getBindFlags() const
...@@ -230,7 +212,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch ...@@ -230,7 +212,7 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapch
} }
TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height) TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height)
: TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, forceRenderable)) : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderer->getCurrentClientVersion(), usage))
{ {
mTexture = NULL; mTexture = NULL;
for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (unsigned int i = 0; i < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
...@@ -457,7 +439,7 @@ void TextureStorage11_2D::generateMipmap(int level) ...@@ -457,7 +439,7 @@ void TextureStorage11_2D::generateMipmap(int level)
} }
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(internalformat, renderer->getCurrentClientVersion(), usage))
{ {
mTexture = NULL; mTexture = NULL;
for (unsigned int i = 0; i < 6; i++) for (unsigned int i = 0; i < 6; i++)
...@@ -692,7 +674,7 @@ void TextureStorage11_Cube::generateMipmap(int face, int level) ...@@ -692,7 +674,7 @@ void TextureStorage11_Cube::generateMipmap(int face, int level)
TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage,
GLsizei width, GLsizei height, GLsizei depth) GLsizei width, GLsizei height, GLsizei depth)
: TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, false)) : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderer->getCurrentClientVersion(), usage))
{ {
mTexture = NULL; mTexture = NULL;
...@@ -948,7 +930,7 @@ void TextureStorage11_3D::generateMipmap(int level) ...@@ -948,7 +930,7 @@ void TextureStorage11_3D::generateMipmap(int level)
TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, int levels, GLenum internalformat, GLenum usage,
GLsizei width, GLsizei height, GLsizei depth) GLsizei width, GLsizei height, GLsizei depth)
: TextureStorage11(renderer, GetTextureBindFlags(gl_d3d11::ConvertTextureFormat(internalformat), usage, false)) : TextureStorage11(renderer, GetTextureBindFlags(internalformat, renderer->getCurrentClientVersion(), usage))
{ {
mTexture = NULL; mTexture = NULL;
......
...@@ -29,8 +29,7 @@ class TextureStorage11 : public TextureStorage ...@@ -29,8 +29,7 @@ class TextureStorage11 : public TextureStorage
static TextureStorage11 *makeTextureStorage11(TextureStorage *storage); static TextureStorage11 *makeTextureStorage11(TextureStorage *storage);
static DWORD GetTextureBindFlags(DXGI_FORMAT d3dfmt, GLenum glusage, bool forceRenderable); static DWORD GetTextureBindFlags(GLint internalFormat, GLuint clientVersion, GLenum glusage);
static bool IsTextureFormatRenderable(DXGI_FORMAT format);
UINT getBindFlags() const; UINT getBindFlags() const;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "libGLESv2/renderer/SwapChain9.h" #include "libGLESv2/renderer/SwapChain9.h"
#include "libGLESv2/renderer/RenderTarget9.h" #include "libGLESv2/renderer/RenderTarget9.h"
#include "libGLESv2/renderer/renderer9_utils.h" #include "libGLESv2/renderer/renderer9_utils.h"
#include "libGLESv2/renderer/formatutils9.h"
#include "libGLESv2/Texture.h" #include "libGLESv2/Texture.h"
namespace rx namespace rx
...@@ -37,46 +38,27 @@ TextureStorage9 *TextureStorage9::makeTextureStorage9(TextureStorage *storage) ...@@ -37,46 +38,27 @@ TextureStorage9 *TextureStorage9::makeTextureStorage9(TextureStorage *storage)
return static_cast<TextureStorage9*>(storage); return static_cast<TextureStorage9*>(storage);
} }
DWORD TextureStorage9::GetTextureUsage(D3DFORMAT d3dfmt, GLenum glusage, bool forceRenderable) DWORD TextureStorage9::GetTextureUsage(GLenum internalformat, Renderer9 *renderer, GLenum glusage, bool forceRenderable)
{ {
GLuint clientVersion = renderer->getCurrentClientVersion();
DWORD d3dusage = 0; DWORD d3dusage = 0;
if (d3dfmt == D3DFMT_INTZ) if (gl::GetDepthBits(internalformat, clientVersion) > 0 ||
gl::GetStencilBits(internalformat, clientVersion) > 0)
{ {
d3dusage |= D3DUSAGE_DEPTHSTENCIL; d3dusage |= D3DUSAGE_DEPTHSTENCIL;
} }
else if(forceRenderable || (TextureStorage9::IsTextureFormatRenderable(d3dfmt) && (glusage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE))) else if (forceRenderable ||
(gl_d3d9::GetRenderFormat(internalformat, renderer) != D3DFMT_UNKNOWN &&
glusage == GL_FRAMEBUFFER_ATTACHMENT_ANGLE))
{ {
d3dusage |= D3DUSAGE_RENDERTARGET; d3dusage |= D3DUSAGE_RENDERTARGET;
} }
return d3dusage; return d3dusage;
} }
bool TextureStorage9::IsTextureFormatRenderable(D3DFORMAT format)
{
if (format == D3DFMT_INTZ)
{
return true;
}
switch(format)
{
case D3DFMT_L8:
case D3DFMT_A8L8:
case D3DFMT_DXT1:
case D3DFMT_DXT3:
case D3DFMT_DXT5:
return false;
case D3DFMT_A8R8G8B8:
case D3DFMT_X8R8G8B8:
case D3DFMT_A16B16G16R16F:
case D3DFMT_A32B32G32R32F:
return true;
default:
UNREACHABLE();
}
return false;
}
bool TextureStorage9::isRenderTarget() const bool TextureStorage9::isRenderTarget() const
{ {
...@@ -118,7 +100,7 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain ...@@ -118,7 +100,7 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, SwapChain9 *swapchain
} }
TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height) TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height)
: TextureStorage9(renderer, GetTextureUsage(Renderer9::makeRenderer9(renderer)->ConvertTextureInternalFormat(internalformat), usage, forceRenderable)) : TextureStorage9(renderer, GetTextureUsage(internalformat, Renderer9::makeRenderer9(renderer), usage, forceRenderable))
{ {
mTexture = NULL; mTexture = NULL;
mRenderTarget = NULL; mRenderTarget = NULL;
...@@ -215,7 +197,7 @@ void TextureStorage9_2D::initializeRenderTarget() ...@@ -215,7 +197,7 @@ void TextureStorage9_2D::initializeRenderTarget()
} }
TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size) TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size)
: TextureStorage9(renderer, GetTextureUsage(Renderer9::makeRenderer9(renderer)->ConvertTextureInternalFormat(internalformat), usage, forceRenderable)) : TextureStorage9(renderer, GetTextureUsage(internalformat, Renderer9::makeRenderer9(renderer), usage, forceRenderable))
{ {
mTexture = NULL; mTexture = NULL;
for (int i = 0; i < 6; ++i) for (int i = 0; i < 6; ++i)
......
...@@ -30,8 +30,7 @@ class TextureStorage9 : public TextureStorage ...@@ -30,8 +30,7 @@ class TextureStorage9 : public TextureStorage
static TextureStorage9 *makeTextureStorage9(TextureStorage *storage); static TextureStorage9 *makeTextureStorage9(TextureStorage *storage);
static DWORD GetTextureUsage(D3DFORMAT d3dfmt, GLenum glusage, bool forceRenderable); static DWORD GetTextureUsage(GLenum internalformat, Renderer9 *renderer, GLenum glusage, bool forceRenderable);
static bool IsTextureFormatRenderable(D3DFORMAT format);
D3DPOOL getPool() const; D3DPOOL getPool() const;
DWORD getUsage() const; DWORD getUsage() const;
......
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