OSDN Git Service

Use matching internal and external formats for RGBA8 images.
[android-x86/external-swiftshader.git] / src / OpenGL / libGLESv2 / Framebuffer.cpp
index 0235e82..d59b715 100644 (file)
@@ -31,9 +31,9 @@ Framebuffer::Framebuffer()
 
 Framebuffer::~Framebuffer()
 {
-       mColorbufferPointer.set(NULL);
-       mDepthbufferPointer.set(NULL);
-       mStencilbufferPointer.set(NULL);
+       mColorbufferPointer = NULL;
+       mDepthbufferPointer = NULL;
+       mStencilbufferPointer = NULL;
 }
 
 Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const
@@ -64,60 +64,60 @@ Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const
 void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer)
 {
        mColorbufferType = (colorbuffer != 0) ? type : GL_NONE;
-       mColorbufferPointer.set(lookupRenderbuffer(type, colorbuffer));
+       mColorbufferPointer = lookupRenderbuffer(type, colorbuffer);
 }
 
 void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer)
 {
        mDepthbufferType = (depthbuffer != 0) ? type : GL_NONE;
-       mDepthbufferPointer.set(lookupRenderbuffer(type, depthbuffer));
+       mDepthbufferPointer = lookupRenderbuffer(type, depthbuffer);
 }
 
 void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer)
 {
        mStencilbufferType = (stencilbuffer != 0) ? type : GL_NONE;
-       mStencilbufferPointer.set(lookupRenderbuffer(type, stencilbuffer));
+       mStencilbufferPointer = lookupRenderbuffer(type, stencilbuffer);
 }
 
 void Framebuffer::detachTexture(GLuint texture)
 {
-       if(mColorbufferPointer.id() == texture && IsTextureTarget(mColorbufferType))
+       if(mColorbufferPointer.name() == texture && IsTextureTarget(mColorbufferType))
        {
                mColorbufferType = GL_NONE;
-               mColorbufferPointer.set(NULL);
+               mColorbufferPointer = NULL;
        }
 
-       if(mDepthbufferPointer.id() == texture && IsTextureTarget(mDepthbufferType))
+       if(mDepthbufferPointer.name() == texture && IsTextureTarget(mDepthbufferType))
        {
                mDepthbufferType = GL_NONE;
-               mDepthbufferPointer.set(NULL);
+               mDepthbufferPointer = NULL;
        }
 
-       if(mStencilbufferPointer.id() == texture && IsTextureTarget(mStencilbufferType))
+       if(mStencilbufferPointer.name() == texture && IsTextureTarget(mStencilbufferType))
        {
                mStencilbufferType = GL_NONE;
-               mStencilbufferPointer.set(NULL);
+               mStencilbufferPointer = NULL;
        }
 }
 
 void Framebuffer::detachRenderbuffer(GLuint renderbuffer)
 {
-       if(mColorbufferPointer.id() == renderbuffer && mColorbufferType == GL_RENDERBUFFER)
+       if(mColorbufferPointer.name() == renderbuffer && mColorbufferType == GL_RENDERBUFFER)
        {
                mColorbufferType = GL_NONE;
-               mColorbufferPointer.set(NULL);
+               mColorbufferPointer = NULL;
        }
 
-       if(mDepthbufferPointer.id() == renderbuffer && mDepthbufferType == GL_RENDERBUFFER)
+       if(mDepthbufferPointer.name() == renderbuffer && mDepthbufferType == GL_RENDERBUFFER)
        {
                mDepthbufferType = GL_NONE;
-               mDepthbufferPointer.set(NULL);
+               mDepthbufferPointer = NULL;
        }
 
-       if(mStencilbufferPointer.id() == renderbuffer && mStencilbufferType == GL_RENDERBUFFER)
+       if(mStencilbufferPointer.name() == renderbuffer && mStencilbufferType == GL_RENDERBUFFER)
        {
                mStencilbufferType = GL_NONE;
-               mStencilbufferPointer.set(NULL);
+               mStencilbufferPointer = NULL;
        }
 }
 
