Commit c4a3f242 by Nicolas Capens Committed by Nicolas Capens

Implement framebuffer layer support.

This stores the layer as part of the framebuffer object, instead of the renderbuffer, and passes it to the renderer at draw time. Change-Id: I947f8a58ba7a119cc9d890659c99e7e05d0d1d91 Reviewed-on: https://swiftshader-review.googlesource.com/14728Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 8af24c5c
...@@ -53,7 +53,7 @@ protected: ...@@ -53,7 +53,7 @@ protected:
// 2D texture image // 2D texture image
Image(Texture *parentTexture, GLsizei width, GLsizei height, GLenum format, GLenum type) Image(Texture *parentTexture, GLsizei width, GLsizei height, GLenum format, GLenum type)
: sw::Surface(parentTexture->getResource(), width, height, 1, 0, 1, SelectInternalFormat(format, type), true, true), : sw::Surface(parentTexture->getResource(), width, height, 1, 0, 1, SelectInternalFormat(format, type), true, true),
width(width), height(height), format(format), type(type), internalFormat(SelectInternalFormat(format, type)), depth(1), width(width), height(height), depth(1), format(format), type(type), internalFormat(SelectInternalFormat(format, type)),
parentTexture(parentTexture) parentTexture(parentTexture)
{ {
shared = false; shared = false;
...@@ -64,7 +64,7 @@ protected: ...@@ -64,7 +64,7 @@ protected:
// 3D/Cube texture image // 3D/Cube texture image
Image(Texture *parentTexture, GLsizei width, GLsizei height, GLsizei depth, int border, GLenum format, GLenum type) Image(Texture *parentTexture, GLsizei width, GLsizei height, GLsizei depth, int border, GLenum format, GLenum type)
: sw::Surface(parentTexture->getResource(), width, height, depth, border, 1, SelectInternalFormat(format, type), true, true), : sw::Surface(parentTexture->getResource(), width, height, depth, border, 1, SelectInternalFormat(format, type), true, true),
width(width), height(height), format(format), type(type), internalFormat(SelectInternalFormat(format, type)), depth(depth), width(width), height(height), depth(depth), format(format), type(type), internalFormat(SelectInternalFormat(format, type)),
parentTexture(parentTexture) parentTexture(parentTexture)
{ {
shared = false; shared = false;
...@@ -75,7 +75,7 @@ protected: ...@@ -75,7 +75,7 @@ protected:
// Native EGL image // Native EGL image
Image(GLsizei width, GLsizei height, GLenum format, GLenum type, int pitchP) Image(GLsizei width, GLsizei height, GLenum format, GLenum type, int pitchP)
: sw::Surface(nullptr, width, height, 1, 0, 1, SelectInternalFormat(format, type), true, true, pitchP), : sw::Surface(nullptr, width, height, 1, 0, 1, SelectInternalFormat(format, type), true, true, pitchP),
width(width), height(height), format(format), type(type), internalFormat(SelectInternalFormat(format, type)), depth(1), width(width), height(height), depth(1), format(format), type(type), internalFormat(SelectInternalFormat(format, type)),
parentTexture(nullptr) parentTexture(nullptr)
{ {
shared = true; shared = true;
...@@ -85,8 +85,7 @@ protected: ...@@ -85,8 +85,7 @@ protected:
// Render target // Render target
Image(GLsizei width, GLsizei height, sw::Format internalFormat, int multiSampleDepth, bool lockable) Image(GLsizei width, GLsizei height, sw::Format internalFormat, int multiSampleDepth, bool lockable)
: sw::Surface(nullptr, width, height, 1, 0, multiSampleDepth, internalFormat, lockable, true), : sw::Surface(nullptr, width, height, 1, 0, multiSampleDepth, internalFormat, lockable, true),
width(width), height(height), format(0 /*GL_NONE*/), type(0 /*GL_NONE*/), internalFormat(internalFormat), width(width), height(height), depth(1), format(0 /*GL_NONE*/), type(0 /*GL_NONE*/), internalFormat(internalFormat),
depth(multiSampleDepth),
parentTexture(nullptr) parentTexture(nullptr)
{ {
shared = false; shared = false;
...@@ -200,10 +199,10 @@ public: ...@@ -200,10 +199,10 @@ public:
protected: protected:
const GLsizei width; const GLsizei width;
const GLsizei height; const GLsizei height;
const int depth;
const GLenum format; const GLenum format;
const GLenum type; const GLenum type;
const sw::Format internalFormat; const sw::Format internalFormat;
const int depth;
bool shared; // Used as an EGLImage bool shared; // Used as an EGLImage
......
...@@ -2731,21 +2731,24 @@ bool Context::applyRenderTarget() ...@@ -2731,21 +2731,24 @@ bool Context::applyRenderTarget()
if(framebuffer->getDrawBuffer(i) != GL_NONE) if(framebuffer->getDrawBuffer(i) != GL_NONE)
{ {
egl::Image *renderTarget = framebuffer->getRenderTarget(i); egl::Image *renderTarget = framebuffer->getRenderTarget(i);
device->setRenderTarget(i, renderTarget); GLint layer = framebuffer->getColorbufferLayer(i);
device->setRenderTarget(i, renderTarget, layer);
if(renderTarget) renderTarget->release(); if(renderTarget) renderTarget->release();
} }
else else
{ {
device->setRenderTarget(i, nullptr); device->setRenderTarget(i, nullptr, 0);
} }
} }
egl::Image *depthBuffer = framebuffer->getDepthBuffer(); egl::Image *depthBuffer = framebuffer->getDepthBuffer();
device->setDepthBuffer(depthBuffer); GLint dLayer = framebuffer->getDepthbufferLayer();
device->setDepthBuffer(depthBuffer, dLayer);
if(depthBuffer) depthBuffer->release(); if(depthBuffer) depthBuffer->release();
egl::Image *stencilBuffer = framebuffer->getStencilBuffer(); egl::Image *stencilBuffer = framebuffer->getStencilBuffer();
device->setStencilBuffer(stencilBuffer); GLint sLayer = framebuffer->getStencilbufferLayer();
device->setStencilBuffer(stencilBuffer, sLayer);
if(stencilBuffer) stencilBuffer->release(); if(stencilBuffer) stencilBuffer->release();
Viewport viewport; Viewport viewport;
...@@ -3203,7 +3206,7 @@ void Context::applyTexture(sw::SamplerType type, int index, Texture *baseTexture ...@@ -3203,7 +3206,7 @@ void Context::applyTexture(sw::SamplerType type, int index, Texture *baseTexture
device->setTextureLevel(sampler, 0, mipmapLevel, surface, sw::TEXTURE_2D); device->setTextureLevel(sampler, 0, mipmapLevel, surface, sw::TEXTURE_2D);
} }
} }
else if(baseTexture->getTarget() == GL_TEXTURE_3D_OES) else if(baseTexture->getTarget() == GL_TEXTURE_3D)
{ {
Texture3D *texture = static_cast<Texture3D*>(baseTexture); Texture3D *texture = static_cast<Texture3D*>(baseTexture);
......
...@@ -364,7 +364,7 @@ namespace es2 ...@@ -364,7 +364,7 @@ namespace es2
scissorEnable = enable; scissorEnable = enable;
} }
void Device::setRenderTarget(int index, egl::Image *renderTarget) void Device::setRenderTarget(int index, egl::Image *renderTarget, unsigned int layer)
{ {
if(renderTarget) if(renderTarget)
{ {
...@@ -378,10 +378,10 @@ namespace es2 ...@@ -378,10 +378,10 @@ namespace es2
this->renderTarget[index] = renderTarget; this->renderTarget[index] = renderTarget;
Renderer::setRenderTarget(index, renderTarget); Renderer::setRenderTarget(index, renderTarget, layer);
} }
void Device::setDepthBuffer(egl::Image *depthBuffer) void Device::setDepthBuffer(egl::Image *depthBuffer, unsigned int layer)
{ {
if(this->depthBuffer == depthBuffer) if(this->depthBuffer == depthBuffer)
{ {
...@@ -400,10 +400,10 @@ namespace es2 ...@@ -400,10 +400,10 @@ namespace es2
this->depthBuffer = depthBuffer; this->depthBuffer = depthBuffer;
Renderer::setDepthBuffer(depthBuffer); Renderer::setDepthBuffer(depthBuffer, layer);
} }
void Device::setStencilBuffer(egl::Image *stencilBuffer) void Device::setStencilBuffer(egl::Image *stencilBuffer, unsigned int layer)
{ {
if(this->stencilBuffer == stencilBuffer) if(this->stencilBuffer == stencilBuffer)
{ {
...@@ -422,7 +422,7 @@ namespace es2 ...@@ -422,7 +422,7 @@ namespace es2
this->stencilBuffer = stencilBuffer; this->stencilBuffer = stencilBuffer;
Renderer::setStencilBuffer(stencilBuffer); Renderer::setStencilBuffer(stencilBuffer, layer);
} }
void Device::setScissorRect(const sw::Rect &rect) void Device::setScissorRect(const sw::Rect &rect)
......
...@@ -65,9 +65,9 @@ namespace es2 ...@@ -65,9 +65,9 @@ namespace es2
void setPixelShader(const sw::PixelShader *shader); void setPixelShader(const sw::PixelShader *shader);
void setPixelShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count); void setPixelShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count);
void setScissorEnable(bool enable); void setScissorEnable(bool enable);
void setRenderTarget(int index, egl::Image *renderTarget); void setRenderTarget(int index, egl::Image *renderTarget, unsigned int layer);
void setDepthBuffer(egl::Image *depthBuffer); void setDepthBuffer(egl::Image *depthBuffer, unsigned int layer);
void setStencilBuffer(egl::Image *stencilBuffer); void setStencilBuffer(egl::Image *stencilBuffer, unsigned int layer);
void setScissorRect(const sw::Rect &rect); void setScissorRect(const sw::Rect &rect);
void setVertexShader(const sw::VertexShader *shader); void setVertexShader(const sw::VertexShader *shader);
void setVertexShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count); void setVertexShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count);
......
...@@ -32,19 +32,23 @@ bool Framebuffer::IsRenderbuffer(GLenum type) ...@@ -32,19 +32,23 @@ bool Framebuffer::IsRenderbuffer(GLenum type)
Framebuffer::Framebuffer() Framebuffer::Framebuffer()
{ {
readBuffer = GL_COLOR_ATTACHMENT0;
drawBuffer[0] = GL_COLOR_ATTACHMENT0;
for(int i = 1; i < MAX_COLOR_ATTACHMENTS; i++)
{
drawBuffer[i] = GL_NONE;
}
for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++) for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)
{ {
mColorbufferType[i] = GL_NONE; mColorbufferType[i] = GL_NONE;
mColorbufferLayer[i] = 0;
} }
mDepthbufferType = GL_NONE; mDepthbufferType = GL_NONE;
mDepthbufferLayer = 0;
mStencilbufferType = GL_NONE; mStencilbufferType = GL_NONE;
mStencilbufferLayer = 0;
readBuffer = GL_COLOR_ATTACHMENT0;
drawBuffer[0] = GL_COLOR_ATTACHMENT0;
for(int i = 1; i < MAX_COLOR_ATTACHMENTS; ++i)
{
drawBuffer[i] = GL_NONE;
}
} }
Framebuffer::~Framebuffer() Framebuffer::~Framebuffer()
...@@ -57,7 +61,7 @@ Framebuffer::~Framebuffer() ...@@ -57,7 +61,7 @@ Framebuffer::~Framebuffer()
mStencilbufferPointer = nullptr; mStencilbufferPointer = nullptr;
} }
Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint level, GLint layer) const Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint level) const
{ {
Context *context = getContext(); Context *context = getContext();
Renderbuffer *buffer = nullptr; Renderbuffer *buffer = nullptr;
...@@ -72,7 +76,7 @@ Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint ...@@ -72,7 +76,7 @@ Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint
} }
else if(IsTextureTarget(type)) else if(IsTextureTarget(type))
{ {
buffer = context->getTexture(handle)->getRenderbuffer(type, level, layer); buffer = context->getTexture(handle)->getRenderbuffer(type, level);
} }
else UNREACHABLE(type); else UNREACHABLE(type);
...@@ -82,19 +86,22 @@ Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint ...@@ -82,19 +86,22 @@ Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint
void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer, GLuint index, GLint level, GLint layer) void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer, GLuint index, GLint level, GLint layer)
{ {
mColorbufferType[index] = (colorbuffer != 0) ? type : GL_NONE; mColorbufferType[index] = (colorbuffer != 0) ? type : GL_NONE;
mColorbufferPointer[index] = lookupRenderbuffer(type, colorbuffer, level, layer); mColorbufferPointer[index] = lookupRenderbuffer(type, colorbuffer, level);
mColorbufferLayer[index] = layer;
} }
void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer, GLint level, GLint layer) void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer, GLint level, GLint layer)
{ {
mDepthbufferType = (depthbuffer != 0) ? type : GL_NONE; mDepthbufferType = (depthbuffer != 0) ? type : GL_NONE;
mDepthbufferPointer = lookupRenderbuffer(type, depthbuffer, level, layer); mDepthbufferPointer = lookupRenderbuffer(type, depthbuffer, level);
mDepthbufferLayer = layer;
} }
void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer, GLint level, GLint layer) void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer, GLint level, GLint layer)
{ {
mStencilbufferType = (stencilbuffer != 0) ? type : GL_NONE; mStencilbufferType = (stencilbuffer != 0) ? type : GL_NONE;
mStencilbufferPointer = lookupRenderbuffer(type, stencilbuffer, level, layer); mStencilbufferPointer = lookupRenderbuffer(type, stencilbuffer, level);
mStencilbufferLayer = layer;
} }
void Framebuffer::setReadBuffer(GLenum buf) void Framebuffer::setReadBuffer(GLenum buf)
...@@ -277,18 +284,17 @@ GLuint Framebuffer::getStencilbufferName() ...@@ -277,18 +284,17 @@ GLuint Framebuffer::getStencilbufferName()
GLint Framebuffer::getColorbufferLayer(GLuint index) GLint Framebuffer::getColorbufferLayer(GLuint index)
{ {
Renderbuffer *colorbuffer = mColorbufferPointer[index]; return mColorbufferLayer[index];
return colorbuffer ? colorbuffer->getLayer() : 0;
} }
GLint Framebuffer::getDepthbufferLayer() GLint Framebuffer::getDepthbufferLayer()
{ {
return mDepthbufferPointer ? mDepthbufferPointer->getLayer() : 0; return mDepthbufferLayer;
} }
GLint Framebuffer::getStencilbufferLayer() GLint Framebuffer::getStencilbufferLayer()
{ {
return mStencilbufferPointer ? mStencilbufferPointer->getLayer() : 0; return mStencilbufferLayer;
} }
bool Framebuffer::hasStencil() bool Framebuffer::hasStencil()
...@@ -332,7 +338,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -332,7 +338,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
if(colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0 || (colorbuffer->getDepth() <= colorbuffer->getLayer())) if(colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0 || (colorbuffer->getDepth() <= mColorbufferLayer[i]))
{ {
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
...@@ -373,7 +379,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -373,7 +379,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
} }
else if(samples != colorbuffer->getSamples()) else if(samples != colorbuffer->getSamples())
{ {
return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE; return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
} }
} }
} }
...@@ -390,7 +396,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -390,7 +396,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
if(depthbuffer->getWidth() == 0 || depthbuffer->getHeight() == 0) if(depthbuffer->getWidth() == 0 || depthbuffer->getHeight() == 0 || (depthbuffer->getDepth() <= mDepthbufferLayer))
{ {
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
...@@ -427,7 +433,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -427,7 +433,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
} }
else if(samples != depthbuffer->getSamples()) else if(samples != depthbuffer->getSamples())
{ {
return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE; return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
} }
} }
...@@ -440,7 +446,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -440,7 +446,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
if(stencilbuffer->getWidth() == 0 || stencilbuffer->getHeight() == 0) if(stencilbuffer->getWidth() == 0 || stencilbuffer->getHeight() == 0 || (stencilbuffer->getDepth() <= mStencilbufferLayer))
{ {
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
...@@ -479,7 +485,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -479,7 +485,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
} }
else if(samples != stencilbuffer->getSamples()) else if(samples != stencilbuffer->getSamples())
{ {
return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE; return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
} }
} }
......
...@@ -96,15 +96,18 @@ protected: ...@@ -96,15 +96,18 @@ protected:
GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS]; GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS];
gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS]; gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS];
GLint mColorbufferLayer[MAX_COLOR_ATTACHMENTS];
GLenum mDepthbufferType; GLenum mDepthbufferType;
gl::BindingPointer<Renderbuffer> mDepthbufferPointer; gl::BindingPointer<Renderbuffer> mDepthbufferPointer;
GLint mDepthbufferLayer;
GLenum mStencilbufferType; GLenum mStencilbufferType;
gl::BindingPointer<Renderbuffer> mStencilbufferPointer; gl::BindingPointer<Renderbuffer> mStencilbufferPointer;
GLint mStencilbufferLayer;
private: private:
Renderbuffer *lookupRenderbuffer(GLenum type, GLuint handle, GLint level, GLint layer) const; Renderbuffer *lookupRenderbuffer(GLenum type, GLuint handle, GLint level) const;
}; };
class DefaultFramebuffer : public Framebuffer class DefaultFramebuffer : public Framebuffer
......
...@@ -129,18 +129,14 @@ GLint RenderbufferTexture2D::getFormat() const ...@@ -129,18 +129,14 @@ GLint RenderbufferTexture2D::getFormat() const
GLsizei RenderbufferTexture2D::getSamples() const GLsizei RenderbufferTexture2D::getSamples() const
{ {
return 0; return 0; // Core OpenGL ES 3.0 does not support multisample textures.
} }
///// RenderbufferTexture3D Implementation //////// ///// RenderbufferTexture3D Implementation ////////
RenderbufferTexture3D::RenderbufferTexture3D(Texture3D *texture, GLint level, GLint layer) : mLevel(level), mLayer(layer) RenderbufferTexture3D::RenderbufferTexture3D(Texture3D *texture, GLint level) : mLevel(level)
{ {
mTexture3D = texture; mTexture3D = texture;
if(mLayer != 0)
{
UNIMPLEMENTED();
}
} }
RenderbufferTexture3D::~RenderbufferTexture3D() RenderbufferTexture3D::~RenderbufferTexture3D()
...@@ -201,7 +197,7 @@ GLint RenderbufferTexture3D::getFormat() const ...@@ -201,7 +197,7 @@ GLint RenderbufferTexture3D::getFormat() const
GLsizei RenderbufferTexture3D::getSamples() const GLsizei RenderbufferTexture3D::getSamples() const
{ {
return 0; return 0; // Core OpenGL ES 3.0 does not support multisample textures.
} }
///// RenderbufferTextureCubeMap Implementation //////// ///// RenderbufferTextureCubeMap Implementation ////////
...@@ -264,7 +260,7 @@ GLint RenderbufferTextureCubeMap::getFormat() const ...@@ -264,7 +260,7 @@ GLint RenderbufferTextureCubeMap::getFormat() const
GLsizei RenderbufferTextureCubeMap::getSamples() const GLsizei RenderbufferTextureCubeMap::getSamples() const
{ {
return 0; return 0; // Core OpenGL ES 3.0 does not support multisample textures.
} }
////// Renderbuffer Implementation ////// ////// Renderbuffer Implementation //////
...@@ -330,11 +326,6 @@ GLsizei Renderbuffer::getDepth() const ...@@ -330,11 +326,6 @@ GLsizei Renderbuffer::getDepth() const
return mInstance->getDepth(); return mInstance->getDepth();
} }
GLint Renderbuffer::getLayer() const
{
return mInstance->getLayer();
}
GLint Renderbuffer::getLevel() const GLint Renderbuffer::getLevel() const
{ {
return mInstance->getLevel(); return mInstance->getLevel();
...@@ -380,11 +371,6 @@ GLsizei Renderbuffer::getSamples() const ...@@ -380,11 +371,6 @@ GLsizei Renderbuffer::getSamples() const
return mInstance->getSamples(); return mInstance->getSamples();
} }
void Renderbuffer::setLayer(GLint layer)
{
return mInstance->setLayer(layer);
}
void Renderbuffer::setLevel(GLint level) void Renderbuffer::setLevel(GLint level)
{ {
return mInstance->setLevel(level); return mInstance->setLevel(level);
......
...@@ -56,12 +56,10 @@ public: ...@@ -56,12 +56,10 @@ public:
virtual GLsizei getWidth() const = 0; virtual GLsizei getWidth() const = 0;
virtual GLsizei getHeight() const = 0; virtual GLsizei getHeight() const = 0;
virtual GLsizei getDepth() const { return 1; } virtual GLsizei getDepth() const { return 1; }
virtual GLint getLayer() const { return 0; }
virtual GLint getLevel() const { return 0; } virtual GLint getLevel() const { return 0; }
virtual GLint getFormat() const = 0; virtual GLint getFormat() const = 0;
virtual GLsizei getSamples() const = 0; virtual GLsizei getSamples() const = 0;
virtual void setLayer(GLint) {}
virtual void setLevel(GLint) {} virtual void setLevel(GLint) {}
GLuint getRedSize() const; GLuint getRedSize() const;
...@@ -77,22 +75,22 @@ class RenderbufferTexture2D : public RenderbufferInterface ...@@ -77,22 +75,22 @@ class RenderbufferTexture2D : public RenderbufferInterface
public: public:
RenderbufferTexture2D(Texture2D *texture, GLint level); RenderbufferTexture2D(Texture2D *texture, GLint level);
virtual ~RenderbufferTexture2D(); ~RenderbufferTexture2D() override;
virtual void addProxyRef(const Renderbuffer *proxy); void addProxyRef(const Renderbuffer *proxy) override;
virtual void releaseProxy(const Renderbuffer *proxy); void releaseProxy(const Renderbuffer *proxy) override;
virtual egl::Image *getRenderTarget(); egl::Image *getRenderTarget() override;
virtual egl::Image *createSharedImage(); egl::Image *createSharedImage() override;
virtual bool isShared() const; bool isShared() const override;
virtual GLsizei getWidth() const; GLsizei getWidth() const override;
virtual GLsizei getHeight() const; GLsizei getHeight() const override;
virtual GLint getLevel() const { return mLevel; } GLint getLevel() const override { return mLevel; }
virtual GLint getFormat() const; GLint getFormat() const override;
virtual GLsizei getSamples() const; GLsizei getSamples() const override;
virtual void setLevel(GLint level) { mLevel = level; } void setLevel(GLint level) override { mLevel = level; }
private: private:
gl::BindingPointer<Texture2D> mTexture2D; gl::BindingPointer<Texture2D> mTexture2D;
...@@ -102,32 +100,29 @@ private: ...@@ -102,32 +100,29 @@ private:
class RenderbufferTexture3D : public RenderbufferInterface class RenderbufferTexture3D : public RenderbufferInterface
{ {
public: public:
RenderbufferTexture3D(Texture3D *texture, GLint level, GLint layer); RenderbufferTexture3D(Texture3D *texture, GLint level);
virtual ~RenderbufferTexture3D(); ~RenderbufferTexture3D() override;
virtual void addProxyRef(const Renderbuffer *proxy); void addProxyRef(const Renderbuffer *proxy) override;
virtual void releaseProxy(const Renderbuffer *proxy); void releaseProxy(const Renderbuffer *proxy) override;
virtual egl::Image *getRenderTarget(); egl::Image *getRenderTarget() override;
virtual egl::Image *createSharedImage(); egl::Image *createSharedImage() override;
virtual bool isShared() const; bool isShared() const override;
virtual GLsizei getWidth() const; GLsizei getWidth() const override;
virtual GLsizei getHeight() const; GLsizei getHeight() const override;
virtual GLsizei getDepth() const; GLsizei getDepth() const override;
virtual GLint getLayer() const { return mLayer; } GLint getLevel() const override { return mLevel; }
virtual GLint getLevel() const { return mLevel; } GLint getFormat() const override;
virtual GLint getFormat() const; GLsizei getSamples() const override;
virtual GLsizei getSamples() const;
virtual void setLayer(GLint layer) { mLayer = layer; } void setLevel(GLint level) override { mLevel = level; }
virtual void setLevel(GLint level) { mLevel = level; }
private: private:
gl::BindingPointer<Texture3D> mTexture3D; gl::BindingPointer<Texture3D> mTexture3D;
GLint mLevel; GLint mLevel;
GLint mLayer;
}; };
class RenderbufferTextureCubeMap : public RenderbufferInterface class RenderbufferTextureCubeMap : public RenderbufferInterface
...@@ -135,22 +130,22 @@ class RenderbufferTextureCubeMap : public RenderbufferInterface ...@@ -135,22 +130,22 @@ class RenderbufferTextureCubeMap : public RenderbufferInterface
public: public:
RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target, GLint level); RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target, GLint level);
virtual ~RenderbufferTextureCubeMap(); ~RenderbufferTextureCubeMap() override;
virtual void addProxyRef(const Renderbuffer *proxy); void addProxyRef(const Renderbuffer *proxy) override;
virtual void releaseProxy(const Renderbuffer *proxy); void releaseProxy(const Renderbuffer *proxy) override;
virtual egl::Image *getRenderTarget(); egl::Image *getRenderTarget() override;
virtual egl::Image *createSharedImage(); egl::Image *createSharedImage() override;
virtual bool isShared() const; bool isShared() const override;
virtual GLsizei getWidth() const; GLsizei getWidth() const override;
virtual GLsizei getHeight() const; GLsizei getHeight() const override;
virtual GLint getLevel() const { return mLevel; } GLint getLevel() const override { return mLevel; }
virtual GLint getFormat() const; GLint getFormat() const override;
virtual GLsizei getSamples() const; GLsizei getSamples() const override;
virtual void setLevel(GLint level) { mLevel = level; } void setLevel(GLint level) override { mLevel = level; }
private: private:
gl::BindingPointer<TextureCubeMap> mTextureCubeMap; gl::BindingPointer<TextureCubeMap> mTextureCubeMap;
...@@ -166,16 +161,16 @@ class RenderbufferStorage : public RenderbufferInterface ...@@ -166,16 +161,16 @@ class RenderbufferStorage : public RenderbufferInterface
public: public:
RenderbufferStorage(); RenderbufferStorage();
virtual ~RenderbufferStorage() = 0; ~RenderbufferStorage() override = 0;
virtual egl::Image *getRenderTarget() = 0; egl::Image *getRenderTarget() override = 0;
virtual egl::Image *createSharedImage() = 0; egl::Image *createSharedImage() override = 0;
virtual bool isShared() const = 0; bool isShared() const override = 0;
virtual GLsizei getWidth() const; GLsizei getWidth() const override;
virtual GLsizei getHeight() const; GLsizei getHeight() const override;
virtual GLint getFormat() const; GLint getFormat() const override;
virtual GLsizei getSamples() const; GLsizei getSamples() const override;
protected: protected:
GLsizei mWidth; GLsizei mWidth;
...@@ -192,14 +187,14 @@ class Renderbuffer : public gl::NamedObject ...@@ -192,14 +187,14 @@ class Renderbuffer : public gl::NamedObject
public: public:
Renderbuffer(GLuint name, RenderbufferInterface *storage); Renderbuffer(GLuint name, RenderbufferInterface *storage);
virtual ~Renderbuffer(); ~Renderbuffer() override;
// These functions from Object are overloaded here because // These functions from Object are overloaded here because
// Textures need to maintain their own count of references to them via // Textures need to maintain their own count of references to them via
// Renderbuffers/RenderbufferTextures. These functions invoke those // Renderbuffers/RenderbufferTextures. These functions invoke those
// reference counting functions on the RenderbufferInterface. // reference counting functions on the RenderbufferInterface.
virtual void addRef(); void addRef() override;
virtual void release(); void release() override;
egl::Image *getRenderTarget(); egl::Image *getRenderTarget();
virtual egl::Image *createSharedImage(); virtual egl::Image *createSharedImage();
...@@ -208,7 +203,6 @@ public: ...@@ -208,7 +203,6 @@ public:
GLsizei getWidth() const; GLsizei getWidth() const;
GLsizei getHeight() const; GLsizei getHeight() const;
GLsizei getDepth() const; GLsizei getDepth() const;
GLint getLayer() const;
GLint getLevel() const; GLint getLevel() const;
GLint getFormat() const; GLint getFormat() const;
GLuint getRedSize() const; GLuint getRedSize() const;
...@@ -219,7 +213,6 @@ public: ...@@ -219,7 +213,6 @@ public:
GLuint getStencilSize() const; GLuint getStencilSize() const;
GLsizei getSamples() const; GLsizei getSamples() const;
void setLayer(GLint layer);
void setLevel(GLint level); void setLevel(GLint level);
void setStorage(RenderbufferStorage *newStorage); void setStorage(RenderbufferStorage *newStorage);
...@@ -233,11 +226,11 @@ public: ...@@ -233,11 +226,11 @@ public:
explicit Colorbuffer(egl::Image *renderTarget); explicit Colorbuffer(egl::Image *renderTarget);
Colorbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); Colorbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
virtual ~Colorbuffer(); ~Colorbuffer() override;
virtual egl::Image *getRenderTarget(); egl::Image *getRenderTarget() override;
virtual egl::Image *createSharedImage(); egl::Image *createSharedImage() override;
virtual bool isShared() const; bool isShared() const override;
private: private:
egl::Image *mRenderTarget; egl::Image *mRenderTarget;
...@@ -251,9 +244,9 @@ public: ...@@ -251,9 +244,9 @@ public:
~DepthStencilbuffer(); ~DepthStencilbuffer();
virtual egl::Image *getRenderTarget(); egl::Image *getRenderTarget() override;
virtual egl::Image *createSharedImage(); egl::Image *createSharedImage() override;
virtual bool isShared() const; bool isShared() const override;
protected: protected:
egl::Image *mDepthStencil; egl::Image *mDepthStencil;
...@@ -265,7 +258,7 @@ public: ...@@ -265,7 +258,7 @@ public:
explicit Depthbuffer(egl::Image *depthStencil); explicit Depthbuffer(egl::Image *depthStencil);
Depthbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); Depthbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
virtual ~Depthbuffer(); ~Depthbuffer() override;
}; };
class Stencilbuffer : public DepthStencilbuffer class Stencilbuffer : public DepthStencilbuffer
...@@ -274,7 +267,7 @@ public: ...@@ -274,7 +267,7 @@ public:
explicit Stencilbuffer(egl::Image *depthStencil); explicit Stencilbuffer(egl::Image *depthStencil);
Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples); Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
virtual ~Stencilbuffer(); ~Stencilbuffer() override;
}; };
} }
......
...@@ -894,7 +894,7 @@ egl::Image *Texture2D::getImage(unsigned int level) ...@@ -894,7 +894,7 @@ egl::Image *Texture2D::getImage(unsigned int level)
return image[level]; return image[level];
} }
Renderbuffer *Texture2D::getRenderbuffer(GLenum target, GLint level, GLint layer) Renderbuffer *Texture2D::getRenderbuffer(GLenum target, GLint level)
{ {
if(target != GL_TEXTURE_2D) if(target != GL_TEXTURE_2D)
{ {
...@@ -1439,7 +1439,7 @@ void TextureCubeMap::generateMipmaps() ...@@ -1439,7 +1439,7 @@ void TextureCubeMap::generateMipmaps()
} }
} }
Renderbuffer *TextureCubeMap::getRenderbuffer(GLenum target, GLint level, GLint layer) Renderbuffer *TextureCubeMap::getRenderbuffer(GLenum target, GLint level)
{ {
if(!IsCubemapTextureTarget(target)) if(!IsCubemapTextureTarget(target))
{ {
...@@ -1878,7 +1878,7 @@ egl::Image *Texture3D::getImage(unsigned int level) ...@@ -1878,7 +1878,7 @@ egl::Image *Texture3D::getImage(unsigned int level)
return image[level]; return image[level];
} }
Renderbuffer *Texture3D::getRenderbuffer(GLenum target, GLint level, GLint layer) Renderbuffer *Texture3D::getRenderbuffer(GLenum target, GLint level)
{ {
if(target != getTarget()) if(target != getTarget())
{ {
...@@ -1887,12 +1887,11 @@ Renderbuffer *Texture3D::getRenderbuffer(GLenum target, GLint level, GLint layer ...@@ -1887,12 +1887,11 @@ Renderbuffer *Texture3D::getRenderbuffer(GLenum target, GLint level, GLint layer
if(!mColorbufferProxy) if(!mColorbufferProxy)
{ {
mColorbufferProxy = new Renderbuffer(name, new RenderbufferTexture3D(this, level, layer)); mColorbufferProxy = new Renderbuffer(name, new RenderbufferTexture3D(this, level));
} }
else else
{ {
mColorbufferProxy->setLevel(level); mColorbufferProxy->setLevel(level);
mColorbufferProxy->setLayer(layer);
} }
return mColorbufferProxy; return mColorbufferProxy;
......
...@@ -103,7 +103,7 @@ public: ...@@ -103,7 +103,7 @@ public:
virtual bool isCompressed(GLenum target, GLint level) const = 0; virtual bool isCompressed(GLenum target, GLint level) const = 0;
virtual bool isDepth(GLenum target, GLint level) const = 0; virtual bool isDepth(GLenum target, GLint level) const = 0;
virtual Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer) = 0; virtual Renderbuffer *getRenderbuffer(GLenum target, GLint level) = 0;
virtual egl::Image *getRenderTarget(GLenum target, unsigned int level) = 0; virtual egl::Image *getRenderTarget(GLenum target, unsigned int level) = 0;
egl::Image *createSharedImage(GLenum target, unsigned int level); egl::Image *createSharedImage(GLenum target, unsigned int level);
virtual bool isShared(GLenum target, unsigned int level) const = 0; virtual bool isShared(GLenum target, unsigned int level) const = 0;
...@@ -179,7 +179,7 @@ public: ...@@ -179,7 +179,7 @@ public:
void generateMipmaps() override; void generateMipmaps() override;
Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer) override; Renderbuffer *getRenderbuffer(GLenum target, GLint level) override;
egl::Image *getRenderTarget(GLenum target, unsigned int level) override; egl::Image *getRenderTarget(GLenum target, unsigned int level) override;
bool isShared(GLenum target, unsigned int level) const override; bool isShared(GLenum target, unsigned int level) const override;
...@@ -236,7 +236,7 @@ public: ...@@ -236,7 +236,7 @@ public:
void generateMipmaps() override; void generateMipmaps() override;
void updateBorders(int level); void updateBorders(int level);
Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer) override; Renderbuffer *getRenderbuffer(GLenum target, GLint level) override;
egl::Image *getRenderTarget(GLenum target, unsigned int level) override; egl::Image *getRenderTarget(GLenum target, unsigned int level) override;
bool isShared(GLenum target, unsigned int level) const override; bool isShared(GLenum target, unsigned int level) const override;
...@@ -297,7 +297,7 @@ public: ...@@ -297,7 +297,7 @@ public:
void generateMipmaps() override; void generateMipmaps() override;
Renderbuffer *getRenderbuffer(GLenum target, GLint level, GLint layer) override; Renderbuffer *getRenderbuffer(GLenum target, GLint level) override;
egl::Image *getRenderTarget(GLenum target, unsigned int level) override; egl::Image *getRenderTarget(GLenum target, unsigned int level) override;
bool isShared(GLenum target, unsigned int level) const override; bool isShared(GLenum target, unsigned int level) const override;
......
...@@ -385,7 +385,7 @@ void BindTexture(GLenum target, GLuint texture) ...@@ -385,7 +385,7 @@ void BindTexture(GLenum target, GLuint texture)
} }
context->bindTexture2DArray(texture); context->bindTexture2DArray(texture);
break; break;
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
context->bindTexture3D(texture); context->bindTexture3D(texture);
break; break;
default: default:
...@@ -2273,7 +2273,7 @@ void GenerateMipmap(GLenum target) ...@@ -2273,7 +2273,7 @@ void GenerateMipmap(GLenum target)
texture = context->getTexture2DArray(); texture = context->getTexture2DArray();
} }
break; break;
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
texture = context->getTexture3D(); texture = context->getTexture3D();
break; break;
default: default:
...@@ -3356,7 +3356,7 @@ void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) ...@@ -3356,7 +3356,7 @@ void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break; case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break; case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break; case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
case GL_RENDERBUFFER_SAMPLES_ANGLE: *params = renderbuffer->getSamples(); break; case GL_RENDERBUFFER_SAMPLES: *params = renderbuffer->getSamples(); break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
...@@ -3576,7 +3576,7 @@ void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) ...@@ -3576,7 +3576,7 @@ void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
texture = context->getTexture2DArray(); texture = context->getTexture2DArray();
} }
break; break;
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
texture = context->getTexture3D(); texture = context->getTexture3D();
break; break;
default: default:
...@@ -3729,7 +3729,7 @@ void GetTexParameteriv(GLenum target, GLenum pname, GLint* params) ...@@ -3729,7 +3729,7 @@ void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
texture = context->getTexture2DArray(); texture = context->getTexture2DArray();
} }
break; break;
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
texture = context->getTexture3D(); texture = context->getTexture3D();
break; break;
default: default:
...@@ -4189,19 +4189,23 @@ void Hint(GLenum target, GLenum mode) ...@@ -4189,19 +4189,23 @@ void Hint(GLenum target, GLenum mode)
} }
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
switch(target)
if(context)
{ {
case GL_GENERATE_MIPMAP_HINT: switch(target)
if(context) context->setGenerateMipmapHint(mode); {
break; case GL_GENERATE_MIPMAP_HINT:
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: context->setGenerateMipmapHint(mode);
if(context) context->setFragmentShaderDerivativeHint(mode); break;
break; case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
case GL_TEXTURE_FILTERING_HINT_CHROMIUM: context->setFragmentShaderDerivativeHint(mode);
if(context) context->setTextureFilteringHint(mode); break;
break; case GL_TEXTURE_FILTERING_HINT_CHROMIUM:
default: context->setTextureFilteringHint(mode);
return error(GL_INVALID_ENUM); break;
default:
return error(GL_INVALID_ENUM);
}
} }
} }
...@@ -5116,7 +5120,7 @@ void TexParameterf(GLenum target, GLenum pname, GLfloat param) ...@@ -5116,7 +5120,7 @@ void TexParameterf(GLenum target, GLenum pname, GLfloat param)
texture = context->getTexture2DArray(); texture = context->getTexture2DArray();
} }
break; break;
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
texture = context->getTexture3D(); texture = context->getTexture3D();
break; break;
case GL_TEXTURE_CUBE_MAP: case GL_TEXTURE_CUBE_MAP:
...@@ -5265,7 +5269,7 @@ void TexParameteri(GLenum target, GLenum pname, GLint param) ...@@ -5265,7 +5269,7 @@ void TexParameteri(GLenum target, GLenum pname, GLint param)
texture = context->getTexture2DArray(); texture = context->getTexture2DArray();
} }
break; break;
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
texture = context->getTexture3D(); texture = context->getTexture3D();
break; break;
case GL_TEXTURE_CUBE_MAP: case GL_TEXTURE_CUBE_MAP:
...@@ -6239,7 +6243,7 @@ void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei wi ...@@ -6239,7 +6243,7 @@ void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei wi
switch(target) switch(target)
{ {
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
switch(format) switch(format)
{ {
case GL_DEPTH_COMPONENT: case GL_DEPTH_COMPONENT:
...@@ -6311,7 +6315,7 @@ void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, ...@@ -6311,7 +6315,7 @@ void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset,
switch(target) switch(target)
{ {
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -6364,7 +6368,7 @@ void CopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffs ...@@ -6364,7 +6368,7 @@ void CopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffs
switch(target) switch(target)
{ {
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -6413,7 +6417,7 @@ void CompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, ...@@ -6413,7 +6417,7 @@ void CompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat,
switch(target) switch(target)
{ {
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -6484,7 +6488,7 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint ...@@ -6484,7 +6488,7 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint
switch(target) switch(target)
{ {
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -6566,8 +6570,8 @@ void FramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget, ...@@ -6566,8 +6570,8 @@ void FramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget,
switch(textarget) switch(textarget)
{ {
case GL_TEXTURE_3D_OES: case GL_TEXTURE_3D:
if(tex->getTarget() != GL_TEXTURE_3D_OES) if(tex->getTarget() != GL_TEXTURE_3D)
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
......
...@@ -3338,22 +3338,22 @@ namespace sw ...@@ -3338,22 +3338,22 @@ namespace sw
const bool entire = x0 == 0 && y0 == 0 && width == internal.width && height == internal.height; const bool entire = x0 == 0 && y0 == 0 && width == internal.width && height == internal.height;
const Lock lock = entire ? LOCK_DISCARD : LOCK_WRITEONLY; const Lock lock = entire ? LOCK_DISCARD : LOCK_WRITEONLY;
int width2 = (internal.width + 1) & ~1;
int x1 = x0 + width; int x1 = x0 + width;
int y1 = y0 + height; int y1 = y0 + height;
if(!hasQuadLayout(internal.format)) if(!hasQuadLayout(internal.format))
{ {
float *target = (float*)lockInternal(0, 0, 0, lock, PUBLIC) + x0 + width2 * y0; float *target = (float*)lockInternal(x0, y0, 0, lock, PUBLIC);
for(int z = 0; z < internal.samples; z++) for(int z = 0; z < internal.samples; z++)
{ {
float *row = target;
for(int y = y0; y < y1; y++) for(int y = y0; y < y1; y++)
{ {
memfill4(target, (int&)depth, 4 * width); memfill4(row, (int&)depth, width * sizeof(float));
target += width2; row += internal.pitchP;
} }
target += internal.sliceP;
} }
unlockInternal(); unlockInternal();
...@@ -3376,7 +3376,7 @@ namespace sw ...@@ -3376,7 +3376,7 @@ namespace sw
{ {
for(int y = y0; y < y1; y++) for(int y = y0; y < y1; y++)
{ {
float *target = buffer + (y & ~1) * width2 + (y & 1) * 2; float *target = buffer + (y & ~1) * internal.pitchP + (y & 1) * 2;
if((y & 1) == 0 && y + 1 < y1) // Fill quad line at once if((y & 1) == 0 && y + 1 < y1) // Fill quad line at once
{ {
...@@ -3458,8 +3458,6 @@ namespace sw ...@@ -3458,8 +3458,6 @@ namespace sw
if(y0 < 0) {height += y0; y0 = 0;} if(y0 < 0) {height += y0; y0 = 0;}
if(y0 + height > internal.height) height = internal.height - y0; if(y0 + height > internal.height) height = internal.height - y0;
int width2 = (internal.width + 1) & ~1;
int x1 = x0 + width; int x1 = x0 + width;
int y1 = y0 + height; int y1 = y0 + height;
...@@ -3480,7 +3478,7 @@ namespace sw ...@@ -3480,7 +3478,7 @@ namespace sw
{ {
for(int y = y0; y < y1; y++) for(int y = y0; y < y1; y++)
{ {
char *target = buffer + (y & ~1) * width2 + (y & 1) * 2; char *target = buffer + (y & ~1) * stencil.pitchP + (y & 1) * 2;
if((y & 1) == 0 && y + 1 < y1 && mask == 0xFF) // Fill quad line at once if((y & 1) == 0 && y + 1 < y1 && mask == 0xFF) // Fill quad line at once
{ {
...@@ -3502,8 +3500,9 @@ namespace sw ...@@ -3502,8 +3500,9 @@ namespace sw
} }
else else
{ {
for(int x = x0, i = oddX0; x < x1; x++, i = (x & ~1) * 2 + (x & 1)) for(int x = x0; x < x1; x++)
{ {
int i = (x & ~1) * 2 + (x & 1);
target[i] = maskedS | (target[i] & invMask); target[i] = maskedS | (target[i] & invMask);
} }
} }
......
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