Adds RenderTarget pointer to TextureStorage.

TRAC #22094 Signed-off-by: Nicolas Capens Signed-off-by: Daniel Koch git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1447 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent c682d95b
...@@ -30,7 +30,7 @@ RenderTarget9::RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface) ...@@ -30,7 +30,7 @@ RenderTarget9::RenderTarget9(Renderer *renderer, IDirect3DSurface9 *surface)
mWidth = description.Width; mWidth = description.Width;
mHeight = description.Height; mHeight = description.Height;
mInternalFormat = d3d9_gl::ConvertRenderTargetFormat(description.Format); mInternalFormat = d3d9_gl::GetEquivalentFormat(description.Format);
mActualFormat = d3d9_gl::GetEquivalentFormat(description.Format); mActualFormat = d3d9_gl::GetEquivalentFormat(description.Format);
mSamples = d3d9_gl::GetSamplesFromMultisampleType(description.MultiSampleType); mSamples = d3d9_gl::GetSamplesFromMultisampleType(description.MultiSampleType);
} }
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include "libGLESv2/renderer/TextureStorage.h" #include "libGLESv2/renderer/TextureStorage.h"
#include "libGLESv2/renderer/SwapChain9.h" #include "libGLESv2/renderer/SwapChain9.h"
#include "libGLESv2/renderer/Blit.h" #include "libGLESv2/renderer/Blit.h"
#include "libGLESv2/renderer/RenderTarget9.h"
#include "libGLESv2/renderer/renderer9_utils.h" #include "libGLESv2/renderer/renderer9_utils.h"
#include "common/debug.h" #include "common/debug.h"
...@@ -119,6 +119,8 @@ TextureStorage2D::TextureStorage2D(Renderer9 *renderer, rx::SwapChain9 *swapchai ...@@ -119,6 +119,8 @@ TextureStorage2D::TextureStorage2D(Renderer9 *renderer, rx::SwapChain9 *swapchai
{ {
IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture(); IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture();
mTexture = surfaceTexture; mTexture = surfaceTexture;
initializeRenderTarget();
} }
TextureStorage2D::TextureStorage2D(Renderer9 *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height) TextureStorage2D::TextureStorage2D(Renderer9 *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height)
...@@ -141,6 +143,8 @@ TextureStorage2D::TextureStorage2D(Renderer9 *renderer, int levels, GLenum inter ...@@ -141,6 +143,8 @@ TextureStorage2D::TextureStorage2D(Renderer9 *renderer, int levels, GLenum inter
error(GL_OUT_OF_MEMORY); error(GL_OUT_OF_MEMORY);
} }
} }
initializeRenderTarget();
} }
TextureStorage2D::~TextureStorage2D() TextureStorage2D::~TextureStorage2D()
...@@ -149,6 +153,8 @@ TextureStorage2D::~TextureStorage2D() ...@@ -149,6 +153,8 @@ TextureStorage2D::~TextureStorage2D()
{ {
mTexture->Release(); mTexture->Release();
} }
delete mRenderTarget;
} }
// Increments refcount on surface. // Increments refcount on surface.
...@@ -172,6 +178,11 @@ IDirect3DSurface9 *TextureStorage2D::getSurfaceLevel(int level, bool dirty) ...@@ -172,6 +178,11 @@ IDirect3DSurface9 *TextureStorage2D::getSurfaceLevel(int level, bool dirty)
return surface; return surface;
} }
RenderTarget *TextureStorage2D::getRenderTarget() const
{
return mRenderTarget;
}
void TextureStorage2D::generateMipmap(int level) void TextureStorage2D::generateMipmap(int level)
{ {
IDirect3DSurface9 *upper = getSurfaceLevel(level - 1, false); IDirect3DSurface9 *upper = getSurfaceLevel(level - 1, false);
...@@ -196,6 +207,20 @@ unsigned int TextureStorage2D::getRenderTargetSerial(GLenum target) const ...@@ -196,6 +207,20 @@ unsigned int TextureStorage2D::getRenderTargetSerial(GLenum target) const
return mRenderTargetSerial; return mRenderTargetSerial;
} }
void TextureStorage2D::initializeRenderTarget()
{
if (mTexture != NULL && isRenderTarget())
{
IDirect3DSurface9 *surface = getSurfaceLevel(0, false);
mRenderTarget = new RenderTarget9(mRenderer, surface);
}
else
{
mRenderTarget = NULL;
}
}
TextureStorageCubeMap::TextureStorageCubeMap(Renderer9 *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size) TextureStorageCubeMap::TextureStorageCubeMap(Renderer9 *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size)
: TextureStorage(renderer, GetTextureUsage(renderer->ConvertTextureInternalFormat(internalformat), usage, forceRenderable)), : TextureStorage(renderer, GetTextureUsage(renderer->ConvertTextureInternalFormat(internalformat), usage, forceRenderable)),
mFirstRenderTargetSerial(gl::RenderbufferStorage::issueCubeSerials()) mFirstRenderTargetSerial(gl::RenderbufferStorage::issueCubeSerials())
...@@ -217,6 +242,8 @@ TextureStorageCubeMap::TextureStorageCubeMap(Renderer9 *renderer, int levels, GL ...@@ -217,6 +242,8 @@ TextureStorageCubeMap::TextureStorageCubeMap(Renderer9 *renderer, int levels, GL
error(GL_OUT_OF_MEMORY); error(GL_OUT_OF_MEMORY);
} }
} }
initializeRenderTarget();
} }
TextureStorageCubeMap::~TextureStorageCubeMap() TextureStorageCubeMap::~TextureStorageCubeMap()
...@@ -225,6 +252,11 @@ TextureStorageCubeMap::~TextureStorageCubeMap() ...@@ -225,6 +252,11 @@ TextureStorageCubeMap::~TextureStorageCubeMap()
{ {
mTexture->Release(); mTexture->Release();
} }
for (int i = 0; i < 6; ++i)
{
delete mRenderTarget[i];
}
} }
// Increments refcount on surface. // Increments refcount on surface.
...@@ -249,6 +281,11 @@ IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(GLenum faceTarget, i ...@@ -249,6 +281,11 @@ IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(GLenum faceTarget, i
return surface; return surface;
} }
RenderTarget *TextureStorageCubeMap::getRenderTarget(GLenum faceTarget) const
{
return mRenderTarget[gl::TextureCubeMap::faceIndex(faceTarget)];
}
void TextureStorageCubeMap::generateMipmap(int face, int level) void TextureStorageCubeMap::generateMipmap(int face, int level)
{ {
IDirect3DSurface9 *upper = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level - 1, false); IDirect3DSurface9 *upper = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level - 1, false);
...@@ -273,4 +310,26 @@ unsigned int TextureStorageCubeMap::getRenderTargetSerial(GLenum target) const ...@@ -273,4 +310,26 @@ unsigned int TextureStorageCubeMap::getRenderTargetSerial(GLenum target) const
return mFirstRenderTargetSerial + gl::TextureCubeMap::faceIndex(target); return mFirstRenderTargetSerial + gl::TextureCubeMap::faceIndex(target);
} }
void TextureStorageCubeMap::initializeRenderTarget()
{
if (mTexture != NULL && isRenderTarget())
{
IDirect3DSurface9 *surface = NULL;
for (int i = 0; i < 6; ++i)
{
surface = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, false);
mRenderTarget[i] = new RenderTarget9(mRenderer, surface);
}
}
else
{
for (int i = 0; i < 6; ++i)
{
mRenderTarget[i] = NULL;
}
}
}
} }
\ No newline at end of file
...@@ -21,6 +21,8 @@ namespace rx ...@@ -21,6 +21,8 @@ namespace rx
{ {
class Renderer9; class Renderer9;
class SwapChain9; class SwapChain9;
class RenderTarget;
class RenderTarget9;
class Blit; class Blit;
class TextureStorage class TextureStorage
...@@ -68,6 +70,7 @@ class TextureStorage2D : public TextureStorage ...@@ -68,6 +70,7 @@ class TextureStorage2D : public TextureStorage
virtual ~TextureStorage2D(); virtual ~TextureStorage2D();
IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty); IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty);
RenderTarget *getRenderTarget() const;
virtual IDirect3DBaseTexture9 *getBaseTexture() const; virtual IDirect3DBaseTexture9 *getBaseTexture() const;
void generateMipmap(int level); void generateMipmap(int level);
...@@ -76,7 +79,10 @@ class TextureStorage2D : public TextureStorage ...@@ -76,7 +79,10 @@ class TextureStorage2D : public TextureStorage
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage2D); DISALLOW_COPY_AND_ASSIGN(TextureStorage2D);
void initializeRenderTarget();
IDirect3DTexture9 *mTexture; IDirect3DTexture9 *mTexture;
RenderTarget9 *mRenderTarget;
const unsigned int mRenderTargetSerial; const unsigned int mRenderTargetSerial;
}; };
...@@ -88,6 +94,7 @@ class TextureStorageCubeMap : public TextureStorage ...@@ -88,6 +94,7 @@ class TextureStorageCubeMap : public TextureStorage
virtual ~TextureStorageCubeMap(); virtual ~TextureStorageCubeMap();
IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty); IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty);
RenderTarget *getRenderTarget(GLenum faceTarget) const;
virtual IDirect3DBaseTexture9 *getBaseTexture() const; virtual IDirect3DBaseTexture9 *getBaseTexture() const;
void generateMipmap(int face, int level); void generateMipmap(int face, int level);
...@@ -96,7 +103,10 @@ class TextureStorageCubeMap : public TextureStorage ...@@ -96,7 +103,10 @@ class TextureStorageCubeMap : public TextureStorage
private: private:
DISALLOW_COPY_AND_ASSIGN(TextureStorageCubeMap); DISALLOW_COPY_AND_ASSIGN(TextureStorageCubeMap);
void initializeRenderTarget();
IDirect3DCubeTexture9 *mTexture; IDirect3DCubeTexture9 *mTexture;
RenderTarget9 *mRenderTarget[6];
const unsigned int mFirstRenderTargetSerial; const unsigned int mFirstRenderTargetSerial;
}; };
......
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