Commit 8040f57d by Geoff Lang

Updated Renderbuffers, Textures and TextureStorageInterface to be aware of…

Updated Renderbuffers, Textures and TextureStorageInterface to be aware of render targets which are based on miplevels and layers other than zero. TRAC #23470 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang
parent 309c92aa
......@@ -277,6 +277,8 @@
'libGLESv2/Query.cpp',
'libGLESv2/Renderbuffer.cpp',
'libGLESv2/Renderbuffer.h',
'libGLESv2/RenderbufferProxySet.cpp',
'libGLESv2/RenderbufferProxySet.h',
'libGLESv2/renderer/Blit9.cpp',
'libGLESv2/renderer/Blit9.h',
'libGLESv2/renderer/Blit11.cpp',
......
......@@ -59,7 +59,7 @@ Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint
Texture *texture = context->getTexture(handle);
if (texture && texture->getTarget() == GL_TEXTURE_2D)
{
return static_cast<Texture2D*>(texture)->getRenderbuffer(type);
return static_cast<Texture2D*>(texture)->getRenderbuffer(level);
}
else
{
......@@ -77,7 +77,7 @@ Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint
Texture *texture = context->getTexture(handle);
if (texture && texture->getTarget() == GL_TEXTURE_CUBE_MAP)
{
return static_cast<TextureCubeMap*>(texture)->getRenderbuffer(type);
return static_cast<TextureCubeMap*>(texture)->getRenderbuffer(type, level);
}
else
{
......@@ -90,7 +90,7 @@ Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint
Texture *texture = context->getTexture(handle);
if (texture && texture->getTarget() == GL_TEXTURE_3D)
{
return static_cast<Texture3D*>(texture)->getRenderbuffer(type);
return static_cast<Texture3D*>(texture)->getRenderbuffer(level, layer);
}
else
{
......@@ -103,7 +103,7 @@ Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint
Texture *texture = context->getTexture(handle);
if (texture && texture->getTarget() == GL_TEXTURE_2D_ARRAY)
{
return static_cast<Texture2DArray*>(texture)->getRenderbuffer(type);
return static_cast<Texture2DArray*>(texture)->getRenderbuffer(level, layer);
}
else
{
......
......@@ -38,7 +38,7 @@ void RenderbufferInterface::releaseProxy(const Renderbuffer *proxy)
///// RenderbufferTexture2D Implementation ////////
RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLenum target) : mTarget(target)
RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLint level) : mLevel(level)
{
mTexture2D.set(texture);
}
......@@ -62,32 +62,32 @@ void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
rx::RenderTarget *RenderbufferTexture2D::getRenderTarget()
{
return mTexture2D->getRenderTarget(mTarget);
return mTexture2D->getRenderTarget(mLevel);
}
rx::RenderTarget *RenderbufferTexture2D::getDepthStencil()
{
return mTexture2D->getDepthStencil(mTarget);
return mTexture2D->getDepthSencil(mLevel);
}
GLsizei RenderbufferTexture2D::getWidth() const
{
return mTexture2D->getWidth(0);
return mTexture2D->getWidth(mLevel);
}
GLsizei RenderbufferTexture2D::getHeight() const
{
return mTexture2D->getHeight(0);
return mTexture2D->getHeight(mLevel);
}
GLenum RenderbufferTexture2D::getInternalFormat() const
{
return mTexture2D->getInternalFormat(0);
return mTexture2D->getInternalFormat(mLevel);
}
GLenum RenderbufferTexture2D::getActualFormat() const
{
return mTexture2D->getActualFormat(0);
return mTexture2D->getActualFormat(mLevel);
}
GLsizei RenderbufferTexture2D::getSamples() const
......@@ -97,12 +97,13 @@ GLsizei RenderbufferTexture2D::getSamples() const
unsigned int RenderbufferTexture2D::getSerial() const
{
return mTexture2D->getRenderTargetSerial(mTarget);
return mTexture2D->getRenderTargetSerial(mLevel);
}
///// RenderbufferTextureCubeMap Implementation ////////
RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target) : mTarget(target)
RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum faceTarget, GLint level)
: mFaceTarget(faceTarget), mLevel(level)
{
mTextureCubeMap.set(texture);
}
......@@ -126,32 +127,32 @@ void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
rx::RenderTarget *RenderbufferTextureCubeMap::getRenderTarget()
{
return mTextureCubeMap->getRenderTarget(mTarget);
return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
}
rx::RenderTarget *RenderbufferTextureCubeMap::getDepthStencil()
{
return NULL;
return mTextureCubeMap->getDepthStencil(mFaceTarget, mLevel);
}
GLsizei RenderbufferTextureCubeMap::getWidth() const
{
return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
return mTextureCubeMap->getWidth(mFaceTarget, mLevel);
}
GLsizei RenderbufferTextureCubeMap::getHeight() const
{
return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
return mTextureCubeMap->getHeight(mFaceTarget, mLevel);
}
GLenum RenderbufferTextureCubeMap::getInternalFormat() const
{
return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
return mTextureCubeMap->getInternalFormat(mFaceTarget, mLevel);
}
GLenum RenderbufferTextureCubeMap::getActualFormat() const
{
return mTextureCubeMap->getActualFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
return mTextureCubeMap->getActualFormat(mFaceTarget, mLevel);
}
GLsizei RenderbufferTextureCubeMap::getSamples() const
......@@ -161,7 +162,7 @@ GLsizei RenderbufferTextureCubeMap::getSamples() const
unsigned int RenderbufferTextureCubeMap::getSerial() const
{
return mTextureCubeMap->getRenderTargetSerial(mTarget);
return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
}
////// Renderbuffer Implementation //////
......@@ -274,7 +275,7 @@ void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
mInstance = newStorage;
}
RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial())
RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1))
{
mWidth = 0;
mHeight = 0;
......@@ -327,15 +328,10 @@ unsigned int RenderbufferStorage::getSerial() const
return mSerial;
}
unsigned int RenderbufferStorage::issueSerial()
{
return mCurrentSerial++;
}
unsigned int RenderbufferStorage::issueCubeSerials()
unsigned int RenderbufferStorage::issueSerials(GLuint count)
{
unsigned int firstSerial = mCurrentSerial;
mCurrentSerial += 6;
mCurrentSerial += count;
return firstSerial;
}
......@@ -377,12 +373,7 @@ Colorbuffer::~Colorbuffer()
rx::RenderTarget *Colorbuffer::getRenderTarget()
{
if (mRenderTarget)
{
return mRenderTarget;
}
return NULL;
return mRenderTarget;
}
DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
......@@ -420,12 +411,7 @@ DepthStencilbuffer::~DepthStencilbuffer()
rx::RenderTarget *DepthStencilbuffer::getDepthStencil()
{
if (mDepthStencil)
{
return mDepthStencil;
}
return NULL;
return mDepthStencil;
}
Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
......
......@@ -62,7 +62,7 @@ class RenderbufferInterface
class RenderbufferTexture2D : public RenderbufferInterface
{
public:
RenderbufferTexture2D(Texture2D *texture, GLenum target);
RenderbufferTexture2D(Texture2D *texture, GLint level);
virtual ~RenderbufferTexture2D();
......@@ -84,13 +84,13 @@ class RenderbufferTexture2D : public RenderbufferInterface
DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
BindingPointer <Texture2D> mTexture2D;
GLenum mTarget;
const GLint mLevel;
};
class RenderbufferTextureCubeMap : public RenderbufferInterface
{
public:
RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target);
RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum faceTarget, GLint level);
virtual ~RenderbufferTextureCubeMap();
......@@ -112,7 +112,8 @@ class RenderbufferTextureCubeMap : public RenderbufferInterface
DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
BindingPointer <TextureCubeMap> mTextureCubeMap;
GLenum mTarget;
const GLint mLevel;
const GLenum mFaceTarget;
};
// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
......@@ -136,8 +137,7 @@ class RenderbufferStorage : public RenderbufferInterface
virtual unsigned int getSerial() const;
static unsigned int issueSerial();
static unsigned int issueCubeSerials();
static unsigned int issueSerials(GLuint count);
protected:
GLsizei mWidth;
......
#include "precompiled.h"
//
// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// RenderbufferProxySet.cpp: Implements the gl::RenderbufferProxySet, a class for
// maintaining a Texture's weak references to the Renderbuffers that represent it.
#include "libGLESv2/RenderbufferProxySet.h"
#include "common/debug.h"
namespace gl
{
void RenderbufferProxySet::addRef(const Renderbuffer *proxy)
{
RefCountMap::iterator i = mRefCountMap.find(proxy);
if (i != mRefCountMap.end())
{
i->second++;
}
}
void RenderbufferProxySet::release(const Renderbuffer *proxy)
{
RefCountMap::iterator i = mRefCountMap.find(proxy);
if (i != mRefCountMap.end())
{
if (i->second > 0)
{
i->second--;
}
if (i->second == 0)
{
// Clear the buffer map of references to this Renderbuffer
BufferMap::iterator j = mBufferMap.begin();
while (j != mBufferMap.end())
{
if (j->second == proxy)
{
j = mBufferMap.erase(j);
}
else
{
++j;
}
}
mRefCountMap.erase(i);
}
}
}
void RenderbufferProxySet::add(unsigned int mipLevel, unsigned int layer, Renderbuffer *renderBuffer)
{
if (mRefCountMap.find(renderBuffer) == mRefCountMap.end())
{
mRefCountMap.insert(std::make_pair(renderBuffer, 0));
}
RenderbufferKey key;
key.mipLevel = mipLevel;
key.layer = layer;
if (mBufferMap.find(key) == mBufferMap.end())
{
mBufferMap.insert(std::make_pair(key, renderBuffer));
}
}
Renderbuffer *RenderbufferProxySet::get(unsigned int mipLevel, unsigned int layer) const
{
RenderbufferKey key;
key.mipLevel = mipLevel;
key.layer = layer;
BufferMap::const_iterator i = mBufferMap.find(key);
return (i != mBufferMap.end()) ? i->second : NULL;
}
bool RenderbufferProxySet::RenderbufferKey::operator<(const RenderbufferKey &other) const
{
return (mipLevel != other.mipLevel) ? mipLevel < other.mipLevel : layer < other.layer;
}
}
//
// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// RenderbufferProxySet.h: Defines the gl::RenderbufferProxySet, a class for
// maintaining a Texture's weak references to the Renderbuffers that represent it.
#ifndef LIBGLESV2_RENDERBUFFERPROXYSET_H_
#define LIBGLESV2_RENDERBUFFERPROXYSET_H_
#include <map>
namespace gl
{
class Renderbuffer;
class RenderbufferProxySet
{
public:
void addRef(const Renderbuffer *proxy);
void release(const Renderbuffer *proxy);
void add(unsigned int mipLevel, unsigned int layer, Renderbuffer *renderBuffer);
Renderbuffer *get(unsigned int mipLevel, unsigned int layer) const;
private:
struct RenderbufferKey
{
unsigned int mipLevel;
unsigned int layer;
bool operator<(const RenderbufferKey &other) const;
};
typedef std::map<RenderbufferKey, Renderbuffer*> BufferMap;
BufferMap mBufferMap;
typedef std::map<const Renderbuffer*, unsigned int> RefCountMap;
RefCountMap mRefCountMap;
};
}
#endif // LIBGLESV2_RENDERBUFFERPROXYSET_H_
......@@ -20,6 +20,7 @@
#include "common/debug.h"
#include "common/RefCountObject.h"
#include "libGLESv2/angletypes.h"
#include "libGLESv2/RenderbufferProxySet.h"
namespace egl
{
......@@ -63,8 +64,8 @@ class Texture : public RefCountObject
virtual ~Texture();
virtual void addProxyRef(const Renderbuffer *proxy) = 0;
virtual void releaseProxy(const Renderbuffer *proxy) = 0;
void addProxyRef(const Renderbuffer *proxy);
void releaseProxy(const Renderbuffer *proxy);
GLenum getTarget() const;
......@@ -92,7 +93,6 @@ class Texture : public RefCountObject
virtual bool isSamplerComplete(const SamplerState &samplerState) const = 0;
rx::TextureStorageInterface *getNativeTexture();
virtual Renderbuffer *getRenderbuffer(GLenum target) = 0;
virtual void generateMipmaps() = 0;
virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0;
......@@ -101,7 +101,6 @@ class Texture : public RefCountObject
bool hasDirtyImages() const;
void resetDirty();
unsigned int getTextureSerial();
unsigned int getRenderTargetSerial(GLenum target);
bool isImmutable() const;
......@@ -122,7 +121,6 @@ class Texture : public RefCountObject
virtual void createTexture() = 0;
virtual void updateTexture() = 0;
virtual void convertToRenderTarget() = 0;
virtual rx::RenderTarget *getRenderTarget(GLenum target) = 0;
rx::Renderer *mRenderer;
......@@ -135,6 +133,13 @@ class Texture : public RefCountObject
GLenum mTarget;
// A specific internal reference count is kept for colorbuffer proxy references,
// because, as the renderbuffer acting as proxy will maintain a binding pointer
// back to this texture, there would be a circular reference if we used a binding
// pointer here. This reference count will cause the pointer to be set to NULL if
// the count drops to zero, but will not cause deletion of the Renderbuffer.
RenderbufferProxySet mRenderbufferProxies;
private:
DISALLOW_COPY_AND_ASSIGN(Texture);
......@@ -148,9 +153,6 @@ class Texture2D : public Texture
~Texture2D();
void addProxyRef(const Renderbuffer *proxy);
void releaseProxy(const Renderbuffer *proxy);
GLsizei getWidth(GLint level) const;
GLsizei getHeight(GLint level) const;
GLenum getInternalFormat(GLint level) const;
......@@ -172,12 +174,13 @@ class Texture2D : public Texture
virtual void generateMipmaps();
virtual Renderbuffer *getRenderbuffer(GLenum target);
Renderbuffer *getRenderbuffer(GLint level);
unsigned int getRenderTargetSerial(GLint level);
protected:
friend class RenderbufferTexture2D;
virtual rx::RenderTarget *getRenderTarget(GLenum target);
virtual rx::RenderTarget *getDepthStencil(GLenum target);
rx::RenderTarget *getRenderTarget(GLint level);
rx::RenderTarget *getDepthSencil(GLint level);
virtual int levelCount();
private:
......@@ -199,14 +202,6 @@ class Texture2D : public Texture
rx::TextureStorageInterface2D *mTexStorage;
egl::Surface *mSurface;
// A specific internal reference count is kept for colorbuffer proxy references,
// because, as the renderbuffer acting as proxy will maintain a binding pointer
// back to this texture, there would be a circular reference if we used a binding
// pointer here. This reference count will cause the pointer to be set to NULL if
// the count drops to zero, but will not cause deletion of the Renderbuffer.
Renderbuffer *mColorbufferProxy;
unsigned int mProxyRefs;
};
class TextureCubeMap : public Texture
......@@ -216,14 +211,12 @@ class TextureCubeMap : public Texture
~TextureCubeMap();
void addProxyRef(const Renderbuffer *proxy);
void releaseProxy(const Renderbuffer *proxy);
GLsizei getWidth(GLenum target, GLint level) const;
GLsizei getHeight(GLenum target, GLint level) const;
GLenum getInternalFormat(GLenum target, GLint level) const;
GLenum getActualFormat(GLenum target, GLint level) const;
bool isCompressed(GLenum target, GLint level) const;
bool isDepth(GLenum target, GLint level) const;
void setImagePosX(GLint level, GLsizei width, GLsizei height, GLint internalFormat, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
void setImageNegX(GLint level, GLsizei width, GLsizei height, GLint internalFormat, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels);
......@@ -244,13 +237,15 @@ class TextureCubeMap : public Texture
virtual void generateMipmaps();
virtual Renderbuffer *getRenderbuffer(GLenum target);
Renderbuffer *getRenderbuffer(GLenum target, GLint level);
unsigned int getRenderTargetSerial(GLenum faceTarget, GLint level);
static unsigned int faceIndex(GLenum face);
protected:
friend class RenderbufferTextureCubeMap;
virtual rx::RenderTarget *getRenderTarget(GLenum target);
rx::RenderTarget *getRenderTarget(GLenum target, GLint level);
rx::RenderTarget *getDepthStencil(GLenum target, GLint level);
virtual int levelCount();
private:
......@@ -273,14 +268,6 @@ class TextureCubeMap : public Texture
rx::Image *mImageArray[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS];
rx::TextureStorageInterfaceCube *mTexStorage;
// A specific internal reference count is kept for colorbuffer proxy references,
// because, as the renderbuffer acting as proxy will maintain a binding pointer
// back to this texture, there would be a circular reference if we used a binding
// pointer here. This reference count will cause the pointer to be set to NULL if
// the count drops to zero, but will not cause deletion of the Renderbuffer.
Renderbuffer *mFaceProxies[6];
unsigned int *mFaceProxyRefs[6];
};
class Texture3D : public Texture
......@@ -290,9 +277,6 @@ class Texture3D : public Texture
~Texture3D();
void addProxyRef(const Renderbuffer *proxy);
void releaseProxy(const Renderbuffer *proxy);
GLsizei getWidth(GLint level) const;
GLsizei getHeight(GLint level) const;
GLsizei getDepth(GLint level) const;
......@@ -313,9 +297,12 @@ class Texture3D : public Texture
virtual bool isSamplerComplete(const SamplerState &samplerState) const;
virtual bool isMipmapComplete() const;
virtual Renderbuffer *getRenderbuffer(GLenum target);
Renderbuffer *getRenderbuffer(GLint level, GLint layer);
unsigned int getRenderTargetSerial(GLint level, GLint layer);
protected:
rx::RenderTarget *getRenderTarget(GLint level, GLint layer);
rx::RenderTarget *getDepthStencil(GLint level, GLint layer);
virtual int levelCount();
private:
......@@ -324,7 +311,6 @@ class Texture3D : public Texture
virtual void createTexture();
virtual void updateTexture();
virtual void convertToRenderTarget();
virtual rx::RenderTarget *getRenderTarget(GLenum target);
virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
......@@ -337,14 +323,6 @@ class Texture3D : public Texture
rx::Image *mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
rx::TextureStorageInterface3D *mTexStorage;
// A specific internal reference count is kept for colorbuffer proxy references,
// because, as the renderbuffer acting as proxy will maintain a binding pointer
// back to this texture, there would be a circular reference if we used a binding
// pointer here. This reference count will cause the pointer to be set to NULL if
// the count drops to zero, but will not cause deletion of the Renderbuffer.
Renderbuffer *mColorbufferProxy;
unsigned int mProxyRefs;
};
class Texture2DArray : public Texture
......@@ -354,9 +332,6 @@ class Texture2DArray : public Texture
~Texture2DArray();
void addProxyRef(const Renderbuffer *proxy);
void releaseProxy(const Renderbuffer *proxy);
GLsizei getWidth(GLint level) const;
GLsizei getHeight(GLint level) const;
GLsizei getDepth(GLint level) const;
......@@ -377,9 +352,12 @@ class Texture2DArray : public Texture
virtual bool isSamplerComplete(const SamplerState &samplerState) const;
virtual bool isMipmapComplete() const;
virtual Renderbuffer *getRenderbuffer(GLenum target);
Renderbuffer *getRenderbuffer(GLint level, GLint layer);
unsigned int getRenderTargetSerial(GLint level, GLint layer);
protected:
rx::RenderTarget *getRenderTarget(GLint level, GLint layer);
rx::RenderTarget *getDepthStencil(GLint level, GLint layer);
virtual int levelCount();
private:
......@@ -388,7 +366,6 @@ class Texture2DArray : public Texture
virtual void createTexture();
virtual void updateTexture();
virtual void convertToRenderTarget();
virtual rx::RenderTarget *getRenderTarget(GLenum target);
virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
......@@ -406,14 +383,6 @@ class Texture2DArray : public Texture
rx::Image **mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS];
rx::TextureStorageInterface2DArray *mTexStorage;
// A specific internal reference count is kept for colorbuffer proxy references,
// because, as the renderbuffer acting as proxy will maintain a binding pointer
// back to this texture, there would be a circular reference if we used a binding
// pointer here. This reference count will cause the pointer to be set to NULL if
// the count drops to zero, but will not cause deletion of the Renderbuffer.
Renderbuffer *mColorbufferProxy;
unsigned int mProxyRefs;
};
}
......
......@@ -267,6 +267,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\"
<ClCompile Include="Query.cpp" />
<ClCompile Include="..\common\RefCountObject.cpp" />
<ClCompile Include="Renderbuffer.cpp" />
<ClCompile Include="RenderbufferProxySet.cpp" />
<ClCompile Include="renderer\Blit11.cpp" />
<ClCompile Include="renderer\Blit9.cpp" />
<ClCompile Include="renderer\copyimage.cpp" />
......@@ -346,6 +347,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\"
<ClInclude Include="Query.h" />
<ClInclude Include="..\common\RefCountObject.h" />
<ClInclude Include="Renderbuffer.h" />
<ClInclude Include="RenderbufferProxySet.h" />
<ClInclude Include="renderer\Blit11.h" />
<ClInclude Include="renderer\Blit9.h" />
<ClInclude Include="renderer\copyimage.h" />
......
......@@ -244,9 +244,12 @@
</ClCompile>
<ClCompile Include="Sampler.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ClCompile>
<ClCompile Include="renderer\IndexRangeCache.cpp">
<Filter>Source Files\Renderer</Filter>
</ClCompile>
<ClCompile Include="RenderbufferProxySet.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
......@@ -633,9 +636,12 @@
</ClInclude>
<ClInclude Include="Sampler.h">
<Filter>Header Files</Filter>
</ClInclude>
</ClInclude>
<ClInclude Include="renderer\IndexRangeCache.h">
<Filter>Header Files\Renderer</Filter>
</ClInclude>
<ClInclude Include="RenderbufferProxySet.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
......
......@@ -15,6 +15,7 @@
#include "libGLESv2/Texture.h"
#include "common/debug.h"
#include "common/mathutil.h"
namespace rx
{
......@@ -61,15 +62,23 @@ int TextureStorageInterface::levelCount()
return mInstance->levelCount();
}
static unsigned int GetActualLevelCount(GLsizei width, GLsizei height, GLsizei depth, GLint levelCount)
{
return (levelCount <= 0) ? std::max(std::max(gl::log2(width), gl::log2(height)), gl::log2(depth)) : levelCount;
}
TextureStorageInterface2D::TextureStorageInterface2D(Renderer *renderer, SwapChain *swapchain)
: mRenderTargetSerial(gl::RenderbufferStorage::issueSerial())
{
mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(1);
mInstance = renderer->createTextureStorage2D(swapchain);
}
TextureStorageInterface2D::TextureStorageInterface2D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height)
: mRenderTargetSerial(gl::RenderbufferStorage::issueSerial())
{
unsigned int actualLevels = GetActualLevelCount(width, height, 0, levels);
mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(actualLevels);
mInstance = renderer->createTextureStorage2D(levels, internalformat, usage, forceRenderable, width, height);
}
......@@ -77,9 +86,9 @@ TextureStorageInterface2D::~TextureStorageInterface2D()
{
}
RenderTarget *TextureStorageInterface2D::getRenderTarget() const
RenderTarget *TextureStorageInterface2D::getRenderTarget(GLint level) const
{
return mInstance->getRenderTarget(0);
return mInstance->getRenderTarget(level);
}
void TextureStorageInterface2D::generateMipmap(int level)
......@@ -87,14 +96,16 @@ void TextureStorageInterface2D::generateMipmap(int level)
mInstance->generateMipmap(level);
}
unsigned int TextureStorageInterface2D::getRenderTargetSerial(GLenum target) const
unsigned int TextureStorageInterface2D::getRenderTargetSerial(GLint level) const
{
return mRenderTargetSerial;
return mFirstRenderTargetSerial + level;
}
TextureStorageInterfaceCube::TextureStorageInterfaceCube(Renderer *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, int size)
: mFirstRenderTargetSerial(gl::RenderbufferStorage::issueCubeSerials())
{
unsigned int actualLevels = GetActualLevelCount(size, size, 0, levels);
mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(actualLevels * 6);
mInstance = renderer->createTextureStorageCube(levels, internalformat, usage, forceRenderable, size);
}
......@@ -102,9 +113,9 @@ TextureStorageInterfaceCube::~TextureStorageInterfaceCube()
{
}
RenderTarget *TextureStorageInterfaceCube::getRenderTarget(GLenum faceTarget) const
RenderTarget *TextureStorageInterfaceCube::getRenderTarget(GLenum faceTarget, GLint level) const
{
return mInstance->getRenderTargetFace(faceTarget, 0);
return mInstance->getRenderTargetFace(faceTarget, level);
}
void TextureStorageInterfaceCube::generateMipmap(int face, int level)
......@@ -112,14 +123,17 @@ void TextureStorageInterfaceCube::generateMipmap(int face, int level)
mInstance->generateMipmap(face, level);
}
unsigned int TextureStorageInterfaceCube::getRenderTargetSerial(GLenum target) const
unsigned int TextureStorageInterfaceCube::getRenderTargetSerial(GLenum target, GLint level) const
{
return mFirstRenderTargetSerial + gl::TextureCubeMap::faceIndex(target);
return mFirstRenderTargetSerial + (level * 6) + gl::TextureCubeMap::faceIndex(target);
}
TextureStorageInterface3D::TextureStorageInterface3D(Renderer *renderer, int levels, GLenum internalformat, GLenum usage,
GLsizei width, GLsizei height, GLsizei depth)
{
mLevels = GetActualLevelCount(width, height, depth, levels);
mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(mLevels * depth);
mInstance = renderer->createTextureStorage3D(levels, internalformat, usage, width, height, depth);
}
......@@ -132,15 +146,22 @@ void TextureStorageInterface3D::generateMipmap(int level)
mInstance->generateMipmap(level);
}
unsigned int TextureStorageInterface3D::getRenderTargetSerial(GLenum target) const
RenderTarget *TextureStorageInterface3D::getRenderTarget(GLint level, GLint layer) const
{
// TODO: 3D render targets not supported yet.
return 0;
return mInstance->getRenderTargetLayer(level, layer);
}
unsigned int TextureStorageInterface3D::getRenderTargetSerial(GLint level, GLint layer) const
{
return mFirstRenderTargetSerial + (layer * mLevels) + level;
}
TextureStorageInterface2DArray::TextureStorageInterface2DArray(Renderer *renderer, int levels, GLenum internalformat, GLenum usage,
GLsizei width, GLsizei height, GLsizei depth)
{
mLevels = GetActualLevelCount(width, height, 0, levels);
mFirstRenderTargetSerial = gl::RenderbufferStorage::issueSerials(mLevels * depth);
mInstance = renderer->createTextureStorage2DArray(levels, internalformat, usage, width, height, depth);
}
......@@ -153,9 +174,14 @@ void TextureStorageInterface2DArray::generateMipmap(int level)
mInstance->generateMipmap(level);
}
unsigned int TextureStorageInterface2DArray::getRenderTargetSerial(GLenum target) const
RenderTarget *TextureStorageInterface2DArray::getRenderTarget(GLint level, GLint layer) const
{
return mInstance->getRenderTargetLayer(level, layer);
}
unsigned int TextureStorageInterface2DArray::getRenderTargetSerial(GLint level, GLint layer) const
{
return 0;
return mFirstRenderTargetSerial + (layer * mLevels) + level;
}
}
......@@ -50,7 +50,6 @@ class TextureStorageInterface
TextureStorage *getStorageInstance() { return mInstance; }
unsigned int getTextureSerial() const;
virtual unsigned int getRenderTargetSerial(GLenum target) const = 0;
virtual int getLodOffset() const;
virtual bool isRenderTarget() const;
......@@ -77,14 +76,14 @@ class TextureStorageInterface2D : public TextureStorageInterface
virtual ~TextureStorageInterface2D();
void generateMipmap(int level);
RenderTarget *getRenderTarget() const;
RenderTarget *getRenderTarget(GLint level) const;
virtual unsigned int getRenderTargetSerial(GLenum target) const;
unsigned int getRenderTargetSerial(GLint level) const;
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorageInterface2D);
const unsigned int mRenderTargetSerial;
unsigned int mFirstRenderTargetSerial;
};
class TextureStorageInterfaceCube : public TextureStorageInterface
......@@ -94,14 +93,14 @@ class TextureStorageInterfaceCube : public TextureStorageInterface
virtual ~TextureStorageInterfaceCube();
void generateMipmap(int face, int level);
RenderTarget *getRenderTarget(GLenum faceTarget) const;
RenderTarget *getRenderTarget(GLenum faceTarget, GLint level) const;
virtual unsigned int getRenderTargetSerial(GLenum target) const;
virtual unsigned int getRenderTargetSerial(GLenum target, GLint level) const;
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorageInterfaceCube);
const unsigned int mFirstRenderTargetSerial;
unsigned int mFirstRenderTargetSerial;
};
class TextureStorageInterface3D : public TextureStorageInterface
......@@ -112,11 +111,15 @@ class TextureStorageInterface3D : public TextureStorageInterface
virtual ~TextureStorageInterface3D();
void generateMipmap(int level);
RenderTarget *getRenderTarget(GLint level, GLint layer) const;
virtual unsigned int getRenderTargetSerial(GLenum target) const;
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) const;
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorageInterface3D);
unsigned int mLevels;
unsigned int mFirstRenderTargetSerial;
};
class TextureStorageInterface2DArray : public TextureStorageInterface
......@@ -127,11 +130,15 @@ class TextureStorageInterface2DArray : public TextureStorageInterface
virtual ~TextureStorageInterface2DArray();
void generateMipmap(int level);
RenderTarget *getRenderTarget(GLint level, GLint layer) const;
virtual unsigned int getRenderTargetSerial(GLenum target) const;
virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) const;
private:
DISALLOW_COPY_AND_ASSIGN(TextureStorageInterface2DArray);
unsigned int mLevels;
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