Updated the RenderTarget and TextureStorage classes to use new texture format functions.

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@2322 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent adc56358
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "libGLESv2/renderer/Renderer11.h" #include "libGLESv2/renderer/Renderer11.h"
#include "libGLESv2/renderer/renderer11_utils.h" #include "libGLESv2/renderer/renderer11_utils.h"
#include "libGLESv2/renderer/formatutils11.h"
#include "libGLESv2/main.h" #include "libGLESv2/main.h"
namespace rx namespace rx
...@@ -201,8 +202,8 @@ RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ...@@ -201,8 +202,8 @@ RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv,
mDepth = depth; mDepth = depth;
mSamples = samples; mSamples = samples;
mInternalFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format); mInternalFormat = d3d11_gl::GetInternalFormat(desc.Format);
mActualFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format); mActualFormat = d3d11_gl::GetInternalFormat(desc.Format);
} }
} }
...@@ -230,12 +231,12 @@ RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ...@@ -230,12 +231,12 @@ RenderTarget11::RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv,
mDepth = depth; mDepth = depth;
mSamples = samples; mSamples = samples;
mInternalFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format); mInternalFormat = d3d11_gl::GetInternalFormat(desc.Format);
mActualFormat = d3d11_gl::ConvertTextureInternalFormat(desc.Format); mActualFormat = d3d11_gl::GetInternalFormat(desc.Format);
} }
} }
RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples, bool depthStencil) RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum internalFormat, GLsizei samples, bool depthStencil)
{ {
mRenderer = Renderer11::makeRenderer11(renderer); mRenderer = Renderer11::makeRenderer11(renderer);
mTexture = NULL; mTexture = NULL;
...@@ -243,9 +244,14 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -243,9 +244,14 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
mDepthStencil = NULL; mDepthStencil = NULL;
mShaderResource = NULL; mShaderResource = NULL;
DXGI_FORMAT requestedFormat = gl_d3d11::ConvertRenderbufferFormat(format); GLuint clientVersion = mRenderer->getCurrentClientVersion();
int supportedSamples = mRenderer->getNearestSupportedSamples(requestedFormat, samples); DXGI_FORMAT texFormat = gl_d3d11::GetTexFormat(internalFormat, clientVersion);
DXGI_FORMAT srvFormat = gl_d3d11::GetSRVFormat(internalFormat, clientVersion);
DXGI_FORMAT rtvFormat = gl_d3d11::GetSRVFormat(internalFormat, clientVersion);
DXGI_FORMAT dsvFormat = gl_d3d11::GetDSVFormat(internalFormat, clientVersion);
int supportedSamples = mRenderer->getNearestSupportedSamples(depthStencil ? dsvFormat : rtvFormat, samples);
if (supportedSamples < 0) if (supportedSamples < 0)
{ {
gl::error(GL_OUT_OF_MEMORY); gl::error(GL_OUT_OF_MEMORY);
...@@ -260,7 +266,7 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -260,7 +266,7 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
desc.Height = height; desc.Height = height;
desc.MipLevels = 1; desc.MipLevels = 1;
desc.ArraySize = 1; desc.ArraySize = 1;
desc.Format = requestedFormat; desc.Format = texFormat;
desc.SampleDesc.Count = (supportedSamples == 0) ? 1 : supportedSamples; desc.SampleDesc.Count = (supportedSamples == 0) ? 1 : supportedSamples;
desc.SampleDesc.Quality = 0; desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT; desc.Usage = D3D11_USAGE_DEFAULT;
...@@ -282,8 +288,10 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -282,8 +288,10 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
if (depthStencil) if (depthStencil)
{ {
ASSERT(dsvFormat != DXGI_FORMAT_UNKNOWN);
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc; D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
dsvDesc.Format = requestedFormat; dsvDesc.Format = dsvFormat;
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;
...@@ -299,8 +307,10 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -299,8 +307,10 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
} }
else else
{ {
ASSERT(rtvFormat != DXGI_FORMAT_UNKNOWN && srvFormat != DXGI_FORMAT_UNKNOWN);
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc; D3D11_RENDER_TARGET_VIEW_DESC rtvDesc;
rtvDesc.Format = requestedFormat; rtvDesc.Format = rtvFormat;
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(mTexture, &rtvDesc, &mRenderTarget); result = device->CreateRenderTargetView(mTexture, &rtvDesc, &mRenderTarget);
...@@ -315,7 +325,7 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -315,7 +325,7 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
ASSERT(SUCCEEDED(result)); ASSERT(SUCCEEDED(result));
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = requestedFormat; srvDesc.Format = srvFormat;
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;
...@@ -337,9 +347,9 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height ...@@ -337,9 +347,9 @@ RenderTarget11::RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height
mWidth = width; mWidth = width;
mHeight = height; mHeight = height;
mDepth = 1; mDepth = 1;
mInternalFormat = format; mInternalFormat = internalFormat;
mSamples = supportedSamples; mSamples = supportedSamples;
mActualFormat = d3d11_gl::ConvertTextureInternalFormat(requestedFormat); mActualFormat = d3d11_gl::GetInternalFormat(texFormat);
mSubresourceIndex = D3D11CalcSubresource(0, 0, 1); mSubresourceIndex = D3D11CalcSubresource(0, 0, 1);
} }
......
...@@ -22,7 +22,7 @@ class RenderTarget11 : public RenderTarget ...@@ -22,7 +22,7 @@ class RenderTarget11 : public RenderTarget
public: public:
RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth); RenderTarget11(Renderer *renderer, ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth);
RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth); RenderTarget11(Renderer *renderer, ID3D11DepthStencilView *dsv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv, GLsizei width, GLsizei height, GLsizei depth);
RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples, bool depth); RenderTarget11(Renderer *renderer, GLsizei width, GLsizei height, GLenum internalFormat, GLsizei samples, bool depth);
virtual ~RenderTarget11(); virtual ~RenderTarget11();
static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget); static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget);
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "libGLESv2/renderer/Renderer9.h" #include "libGLESv2/renderer/Renderer9.h"
#include "libGLESv2/renderer/renderer9_utils.h" #include "libGLESv2/renderer/renderer9_utils.h"
#include "libGLESv2/renderer/formatutils9.h"
#include "libGLESv2/main.h" #include "libGLESv2/main.h"
namespace rx namespace rx
...@@ -31,19 +32,19 @@ RenderTarget9::RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface) ...@@ -31,19 +32,19 @@ RenderTarget9::RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface)
mHeight = description.Height; mHeight = description.Height;
mDepth = 1; mDepth = 1;
mInternalFormat = d3d9_gl::GetEquivalentFormat(description.Format); mInternalFormat = d3d9_gl::GetInternalFormat(description.Format);
mActualFormat = d3d9_gl::GetEquivalentFormat(description.Format); mActualFormat = d3d9_gl::GetInternalFormat(description.Format);
mSamples = d3d9_gl::GetSamplesFromMultisampleType(description.MultiSampleType); mSamples = d3d9_gl::GetSamplesCount(description.MultiSampleType);
} }
} }
RenderTarget9::RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples) RenderTarget9::RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height, GLenum internalFormat, GLsizei samples)
{ {
mRenderer = Renderer9::makeRenderer9(renderer); mRenderer = Renderer9::makeRenderer9(renderer);
mRenderTarget = NULL; mRenderTarget = NULL;
D3DFORMAT requestedFormat = gl_d3d9::ConvertRenderbufferFormat(format); D3DFORMAT renderFormat = gl_d3d9::GetRenderFormat(internalFormat, mRenderer);
int supportedSamples = mRenderer->getNearestSupportedSamples(requestedFormat, samples); int supportedSamples = mRenderer->getNearestSupportedSamples(renderFormat, samples);
if (supportedSamples == -1) if (supportedSamples == -1)
{ {
...@@ -54,18 +55,23 @@ RenderTarget9::RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height, ...@@ -54,18 +55,23 @@ RenderTarget9::RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height,
HRESULT result = D3DERR_INVALIDCALL; HRESULT result = D3DERR_INVALIDCALL;
GLuint clientVersion = mRenderer->getCurrentClientVersion();
if (width > 0 && height > 0) if (width > 0 && height > 0)
{ {
if (requestedFormat == D3DFMT_D24S8) IDirect3DDevice9 *device = mRenderer->getDevice();
if (gl::GetDepthBits(internalFormat, clientVersion) > 0 ||
gl::GetStencilBits(internalFormat, clientVersion) > 0)
{ {
result = mRenderer->getDevice()->CreateDepthStencilSurface(width, height, requestedFormat, result = device->CreateDepthStencilSurface(width, height, renderFormat,
gl_d3d9::GetMultisampleTypeFromSamples(supportedSamples), gl_d3d9::GetMultisampleType(supportedSamples),
0, FALSE, &mRenderTarget, NULL); 0, FALSE, &mRenderTarget, NULL);
} }
else else
{ {
result = mRenderer->getDevice()->CreateRenderTarget(width, height, requestedFormat, result = device->CreateRenderTarget(width, height, renderFormat,
gl_d3d9::GetMultisampleTypeFromSamples(supportedSamples), gl_d3d9::GetMultisampleType(supportedSamples),
0, FALSE, &mRenderTarget, NULL); 0, FALSE, &mRenderTarget, NULL);
} }
...@@ -82,9 +88,9 @@ RenderTarget9::RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height, ...@@ -82,9 +88,9 @@ RenderTarget9::RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height,
mWidth = width; mWidth = width;
mHeight = height; mHeight = height;
mDepth = 1; mDepth = 1;
mInternalFormat = format; mInternalFormat = internalFormat;
mSamples = supportedSamples; mSamples = supportedSamples;
mActualFormat = d3d9_gl::GetEquivalentFormat(requestedFormat); mActualFormat = d3d9_gl::GetInternalFormat(renderFormat);
} }
RenderTarget9::~RenderTarget9() RenderTarget9::~RenderTarget9()
......
...@@ -21,7 +21,7 @@ class RenderTarget9 : public RenderTarget ...@@ -21,7 +21,7 @@ class RenderTarget9 : public RenderTarget
{ {
public: public:
RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface); RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface);
RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples); RenderTarget9(Renderer *renderer, GLsizei width, GLsizei height, GLenum internalFormat, GLsizei samples);
virtual ~RenderTarget9(); virtual ~RenderTarget9();
static RenderTarget9 *makeRenderTarget9(RenderTarget *renderTarget); static RenderTarget9 *makeRenderTarget9(RenderTarget *renderTarget);
......
...@@ -114,16 +114,11 @@ bool TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture, unsign ...@@ -114,16 +114,11 @@ bool TextureStorage11::updateSubresourceLevel(ID3D11Resource *srcTexture, unsign
{ {
if (srcTexture) if (srcTexture)
{ {
// Round up the width and height to the nearest multiple of dimension alignment
unsigned int dimensionAlignment = d3d11::GetTextureFormatDimensionAlignment(mTextureFormat);
width = roundUp(width, (GLsizei)dimensionAlignment);
height = roundUp(height, (GLsizei)dimensionAlignment);
D3D11_BOX srcBox; D3D11_BOX srcBox;
srcBox.left = xoffset; srcBox.left = xoffset;
srcBox.top = yoffset; srcBox.top = yoffset;
srcBox.right = xoffset + width; srcBox.right = xoffset + roundUp((unsigned int)width, d3d11::GetBlockWidth(mTextureFormat));
srcBox.bottom = yoffset + height; srcBox.bottom = yoffset + roundUp((unsigned int)height, d3d11::GetBlockHeight(mTextureFormat));
srcBox.front = zoffset; srcBox.front = zoffset;
srcBox.back = zoffset + depth; srcBox.back = zoffset + depth;
...@@ -220,28 +215,19 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum ...@@ -220,28 +215,19 @@ TextureStorage11_2D::TextureStorage11_2D(Renderer *renderer, int levels, GLenum
mRenderTarget[i] = NULL; mRenderTarget[i] = NULL;
} }
DXGI_FORMAT convertedFormat = gl_d3d11::ConvertTextureFormat(internalformat); GLuint clientVersion = mRenderer->getCurrentClientVersion();
if (d3d11::IsDepthStencilFormat(convertedFormat))
{ mTextureFormat = gl_d3d11::GetTexFormat(internalformat, clientVersion);
mTextureFormat = d3d11::GetDepthTextureFormat(convertedFormat); mShaderResourceFormat = gl_d3d11::GetSRVFormat(internalformat, clientVersion);
mShaderResourceFormat = d3d11::GetDepthShaderResourceFormat(convertedFormat); mDepthStencilFormat = gl_d3d11::GetDSVFormat(internalformat, clientVersion);
mDepthStencilFormat = convertedFormat; mRenderTargetFormat = gl_d3d11::GetRTVFormat(internalformat, clientVersion);
mRenderTargetFormat = DXGI_FORMAT_UNKNOWN;
}
else
{
mTextureFormat = convertedFormat;
mShaderResourceFormat = convertedFormat;
mDepthStencilFormat = DXGI_FORMAT_UNKNOWN;
mRenderTargetFormat = convertedFormat;
}
// 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
if (width > 0 && height > 0) if (width > 0 && height > 0)
{ {
// adjust size if needed for compressed textures // adjust size if needed for compressed textures
gl::MakeValidSize(false, gl::IsCompressed(internalformat), &width, &height, &mLodOffset); d3d11::MakeValidSize(false, mTextureFormat, &width, &height, &mLodOffset);
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
...@@ -450,21 +436,12 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe ...@@ -450,21 +436,12 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe
} }
} }
DXGI_FORMAT convertedFormat = gl_d3d11::ConvertTextureFormat(internalformat); GLuint clientVersion = mRenderer->getCurrentClientVersion();
if (d3d11::IsDepthStencilFormat(convertedFormat))
{ mTextureFormat = gl_d3d11::GetTexFormat(internalformat, clientVersion);
mTextureFormat = d3d11::GetDepthTextureFormat(convertedFormat); mShaderResourceFormat = gl_d3d11::GetSRVFormat(internalformat, clientVersion);
mShaderResourceFormat = d3d11::GetDepthShaderResourceFormat(convertedFormat); mDepthStencilFormat = gl_d3d11::GetDSVFormat(internalformat, clientVersion);
mDepthStencilFormat = convertedFormat; mRenderTargetFormat = gl_d3d11::GetRTVFormat(internalformat, clientVersion);
mRenderTargetFormat = DXGI_FORMAT_UNKNOWN;
}
else
{
mTextureFormat = convertedFormat;
mShaderResourceFormat = convertedFormat;
mDepthStencilFormat = DXGI_FORMAT_UNKNOWN;
mRenderTargetFormat = convertedFormat;
}
// 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
...@@ -472,7 +449,7 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe ...@@ -472,7 +449,7 @@ TextureStorage11_Cube::TextureStorage11_Cube(Renderer *renderer, int levels, GLe
{ {
// adjust size if needed for compressed textures // adjust size if needed for compressed textures
int height = size; int height = size;
gl::MakeValidSize(false, gl::IsCompressed(internalformat), &size, &height, &mLodOffset); d3d11::MakeValidSize(false, mTextureFormat, &size, &height, &mLodOffset);
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
...@@ -683,20 +660,19 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, int levels, GLenum ...@@ -683,20 +660,19 @@ TextureStorage11_3D::TextureStorage11_3D(Renderer *renderer, int levels, GLenum
mLevelRenderTargets[i] = NULL; mLevelRenderTargets[i] = NULL;
} }
DXGI_FORMAT convertedFormat = gl_d3d11::ConvertTextureFormat(internalformat); GLuint clientVersion = mRenderer->getCurrentClientVersion();
ASSERT(!d3d11::IsDepthStencilFormat(convertedFormat));
mTextureFormat = convertedFormat; mTextureFormat = gl_d3d11::GetTexFormat(internalformat, clientVersion);
mShaderResourceFormat = convertedFormat; mShaderResourceFormat = gl_d3d11::GetSRVFormat(internalformat, clientVersion);
mDepthStencilFormat = DXGI_FORMAT_UNKNOWN; mDepthStencilFormat = gl_d3d11::GetDSVFormat(internalformat, clientVersion);
mRenderTargetFormat = convertedFormat; mRenderTargetFormat = gl_d3d11::GetRTVFormat(internalformat, clientVersion);
// If the width, height or depth are not positive this should be treated as an incomplete texture // If the width, height or depth are 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
if (width > 0 && height > 0 && depth > 0) if (width > 0 && height > 0 && depth > 0)
{ {
// adjust size if needed for compressed textures // adjust size if needed for compressed textures
gl::MakeValidSize(false, gl::IsCompressed(internalformat), &width, &height, &mLodOffset); d3d11::MakeValidSize(false, mTextureFormat, &width, &height, &mLodOffset);
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
...@@ -934,20 +910,19 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, int level ...@@ -934,20 +910,19 @@ TextureStorage11_2DArray::TextureStorage11_2DArray(Renderer *renderer, int level
{ {
mTexture = NULL; mTexture = NULL;
DXGI_FORMAT convertedFormat = gl_d3d11::ConvertTextureFormat(internalformat); GLuint clientVersion = mRenderer->getCurrentClientVersion();
ASSERT(!d3d11::IsDepthStencilFormat(convertedFormat));
mTextureFormat = convertedFormat; mTextureFormat = gl_d3d11::GetTexFormat(internalformat, clientVersion);
mShaderResourceFormat = convertedFormat; mShaderResourceFormat = gl_d3d11::GetSRVFormat(internalformat, clientVersion);
mDepthStencilFormat = DXGI_FORMAT_UNKNOWN; mDepthStencilFormat = gl_d3d11::GetDSVFormat(internalformat, clientVersion);
mRenderTargetFormat = convertedFormat; mRenderTargetFormat = gl_d3d11::GetRTVFormat(internalformat, clientVersion);
// if the width, height or depth is not positive this should be treated as an incomplete texture // if the width, height or depth 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
if (width > 0 && height > 0 && depth > 0) if (width > 0 && height > 0 && depth > 0)
{ {
// adjust size if needed for compressed textures // adjust size if needed for compressed textures
gl::MakeValidSize(false, gl::IsCompressed(internalformat), &width, &height, &mLodOffset); d3d11::MakeValidSize(false, mTextureFormat, &width, &height, &mLodOffset);
ID3D11Device *device = mRenderer->getDevice(); ID3D11Device *device = mRenderer->getDevice();
......
...@@ -109,9 +109,10 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, int levels, GLenum in ...@@ -109,9 +109,10 @@ TextureStorage9_2D::TextureStorage9_2D(Renderer *renderer, int levels, GLenum in
if (width > 0 && height > 0) if (width > 0 && height > 0)
{ {
IDirect3DDevice9 *device = mRenderer->getDevice(); IDirect3DDevice9 *device = mRenderer->getDevice();
gl::MakeValidSize(false, gl::IsCompressed(internalformat), &width, &height, &mLodOffset); D3DFORMAT format = gl_d3d9::GetTexureFormat(internalformat, mRenderer);
d3d9::MakeValidSize(false, format, &width, &height, &mLodOffset);
HRESULT result = device->CreateTexture(width, height, levels ? levels + mLodOffset : 0, getUsage(), HRESULT result = device->CreateTexture(width, height, levels ? levels + mLodOffset : 0, getUsage(),
mRenderer->ConvertTextureInternalFormat(internalformat), getPool(), &mTexture, NULL); format, getPool(), &mTexture, NULL);
if (FAILED(result)) if (FAILED(result))
{ {
...@@ -211,9 +212,10 @@ TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, int levels, GLenu ...@@ -211,9 +212,10 @@ TextureStorage9_Cube::TextureStorage9_Cube(Renderer *renderer, int levels, GLenu
{ {
IDirect3DDevice9 *device = mRenderer->getDevice(); IDirect3DDevice9 *device = mRenderer->getDevice();
int height = size; int height = size;
gl::MakeValidSize(false, gl::IsCompressed(internalformat), &size, &height, &mLodOffset); D3DFORMAT format = gl_d3d9::GetTexureFormat(internalformat, mRenderer);
d3d9::MakeValidSize(false, format, &size, &height, &mLodOffset);
HRESULT result = device->CreateCubeTexture(size, levels ? levels + mLodOffset : 0, getUsage(), HRESULT result = device->CreateCubeTexture(size, levels ? levels + mLodOffset : 0, getUsage(),
mRenderer->ConvertTextureInternalFormat(internalformat), getPool(), &mTexture, NULL); format, getPool(), &mTexture, NULL);
if (FAILED(result)) if (FAILED(result))
{ {
......
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