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)
mWidth = description.Width;
mHeight = description.Height;
mInternalFormat = d3d9_gl::ConvertRenderTargetFormat(description.Format);
mInternalFormat = d3d9_gl::GetEquivalentFormat(description.Format);
mActualFormat = d3d9_gl::GetEquivalentFormat(description.Format);
mSamples = d3d9_gl::GetSamplesFromMultisampleType(description.MultiSampleType);
}
......
......@@ -12,7 +12,7 @@
#include "libGLESv2/renderer/TextureStorage.h"
#include "libGLESv2/renderer/SwapChain9.h"
#include "libGLESv2/renderer/Blit.h"
#include "libGLESv2/renderer/RenderTarget9.h"
#include "libGLESv2/renderer/renderer9_utils.h"
#include "common/debug.h"
......@@ -119,6 +119,8 @@ TextureStorage2D::TextureStorage2D(Renderer9 *renderer, rx::SwapChain9 *swapchai
{
IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture();
mTexture = surfaceTexture;
initializeRenderTarget();
}
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
error(GL_OUT_OF_MEMORY);
}
}
initializeRenderTarget();
}
TextureStorage2D::~TextureStorage2D()
......@@ -149,6 +153,8 @@ TextureStorage2D::~TextureStorage2D()
{
mTexture->Release();
}
delete mRenderTarget;
}
// Increments refcount on surface.
......@@ -172,6 +178,11 @@ IDirect3DSurface9 *TextureStorage2D::getSurfaceLevel(int level, bool dirty)
return surface;
}
RenderTarget *TextureStorage2D::getRenderTarget() const
{
return mRenderTarget;
}
void TextureStorage2D::generateMipmap(int level)
{
IDirect3DSurface9 *upper = getSurfaceLevel(level - 1, false);
......@@ -196,6 +207,20 @@ unsigned int TextureStorage2D::getRenderTargetSerial(GLenum target) const
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)
: TextureStorage(renderer, GetTextureUsage(renderer->ConvertTextureInternalFormat(internalformat), usage, forceRenderable)),
mFirstRenderTargetSerial(gl::RenderbufferStorage::issueCubeSerials())
......@@ -217,6 +242,8 @@ TextureStorageCubeMap::TextureStorageCubeMap(Renderer9 *renderer, int levels, GL
error(GL_OUT_OF_MEMORY);
}
}
initializeRenderTarget();
}
TextureStorageCubeMap::~TextureStorageCubeMap()
......@@ -225,6 +252,11 @@ TextureStorageCubeMap::~TextureStorageCubeMap()
{
mTexture->Release();
}
for (int i = 0; i < 6; ++i)
{
delete mRenderTarget[i];
}
}
// Increments refcount on surface.
......@@ -249,6 +281,11 @@ IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(GLenum faceTarget, i
return surface;
}
RenderTarget *TextureStorageCubeMap::getRenderTarget(GLenum faceTarget) const
{
return mRenderTarget[gl::TextureCubeMap::faceIndex(faceTarget)];
}
void TextureStorageCubeMap::generateMipmap(int face, int level)
{
IDirect3DSurface9 *upper = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level - 1, false);
......@@ -273,4 +310,26 @@ unsigned int TextureStorageCubeMap::getRenderTargetSerial(GLenum target) const
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
{
class Renderer9;
class SwapChain9;
class RenderTarget;
class RenderTarget9;
class Blit;
class TextureStorage
......@@ -68,6 +70,7 @@ class TextureStorage2D : public TextureStorage
virtual ~TextureStorage2D();
IDirect3DSurface9 *getSurfaceLevel(int level, bool dirty);
RenderTarget *getRenderTarget() const;
virtual IDirect3DBaseTexture9 *getBaseTexture() const;
void generateMipmap(int level);
......@@ -76,7 +79,10 @@ class TextureStorage2D : public TextureStorage
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorage2D);
void initializeRenderTarget();
IDirect3DTexture9 *mTexture;
RenderTarget9 *mRenderTarget;
const unsigned int mRenderTargetSerial;
};
......@@ -88,6 +94,7 @@ class TextureStorageCubeMap : public TextureStorage
virtual ~TextureStorageCubeMap();
IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level, bool dirty);
RenderTarget *getRenderTarget(GLenum faceTarget) const;
virtual IDirect3DBaseTexture9 *getBaseTexture() const;
void generateMipmap(int face, int level);
......@@ -96,7 +103,10 @@ class TextureStorageCubeMap : public TextureStorage
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorageCubeMap);
void initializeRenderTarget();
IDirect3DCubeTexture9 *mTexture;
RenderTarget9 *mRenderTarget[6];
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