Texture 1D implementation in LibGL Change-Id: I01df347a86d12f38f9ba7761bbd367c96014ff46 Reviewed-on: https://swiftshader-review.googlesource.com/3724 Reviewed-by: Maxime Grégoire <mgregoire@google.com> Tested-by: Maxime Grégoire <mgregoire@google.com>
diff --git a/src/OpenGL/libGL/Context.cpp b/src/OpenGL/libGL/Context.cpp index 3ceae07..c23420e 100644 --- a/src/OpenGL/libGL/Context.cpp +++ b/src/OpenGL/libGL/Context.cpp
@@ -137,6 +137,7 @@ mTexture2DZero = new Texture2D(0); mProxyTexture2DZero = new Texture2D(0); mTextureCubeMapZero = new TextureCubeMap(0); + mTexture1DZero = new Texture1D(0); mState.activeSampler = 0; bindArrayBuffer(0); @@ -253,6 +254,7 @@ mTexture2DZero = NULL; mProxyTexture2DZero = NULL; mTextureCubeMapZero = NULL; + mTexture1DZero = NULL; delete mVertexDataManager; delete mIndexDataManager; @@ -992,6 +994,13 @@ mState.samplerTexture[TEXTURE_CUBE][mState.activeSampler] = getTexture(texture); } +void Context::bindTexture1D(GLuint texture) +{ + mResourceManager->checkTextureAllocation(texture, TEXTURE_1D); + + mState.samplerTexture[TEXTURE_1D][mState.activeSampler] = getTexture(texture); +} + void Context::bindReadFramebuffer(GLuint framebuffer) { if(!getFramebuffer(framebuffer)) @@ -1223,6 +1232,11 @@ return static_cast<TextureCubeMap*>(getSamplerTexture(mState.activeSampler, TEXTURE_CUBE)); } +Texture1D *Context::getTexture1D() +{ + return static_cast<Texture1D*>(getSamplerTexture(mState.activeSampler, TEXTURE_1D)); +} + Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) { GLuint texid = mState.samplerTexture[type][sampler].name(); @@ -1234,6 +1248,7 @@ case TEXTURE_2D: return mTexture2DZero; case PROXY_TEXTURE_2D: return mProxyTexture2DZero; case TEXTURE_CUBE: return mTextureCubeMapZero; + case TEXTURE_1D: return mTexture1DZero; default: UNREACHABLE(); } } @@ -1615,6 +1630,7 @@ case GL_SAMPLES: case GL_IMPLEMENTATION_COLOR_READ_TYPE: case GL_IMPLEMENTATION_COLOR_READ_FORMAT: + case GL_TEXTURE_BINDING_1D: case GL_TEXTURE_BINDING_2D: case GL_TEXTURE_BINDING_CUBE_MAP: case GL_MAX_VERTEX_UNIFORM_COMPONENTS: @@ -3293,6 +3309,16 @@ device->setNormalizeNormals(enable); } +void Context::set1DTextureEnable(bool enable) +{ + device->set1DTextureEnable(enable); +} + +bool Context::get1DTextureEnable() +{ + return device->get1DTextureEnable(); +} + GLuint Context::genLists(GLsizei range) { if(drawing)
diff --git a/src/OpenGL/libGL/Context.h b/src/OpenGL/libGL/Context.h index 7d74fc5..3163c5e 100644 --- a/src/OpenGL/libGL/Context.h +++ b/src/OpenGL/libGL/Context.h
@@ -22,6 +22,7 @@ #include "Renderer/Sampler.hpp" #include "Renderer/Vertex.hpp" #include "common/MatrixStack.hpp" +#include "Texture.h" #define _GDI32_ #include <windows.h> @@ -612,6 +613,7 @@ void deleteQuery(GLuint query); void bindArrayBuffer(GLuint buffer); + void bindTexture1D(GLuint texture); void bindElementArrayBuffer(GLuint buffer); void bindTexture2D(GLuint texture); void bindTextureCubeMap(GLuint texture); @@ -641,6 +643,7 @@ Buffer *getArrayBuffer(); Buffer *getElementArrayBuffer(); Program *getCurrentProgram(); + Texture1D *getTexture1D(); Texture2D *getTexture2D(GLenum target); TextureCubeMap *getTextureCubeMap(); Texture *getSamplerTexture(unsigned int sampler, TextureType type); @@ -694,6 +697,8 @@ void setShadeModel(GLenum mode); void setLight(int index, bool enable); void setNormalizeNormals(bool enable); + void set1DTextureEnable(bool enable); + bool get1DTextureEnable(); GLuint genLists(GLsizei range); void newList(GLuint list, GLenum mode); @@ -740,6 +745,7 @@ State mState; + BindingPointer<Texture1D> mTexture1DZero; BindingPointer<Texture2D> mTexture2DZero; BindingPointer<Texture2D> mProxyTexture2DZero; BindingPointer<TextureCubeMap> mTextureCubeMapZero;
diff --git a/src/OpenGL/libGL/Device.cpp b/src/OpenGL/libGL/Device.cpp index cd314d2..60a2967 100644 --- a/src/OpenGL/libGL/Device.cpp +++ b/src/OpenGL/libGL/Device.cpp
@@ -157,6 +157,8 @@ setSpecularMaterialSource(sw::MATERIAL_MATERIAL); setAmbientMaterialSource(sw::MATERIAL_COLOR1); setEmissiveMaterialSource(sw::MATERIAL_MATERIAL); + + oneDTextureEnable = false; } Device::~Device() @@ -441,6 +443,16 @@ scissorEnable = enable; } + void Device::set1DTextureEnable(bool enable) + { + oneDTextureEnable = enable; + } + + bool Device::get1DTextureEnable() + { + return oneDTextureEnable; + } + void Device::setRenderTarget(Image *renderTarget) { if(renderTarget)
diff --git a/src/OpenGL/libGL/Device.hpp b/src/OpenGL/libGL/Device.hpp index dec8dfb..119046c 100644 --- a/src/OpenGL/libGL/Device.hpp +++ b/src/OpenGL/libGL/Device.hpp
@@ -59,6 +59,8 @@ virtual void setPixelShader(sw::PixelShader *shader); virtual void setPixelShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count); virtual void setScissorEnable(bool enable); + virtual void set1DTextureEnable(bool enable); + virtual bool get1DTextureEnable(); virtual void setRenderTarget(Image *renderTarget); virtual void setScissorRect(const sw::Rect &rect); virtual void setVertexShader(sw::VertexShader *shader);
diff --git a/src/OpenGL/libGL/ResourceManager.cpp b/src/OpenGL/libGL/ResourceManager.cpp index 383a66f..9f39fd9 100644 --- a/src/OpenGL/libGL/ResourceManager.cpp +++ b/src/OpenGL/libGL/ResourceManager.cpp
@@ -323,7 +323,11 @@ { Texture *textureObject; - if(type == TEXTURE_2D) + if(type == TEXTURE_1D) + { + textureObject = new Texture1D(texture); + } + else if(type == TEXTURE_2D) { textureObject = new Texture2D(texture); }
diff --git a/src/OpenGL/libGL/ResourceManager.h b/src/OpenGL/libGL/ResourceManager.h index 11c85eb..d3c619c 100644 --- a/src/OpenGL/libGL/ResourceManager.h +++ b/src/OpenGL/libGL/ResourceManager.h
@@ -37,6 +37,7 @@ TEXTURE_2D, PROXY_TEXTURE_2D, TEXTURE_CUBE, + TEXTURE_1D, TEXTURE_TYPE_COUNT, TEXTURE_UNKNOWN
diff --git a/src/OpenGL/libGL/Texture.cpp b/src/OpenGL/libGL/Texture.cpp index 74c1daa..a11a3fc 100644 --- a/src/OpenGL/libGL/Texture.cpp +++ b/src/OpenGL/libGL/Texture.cpp
@@ -168,11 +168,11 @@ return mMaxAnisotropy; } -void Texture::setImage(GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image) +void Texture::setImage(GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image, int xOffset) { if(pixels && image) { - image->loadImageData(0, 0, 0, image->getWidth(), image->getHeight(), 1, format, type, unpackAlignment, pixels); + image->loadImageData(xOffset, 0, 0, image->getWidth(), image->getHeight(), 1, format, type, unpackAlignment, pixels); } } @@ -184,7 +184,7 @@ } } -void Texture::subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image) +void Texture::subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image, bool is2DTexture) { if(!image) { @@ -201,7 +201,7 @@ return error(GL_INVALID_OPERATION); } - if(format != image->getFormat()) + if(format != image->getFormat() && is2DTexture) { return error(GL_INVALID_OPERATION); } @@ -367,7 +367,7 @@ return levels; } -void Texture2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels) +void Texture2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, int xOffset) { if(image[level]) { @@ -381,7 +381,7 @@ return error(GL_OUT_OF_MEMORY); } - Texture::setImage(format, type, unpackAlignment, pixels, image[level]); + Texture::setImage(format, type, unpackAlignment, pixels, image[level], xOffset); } void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels) @@ -1038,4 +1038,57 @@ return image[face][level]; } +Texture1D::Texture1D(GLuint name) : Texture2D(name) +{ +} + +Texture1D::~Texture1D() +{ +} + +GLenum Texture1D::getTarget() const +{ + return GL_TEXTURE_1D; +} + +GLenum Texture1D::getFormat(GLenum target, GLint level) const +{ + ASSERT(target == GL_TEXTURE_1D); + return image[level] ? image[level]->getFormat() : 0; +} + +GLenum Texture1D::getType(GLenum target, GLint level) const +{ + ASSERT(target == GL_TEXTURE_1D); + return image[level] ? image[level]->getType() : 0; +} + +GLsizei Texture1D::getWidth(GLenum target, GLint level) const +{ + ASSERT(target == GL_TEXTURE_1D || target == GL_PROXY_TEXTURE_1D); + return image[level] ? image[level]->getWidth() : 0; +} + +GLsizei Texture1D::getHeight(GLenum target, GLint level) const +{ + ASSERT(target == GL_TEXTURE_1D || target == GL_PROXY_TEXTURE_1D); + return image[level] ? image[level]->getHeight() : 0; +} + +sw::Format Texture1D::getInternalFormat(GLenum target, GLint level) const +{ + ASSERT(target == GL_TEXTURE_1D || target == GL_PROXY_TEXTURE_1D); + return image[level] ? image[level]->getInternalFormat() : sw::FORMAT_NULL; +} + +void Texture1D::subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels) +{ + Texture::subImage(xoffset, yoffset, width, height, format, type, unpackAlignment, pixels, image[level], false); +} + +bool Texture1D::isCompressed(GLenum target, GLint level) const +{ + return IsCompressed(getFormat(target, level)); +} + }
diff --git a/src/OpenGL/libGL/Texture.h b/src/OpenGL/libGL/Texture.h index 2f8ed28..1f79dcb 100644 --- a/src/OpenGL/libGL/Texture.h +++ b/src/OpenGL/libGL/Texture.h
@@ -88,8 +88,8 @@ virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0; protected: - void setImage(GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image); - void subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image); + void setImage(GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image, int xOffset = 0); + void subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *image, bool is2DTexture = true); void setCompressedImage(GLsizei imageSize, const void *pixels, Image *image); void subImageCompressed(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, Image *image); @@ -126,7 +126,7 @@ virtual sw::Format getInternalFormat(GLenum target, GLint level) const; virtual int getLevelCount() const; - void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); + void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, int xOffset = 0); void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); @@ -216,6 +216,22 @@ unsigned int mFaceProxyRefs[6]; }; +class Texture1D : public Texture2D +{ +public: + explicit Texture1D(GLuint name); + + virtual ~Texture1D(); + virtual GLenum getTarget() const; + virtual GLenum getFormat(GLenum target, GLint level) const; + virtual GLenum getType(GLenum target, GLint level) const; + virtual GLsizei getWidth(GLenum target, GLint level) const; + virtual GLsizei getHeight(GLenum target, GLint level) const; + virtual sw::Format getInternalFormat(GLenum target, GLint level) const; + virtual void subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); + virtual bool isCompressed(GLenum target, GLint level) const; +}; + } #endif // LIBGL_TEXTURE_H_
diff --git a/src/OpenGL/libGL/libGL.cpp b/src/OpenGL/libGL/libGL.cpp index 553d0a2..fa3073d 100644 --- a/src/OpenGL/libGL/libGL.cpp +++ b/src/OpenGL/libGL/libGL.cpp
@@ -55,7 +55,7 @@ return error(GL_INVALID_OPERATION, false); } - if(format != GL_NONE && format != texture->getFormat(target, level)) + if(format != GL_NONE && format != texture->getFormat(target, level) && target != GL_TEXTURE_1D) { return error(GL_INVALID_OPERATION, false); } @@ -349,6 +349,9 @@ switch(target) { + case GL_TEXTURE_1D: + context->bindTexture1D(texture); + return; case GL_TEXTURE_2D: context->bindTexture2D(texture); return; @@ -1652,6 +1655,7 @@ switch(cap) { + case GL_TEXTURE_1D: context->set1DTextureEnable(false); break; case GL_CULL_FACE: context->setCullFace(false); break; case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break; case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break; @@ -1799,6 +1803,7 @@ switch(cap) { + case GL_TEXTURE_1D: context->set1DTextureEnable(true); break; case GL_CULL_FACE: context->setCullFace(true); break; case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break; case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break; @@ -4395,6 +4400,7 @@ switch(target) { + case GL_TEXTURE_1D: case GL_TEXTURE_2D: if(width > (gl::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) || height > (gl::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level)) @@ -4463,7 +4469,18 @@ UNIMPLEMENTED(); } - if(target == GL_TEXTURE_2D || target == GL_PROXY_TEXTURE_2D) + if(target == GL_TEXTURE_1D) + { + gl::Texture1D *texture = context->getTexture1D(); + + if(!texture) + { + return error(GL_INVALID_OPERATION); + } + + texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels); + } + else if(target == GL_TEXTURE_2D || target == GL_PROXY_TEXTURE_2D) { gl::Texture2D *texture = context->getTexture2D(target); @@ -4589,6 +4606,9 @@ switch(target) { + case GL_TEXTURE_1D: + texture = context->getTexture1D(); + break; case GL_TEXTURE_2D: texture = context->getTexture2D(target); break; @@ -4695,7 +4715,16 @@ return error(GL_INVALID_VALUE); } - if(target == GL_TEXTURE_2D) + if(target == GL_TEXTURE_1D) + { + gl::Texture1D *texture = context->getTexture1D(); + + if(validateSubImageParams(false, width, height, xoffset, yoffset, target, level, format, texture)) + { + texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels); + } + } + else if(target == GL_TEXTURE_2D) { gl::Texture2D *texture = context->getTexture2D(target); @@ -7539,12 +7568,20 @@ void APIENTRY glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels) { - UNIMPLEMENTED(); + TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, " + "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = %p)", + target, level, internalformat, width, border, format, type, pixels); + + glTexImage2D(target, level, internalformat, width, 1, border, format, type, pixels); } void APIENTRY glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels) { - UNIMPLEMENTED(); + TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLsizei width = %d, " + "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = %p)", + target, level, xoffset, width, format, type, pixels); + + glTexSubImage2D(target, level, xoffset, 0, width, 1, format, type, pixels); } void APIENTRY glTranslated(GLdouble x, GLdouble y, GLdouble z)
diff --git a/src/OpenGL/libGL/utilities.cpp b/src/OpenGL/libGL/utilities.cpp index 79249f2..eba16dd 100644 --- a/src/OpenGL/libGL/utilities.cpp +++ b/src/OpenGL/libGL/utilities.cpp
@@ -309,7 +309,7 @@ bool IsTextureTarget(GLenum target) { - return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target); + return target == GL_TEXTURE_1D || target == GL_TEXTURE_2D || IsCubemapTextureTarget(target); } // Verify that format/type are one of the combinations from table 3.4.
diff --git a/src/Renderer/VertexProcessor.hpp b/src/Renderer/VertexProcessor.hpp index b10b7a0..be16fca 100644 --- a/src/Renderer/VertexProcessor.hpp +++ b/src/Renderer/VertexProcessor.hpp
@@ -296,6 +296,7 @@ bool updateBaseMatrix; bool updateProjectionMatrix; bool updateLighting; + bool oneDTextureEnable; }; }