@@ -125,7 +125,7 @@ void Framebuffer::detachRenderbuffer(GLuint renderbuffer)
 // caller must Release() the returned surface
 egl::Image *Framebuffer::getRenderTarget()
 {
-       Renderbuffer *colorbuffer = mColorbufferPointer.get();
+       Renderbuffer *colorbuffer = mColorbufferPointer;
 
        if(colorbuffer)
        {
@@ -139,11 +139,11 @@ egl::Image *Framebuffer::getRenderTarget()
 // caller must Release() the returned surface
 egl::Image *Framebuffer::getDepthStencil()
 {
-       Renderbuffer *depthstencilbuffer = mDepthbufferPointer.get();
+       Renderbuffer *depthstencilbuffer = mDepthbufferPointer;
        
        if(!depthstencilbuffer)
        {
-               depthstencilbuffer = mStencilbufferPointer.get();
+               depthstencilbuffer = mStencilbufferPointer;
        }
 
        if(depthstencilbuffer)
@@ -156,17 +156,17 @@ egl::Image *Framebuffer::getDepthStencil()
 
 Renderbuffer *Framebuffer::getColorbuffer()
 {
-       return mColorbufferPointer.get();
+       return mColorbufferPointer;
 }
 
 Renderbuffer *Framebuffer::getDepthbuffer()
 {
-       return mDepthbufferPointer.get();
+       return mDepthbufferPointer;
 }
 
 Renderbuffer *Framebuffer::getStencilbuffer()
 {
-       return mStencilbufferPointer.get();
+       return mStencilbufferPointer;
 }
 
 GLenum Framebuffer::getColorbufferType()
@@ -184,19 +184,19 @@ GLenum Framebuffer::getStencilbufferType()
        return mStencilbufferType;
 }
 
-GLuint Framebuffer::getColorbufferHandle()
+GLuint Framebuffer::getColorbufferName()
 {
-       return mColorbufferPointer.id();
+       return mColorbufferPointer.name();
 }
 
-GLuint Framebuffer::getDepthbufferHandle()
+GLuint Framebuffer::getDepthbufferName()
 {
-       return mDepthbufferPointer.id();
+       return mDepthbufferPointer.name();
 }
 
-GLuint Framebuffer::getStencilbufferHandle()
+GLuint Framebuffer::getStencilbufferName()
 {
-       return mStencilbufferPointer.id();
+       return mStencilbufferPointer.name();
 }
 
 bool Framebuffer::hasStencil()
@@ -401,16 +401,19 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
 
 GLenum Framebuffer::getImplementationColorReadFormat()
 {
-       Renderbuffer *colorbuffer = mColorbufferPointer.get();
+       Renderbuffer *colorbuffer = mColorbufferPointer;
        
        if(colorbuffer)
        {
+               // Don't return GL_RGBA since that's always supported. Provide a second option here.
                switch(colorbuffer->getInternalFormat())
                {
-               case sw::FORMAT_A16B16G16R16F: return GL_RGBA;
-               case sw::FORMAT_A32B32G32R32F: return GL_RGBA;
+               case sw::FORMAT_A16B16G16R16F: return GL_BGRA_EXT;
+               case sw::FORMAT_A32B32G32R32F: return GL_BGRA_EXT;
                case sw::FORMAT_A8R8G8B8:      return GL_BGRA_EXT;
-               case sw::FORMAT_X8R8G8B8:      return GL_BGRA_EXT;
+               case sw::FORMAT_A8B8G8R8:      return GL_BGRA_EXT;
+               case sw::FORMAT_X8R8G8B8:      return 0x80E0;   // GL_BGR_EXT
+               case sw::FORMAT_X8B8G8R8:      return 0x80E0;   // GL_BGR_EXT
                case sw::FORMAT_A1R5G5B5:      return GL_BGRA_EXT;
                case sw::FORMAT_R5G6B5:        return 0x80E0;   // GL_BGR_EXT
                default:
@@ -423,7 +426,7 @@ GLenum Framebuffer::getImplementationColorReadFormat()
 
 GLenum Framebuffer::getImplementationColorReadType()
 {
-       Renderbuffer *colorbuffer = mColorbufferPointer.get();
+       Renderbuffer *colorbuffer = mColorbufferPointer;
        
        if(colorbuffer)
        {
@@ -432,7 +435,9 @@ GLenum Framebuffer::getImplementationColorReadType()
                case sw::FORMAT_A16B16G16R16F: return GL_HALF_FLOAT_OES;
                case sw::FORMAT_A32B32G32R32F: return GL_FLOAT;
                case sw::FORMAT_A8R8G8B8:      return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_A8B8G8R8:      return GL_UNSIGNED_BYTE;
                case sw::FORMAT_X8R8G8B8:      return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_X8B8G8R8:      return GL_UNSIGNED_BYTE;
                case sw::FORMAT_A1R5G5B5:      return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
                case sw::FORMAT_R5G6B5:        return GL_UNSIGNED_SHORT_5_6_5;
                default:
@@ -445,11 +450,11 @@ GLenum Framebuffer::getImplementationColorReadType()
 
 DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
 {
-       mColorbufferPointer.set(new Renderbuffer(0, colorbuffer));
+       mColorbufferPointer = new Renderbuffer(0, colorbuffer);
 
        Renderbuffer *depthStencilRenderbuffer = new Renderbuffer(0, depthStencil);
-       mDepthbufferPointer.set(depthStencilRenderbuffer);
-       mStencilbufferPointer.set(depthStencilRenderbuffer);
+       mDepthbufferPointer = depthStencilRenderbuffer;
+       mStencilbufferPointer = depthStencilRenderbuffer;
 
        mColorbufferType = GL_RENDERBUFFER;
        mDepthbufferType = (depthStencilRenderbuffer->getDepthSize() != 0) ? GL_RENDERBUFFER : GL_NONE;