Update to June 11 2013 code drop. This should fix the hang bug we've been seeing.
diff --git a/src/GLES2/libGLESv2/Buffer.cpp b/src/GLES2/libGLESv2/Buffer.cpp index e98d8eb..fc535ac 100644 --- a/src/GLES2/libGLESv2/Buffer.cpp +++ b/src/GLES2/libGLESv2/Buffer.cpp
@@ -61,11 +61,6 @@ if(data) { memcpy((void*)mContents->getBuffer(), data, size); - memset((char*)mContents->getBuffer() + size, 0, padding); - } - else - { - memset((void*)mContents->getBuffer(), 0, size + padding); } } }
diff --git a/src/GLES2/libGLESv2/Context.cpp b/src/GLES2/libGLESv2/Context.cpp index 445962c..a50e3a1 100644 --- a/src/GLES2/libGLESv2/Context.cpp +++ b/src/GLES2/libGLESv2/Context.cpp
@@ -1336,7 +1336,7 @@ switch(pname) { case GL_SAMPLE_BUFFERS: - if(samples != 0) + if(samples > 1) { *params = 1; } @@ -1346,11 +1346,11 @@ } break; case GL_SAMPLES: - *params = samples; + *params = samples & ~1; break; } } - else + else { *params = 0; } @@ -2366,12 +2366,16 @@ (mState.colorMaskGreen ? 0x2 : 0) | (mState.colorMaskBlue ? 0x4 : 0) | (mState.colorMaskAlpha ? 0x8 : 0); - device->clearColor(color, rgbaMask); + + if(rgbaMask != 0) + { + device->clearColor(color, rgbaMask); + } } if(mask & GL_DEPTH_BUFFER_BIT) { - if(mState.depthMask) + if(mState.depthMask != 0) { device->clearDepth(depth); } @@ -2379,7 +2383,10 @@ if(mask & GL_STENCIL_BUFFER_BIT) { - device->clearStencil(stencil, mState.stencilWritemask); + if(mState.stencilWritemask != 0) + { + device->clearStencil(stencil, mState.stencilWritemask); + } } } @@ -2567,14 +2574,14 @@ return GL_NO_ERROR; } -int Context::getNearestSupportedSamples(sw::Format format, int requested) const +int Context::getSupportedMultiSampleDepth(sw::Format format, int requested) { if(requested <= 1) { - return requested; + return 1; } - if(requested <= 2) + if(requested == 2) { return 2; } @@ -2790,7 +2797,7 @@ return error(GL_INVALID_FRAMEBUFFER_OPERATION); } - if(drawBufferSamples != 0) + if(drawBufferSamples > 1) { return error(GL_INVALID_OPERATION); } @@ -2950,7 +2957,7 @@ return error(GL_INVALID_OPERATION); } - if(partialBufferCopy && readBufferSamples != 0) + if(partialBufferCopy && readBufferSamples > 1) { return error(GL_INVALID_OPERATION); } @@ -3004,8 +3011,8 @@ return error(GL_INVALID_OPERATION); // Only whole-buffer copies are permitted } - if((drawDSBuffer && drawDSBuffer->getSamples() != 0) || - (readDSBuffer && readDSBuffer->getSamples() != 0)) + if((drawDSBuffer && drawDSBuffer->getSamples() > 1) || + (readDSBuffer && readDSBuffer->getSamples() > 1)) { return error(GL_INVALID_OPERATION); }
diff --git a/src/GLES2/libGLESv2/Context.h b/src/GLES2/libGLESv2/Context.h index 1ca0d55..d998f62 100644 --- a/src/GLES2/libGLESv2/Context.h +++ b/src/GLES2/libGLESv2/Context.h
@@ -409,7 +409,7 @@ GLenum getError(); - int getNearestSupportedSamples(sw::Format format, int requested) const; + static int getSupportedMultiSampleDepth(sw::Format format, int requested); const char *getExtensionString() const; void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
diff --git a/src/GLES2/libGLESv2/Device.cpp b/src/GLES2/libGLESv2/Device.cpp index 64b888d..e7b1ec9 100644 --- a/src/GLES2/libGLESv2/Device.cpp +++ b/src/GLES2/libGLESv2/Device.cpp
@@ -280,8 +280,6 @@ return 0; } - surface->addRef(); - return surface; } @@ -302,8 +300,6 @@ ERR("Out of memory"); return 0; } - - surface->addRef(); return surface; }
diff --git a/src/GLES2/libGLESv2/Image.cpp b/src/GLES2/libGLESv2/Image.cpp index 0b8220e..5b43aae 100644 --- a/src/GLES2/libGLESv2/Image.cpp +++ b/src/GLES2/libGLESv2/Image.cpp
@@ -11,6 +11,7 @@ #include "Image.hpp" +#include "Texture.h" #include "utilities.h" #include "../common/debug.h" #include "Common/Thread.hpp" @@ -19,14 +20,29 @@ namespace gl { - Image::Image(sw::Resource *parentTexture, GLsizei width, GLsizei height, GLenum format, GLenum type) : sw::Surface(parentTexture, width, height, 1, selectInternalFormat(format, type), true, true), width(width), height(height), internalFormat(selectInternalFormat(format, type)), format(format), type(type), multiSampleDepth(1) + static sw::Resource *getParentResource(Texture *texture) { - referenceCount = 0; + if(texture) + { + return texture->getResource(); + } + + return 0; } - Image::Image(sw::Resource *parentTexture, GLsizei width, GLsizei height, sw::Format internalFormat, GLenum format, GLenum type, int multiSampleDepth, bool lockable, bool renderTarget) : sw::Surface(parentTexture, width, height, multiSampleDepth, internalFormat, lockable, renderTarget), width(width), height(height), internalFormat(internalFormat), format(format), type(type), multiSampleDepth(multiSampleDepth) + Image::Image(Texture *parentTexture, GLsizei width, GLsizei height, GLenum format, GLenum type) + : parentTexture(parentTexture), width(width), height(height), format(format), type(type) + , internalFormat(selectInternalFormat(format, type)), multiSampleDepth(1) + , sw::Surface(getParentResource(parentTexture), width, height, 1, selectInternalFormat(format, type), true, true) { - referenceCount = 0; + referenceCount = 1; + } + + Image::Image(Texture *parentTexture, GLsizei width, GLsizei height, sw::Format internalFormat, GLenum format, GLenum type, int multiSampleDepth, bool lockable, bool renderTarget) + : parentTexture(parentTexture), width(width), height(height), internalFormat(internalFormat), format(format), type(type), multiSampleDepth(multiSampleDepth) + , sw::Surface(getParentResource(parentTexture), width, height, multiSampleDepth, internalFormat, lockable, renderTarget) + { + referenceCount = 1; } Image::~Image() @@ -81,11 +97,21 @@ void Image::addRef() { + if(parentTexture) + { + return parentTexture->addRef(); + } + sw::atomicIncrement(&referenceCount); } void Image::release() { + if(parentTexture) + { + return parentTexture->release(); + } + if(referenceCount > 0) { sw::atomicDecrement(&referenceCount); @@ -97,6 +123,13 @@ } } + void Image::unbind() + { + parentTexture = 0; + + release(); + } + sw::Format Image::selectInternalFormat(GLenum format, GLenum type) { #if S3TC_SUPPORT @@ -163,6 +196,18 @@ } else UNREACHABLE(); } + else if(type == GL_UNSIGNED_SHORT_4_4_4_4) + { + return sw::FORMAT_A8R8G8B8; + } + else if(type == GL_UNSIGNED_SHORT_5_5_5_1) + { + return sw::FORMAT_A8R8G8B8; + } + else if(type == GL_UNSIGNED_SHORT_5_6_5) + { + return sw::FORMAT_X8R8G8B8; + } else UNREACHABLE(); return sw::FORMAT_A8R8G8B8; @@ -288,9 +333,9 @@ break; default: UNREACHABLE(); } - - unlock(); } + + unlock(); } void Image::loadAlphaImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const @@ -653,8 +698,8 @@ { memcpy((void*)((GLbyte*)buffer + i * getPitch()), (void*)((GLbyte*)pixels + i * inputPitch), inputPitch); } - - unlock(); } + + unlock(); } } \ No newline at end of file
diff --git a/src/GLES2/libGLESv2/Image.hpp b/src/GLES2/libGLESv2/Image.hpp index baf963d..1520504 100644 --- a/src/GLES2/libGLESv2/Image.hpp +++ b/src/GLES2/libGLESv2/Image.hpp
@@ -19,11 +19,13 @@ namespace gl { + class Texture; + class Image : public sw::Surface { public: - Image(sw::Resource *parentTexture, GLsizei width, GLsizei height, GLenum format, GLenum type); - Image(sw::Resource *parentTexture, GLsizei width, GLsizei height, sw::Format internalFormat, GLenum format, GLenum type, int multiSampleDepth, bool lockable, bool renderTarget); + Image(Texture *parentTexture, GLsizei width, GLsizei height, GLenum format, GLenum type); + Image(Texture *parentTexture, GLsizei width, GLsizei height, sw::Format internalFormat, GLenum format, GLenum type, int multiSampleDepth, bool lockable, bool renderTarget); void loadImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *input); void loadCompressedData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); @@ -41,6 +43,7 @@ virtual void addRef(); virtual void release(); + void unbind(); // Break parent ownership and release static sw::Format selectInternalFormat(GLenum format, GLenum type); static int bytes(sw::Format format); @@ -71,6 +74,8 @@ void loadD32ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const; void loadD24S8ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer); + Texture *parentTexture; + const GLsizei width; const GLsizei height; const GLenum format;
diff --git a/src/GLES2/libGLESv2/Program.cpp b/src/GLES2/libGLESv2/Program.cpp index a1ad45e..41fa7bf 100644 --- a/src/GLES2/libGLESv2/Program.cpp +++ b/src/GLES2/libGLESv2/Program.cpp
@@ -35,7 +35,7 @@ return buffer; } - Uniform::Uniform(GLenum type, const std::string &name, unsigned int arraySize) : type(type), name(name), arraySize(arraySize) + Uniform::Uniform(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize) : type(type), precision(precision), name(name), arraySize(arraySize) { int bytes = UniformTypeSize(type) * size(); data = new unsigned char[bytes]; @@ -1132,7 +1132,6 @@ if(in + registers > MAX_VARYING_VECTORS) { appendToInfoLog("Too many varyings"); - return false; } @@ -1141,7 +1140,6 @@ if(out + registers > MAX_VARYING_VECTORS) { appendToInfoLog("Too many varyings"); - return false; } @@ -1239,7 +1237,6 @@ if(rows + location > MAX_VERTEX_ATTRIBS) { appendToInfoLog("Active attribute (%s) at location %d is too big to fit", attribute->name.c_str(), location); - return false; } @@ -1263,7 +1260,6 @@ if(availableIndex == -1 || availableIndex + rows > MAX_VERTEX_ATTRIBS) { appendToInfoLog("Too many active attributes (%s)", attribute->name.c_str()); - return false; // Fail to link } @@ -1306,7 +1302,7 @@ { const sh::Uniform &uniform = activeUniforms[uniformIndex]; - if(!defineUniform(shader->getType(), uniform.type, uniform.name, uniform.arraySize, uniform.registerIndex)) + if(!defineUniform(shader->getType(), uniform.type, uniform.precision, uniform.name, uniform.arraySize, uniform.registerIndex)) { return false; } @@ -1315,7 +1311,7 @@ return true; } - bool Program::defineUniform(GLenum shader, GLenum type, const std::string &name, unsigned int arraySize, int registerIndex) + bool Program::defineUniform(GLenum shader, GLenum type, GLenum precision, const std::string &name, unsigned int arraySize, int registerIndex) { if(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE) { @@ -1367,12 +1363,19 @@ if(uniform->type != type) { + appendToInfoLog("Types for uniform %s do not match between the vertex and fragment shader", uniform->name.c_str()); + return false; + } + + if(uniform->precision != precision) + { + appendToInfoLog("Precisions for uniform %s do not match between the vertex and fragment shader", uniform->name.c_str()); return false; } } else { - uniform = new Uniform(type, name, arraySize); + uniform = new Uniform(type, precision, name, arraySize); } if(!uniform) @@ -1880,15 +1883,17 @@ if(!infoLog) { - infoLog = new char[infoLength + 1]; + infoLog = new char[infoLength + 2]; strcpy(infoLog, info); + strcpy(infoLog + infoLength, "\n"); } else { size_t logLength = strlen(infoLog); - char *newLog = new char[logLength + infoLength + 1]; + char *newLog = new char[logLength + infoLength + 2]; strcpy(newLog, infoLog); strcpy(newLog + logLength, info); + strcpy(newLog + logLength + infoLength, "\n"); delete[] infoLog; infoLog = newLog; @@ -2045,7 +2050,7 @@ } } - void Program::getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) + void Program::getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const { // Skip over inactive attributes unsigned int activeAttribute = 0; @@ -2083,7 +2088,7 @@ *type = linkedAttribute[attribute].type; } - GLint Program::getActiveAttributeCount() + GLint Program::getActiveAttributeCount() const { int count = 0; @@ -2098,7 +2103,7 @@ return count; } - GLint Program::getActiveAttributeMaxLength() + GLint Program::getActiveAttributeMaxLength() const { int maxLength = 0; @@ -2113,7 +2118,7 @@ return maxLength; } - void Program::getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) + void Program::getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const { if(bufsize > 0) { @@ -2138,12 +2143,12 @@ *type = uniforms[index]->type; } - GLint Program::getActiveUniformCount() + GLint Program::getActiveUniformCount() const { return uniforms.size(); } - GLint Program::getActiveUniformMaxLength() + GLint Program::getActiveUniformMaxLength() const { int maxLength = 0;
diff --git a/src/GLES2/libGLESv2/Program.h b/src/GLES2/libGLESv2/Program.h index 404a208..33e358c 100644 --- a/src/GLES2/libGLESv2/Program.h +++ b/src/GLES2/libGLESv2/Program.h
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2012 TransGaming Inc. +// Copyright(c) 2005-2013 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -34,7 +34,7 @@ // Helper struct representing a single shader uniform struct Uniform { - Uniform(GLenum type, const std::string &name, unsigned int arraySize); + Uniform(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize); ~Uniform(); @@ -43,6 +43,7 @@ int registerCount() const; const GLenum type; + const GLenum precision; const std::string name; const unsigned int arraySize; @@ -109,13 +110,13 @@ void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog); void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders); - void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - GLint getActiveAttributeCount(); - GLint getActiveAttributeMaxLength(); + void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const; + GLint getActiveAttributeCount() const; + GLint getActiveAttributeMaxLength() const; - void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); - GLint getActiveUniformCount(); - GLint getActiveUniformMaxLength(); + void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const; + GLint getActiveUniformCount() const; + GLint getActiveUniformMaxLength() const; void addRef(); void release(); @@ -139,7 +140,7 @@ int getAttributeBinding(const std::string &name); bool linkUniforms(Shader *shader); - bool defineUniform(GLenum shader, GLenum type, const std::string &_name, unsigned int arraySize, int registerIndex); + bool defineUniform(GLenum shader, GLenum type, GLenum precision, const std::string &_name, unsigned int arraySize, int registerIndex); bool applyUniform1bv(GLint location, GLsizei count, const GLboolean *v); bool applyUniform2bv(GLint location, GLsizei count, const GLboolean *v); bool applyUniform3bv(GLint location, GLsizei count, const GLboolean *v);
diff --git a/src/GLES2/libGLESv2/Renderbuffer.cpp b/src/GLES2/libGLESv2/Renderbuffer.cpp index 133b592..79df223 100644 --- a/src/GLES2/libGLESv2/Renderbuffer.cpp +++ b/src/GLES2/libGLESv2/Renderbuffer.cpp
@@ -332,7 +332,7 @@ mHeight = renderTarget->getHeight(); internalFormat = renderTarget->getInternalFormat(); format = sw2es::ConvertBackBufferFormat(internalFormat); - mSamples = renderTarget->getMultiSampleDepth(); + mSamples = renderTarget->getMultiSampleDepth() & ~1; } } @@ -341,14 +341,7 @@ Device *device = getDevice(); sw::Format requestedFormat = es2sw::ConvertRenderbufferFormat(format); - int supportedSamples = getContext()->getNearestSupportedSamples(requestedFormat, samples); - - if(supportedSamples == -1) - { - error(GL_OUT_OF_MEMORY); - - return; - } + int supportedSamples = Context::getSupportedMultiSampleDepth(requestedFormat, samples); if(width > 0 && height > 0) { @@ -365,7 +358,7 @@ mHeight = height; this->format = format; internalFormat = requestedFormat; - mSamples = supportedSamples; + mSamples = supportedSamples & ~1; } Colorbuffer::~Colorbuffer() @@ -398,7 +391,7 @@ mHeight = depthStencil->getHeight(); internalFormat = depthStencil->getInternalFormat(); format = sw2es::ConvertDepthStencilFormat(internalFormat); - mSamples = depthStencil->getMultiSampleDepth(); + mSamples = depthStencil->getMultiSampleDepth() & ~1; } } @@ -408,14 +401,7 @@ mDepthStencil = NULL; - int supportedSamples = getContext()->getNearestSupportedSamples(sw::FORMAT_D24S8, samples); - - if(supportedSamples == -1) - { - error(GL_OUT_OF_MEMORY); - - return; - } + int supportedSamples = Context::getSupportedMultiSampleDepth(sw::FORMAT_D24S8, samples); if(width > 0 && height > 0) { @@ -432,7 +418,7 @@ mHeight = height; format = GL_DEPTH24_STENCIL8_OES; internalFormat = sw::FORMAT_D24S8; - mSamples = supportedSamples; + mSamples = supportedSamples & ~1; } DepthStencilbuffer::~DepthStencilbuffer()
diff --git a/src/GLES2/libGLESv2/Shader.cpp b/src/GLES2/libGLESv2/Shader.cpp index f144a24..e4cb5ee 100644 --- a/src/GLES2/libGLESv2/Shader.cpp +++ b/src/GLES2/libGLESv2/Shader.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2012 TransGaming Inc. +// Copyright(c) 2005-2013 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -24,16 +24,12 @@ namespace gl { -void *Shader::mFragmentCompiler = NULL; -void *Shader::mVertexCompiler = NULL; - Shader::Shader(ResourceManager *manager, GLuint handle) : mHandle(handle), mResourceManager(manager) { mSource = NULL; mInfoLog = NULL; clear(); - initializeCompiler(); mRefCount = 0; mDeleteStatus = false; @@ -156,6 +152,30 @@ } } +TranslatorASM *Shader::createCompiler(ShShaderType type) +{ + ShInitialize(); + + TranslatorASM *assembler = new TranslatorASM(this, type, SH_GLES2_SPEC); + + ShBuiltInResources resources; + ShInitBuiltInResources(&resources); + resources.MaxVertexAttribs = MAX_VERTEX_ATTRIBS; + resources.MaxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS; + resources.MaxVaryingVectors = MAX_VARYING_VECTORS; + resources.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS; + resources.MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS; + resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; + resources.MaxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS; + resources.MaxDrawBuffers = MAX_DRAW_BUFFERS; + resources.OES_standard_derivatives = 1; + resources.OES_fragment_precision_high = 1; + resources.MaxCallStackDepth = 16; + assembler->Init(resources); + + return assembler; +} + void Shader::clear() { delete[] mInfoLog; @@ -210,43 +230,8 @@ mDeleteStatus = true; } -// Perform a one-time initialization of the shader compiler (or after being destructed by releaseCompiler) -void Shader::initializeCompiler() -{ - if(!mFragmentCompiler) - { - int result = ShInitialize(); - - if(result) - { - ShBuiltInResources resources; - ShInitBuiltInResources(&resources); - Context *context = getContext(); - - resources.MaxVertexAttribs = MAX_VERTEX_ATTRIBS; - resources.MaxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS; - resources.MaxVaryingVectors = MAX_VARYING_VECTORS; - resources.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS; - resources.MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS; - resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; - resources.MaxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS; - resources.MaxDrawBuffers = MAX_DRAW_BUFFERS; - resources.OES_standard_derivatives = 1; - - mFragmentCompiler = ShConstructCompiler(SH_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources); - mVertexCompiler = ShConstructCompiler(SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources); - } - } -} - void Shader::releaseCompiler() { - ShDestruct(mFragmentCompiler); - ShDestruct(mVertexCompiler); - - mFragmentCompiler = NULL; - mVertexCompiler = NULL; - ShFinalize(); } @@ -386,25 +371,11 @@ void VertexShader::compile() { clear(); - initializeCompiler(); delete vertexShader; vertexShader = new sw::VertexShader(); - TranslatorASM *assembler = new TranslatorASM(this, SH_VERTEX_SHADER, SH_GLES2_SPEC); - - ShBuiltInResources resources; - ShInitBuiltInResources(&resources); - resources.MaxVertexAttribs = MAX_VERTEX_ATTRIBS; - resources.MaxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS; - resources.MaxVaryingVectors = MAX_VARYING_VECTORS; - resources.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS; - resources.MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS; - resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; - resources.MaxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS; - resources.MaxDrawBuffers = MAX_DRAW_BUFFERS; - resources.OES_standard_derivatives = 1; - assembler->Init(resources); + TranslatorASM *compiler = createCompiler(SH_VERTEX_SHADER); // Ensure we don't pass a NULL source to the compiler char *source = "\0"; @@ -413,7 +384,7 @@ source = mSource; } - int success = ShCompile(assembler, &source, 1, SH_OBJECT_CODE); + int success = ShCompile(compiler, &source, 1, SH_OBJECT_CODE); if(false) { @@ -433,13 +404,13 @@ vertexShader = 0; int infoLogLen = 0; - ShGetInfo(assembler, SH_INFO_LOG_LENGTH, &infoLogLen); + ShGetInfo(compiler, SH_INFO_LOG_LENGTH, &infoLogLen); mInfoLog = new char[infoLogLen]; - ShGetInfoLog(assembler, mInfoLog); + ShGetInfoLog(compiler, mInfoLog); TRACE("\n%s", mInfoLog); } - delete assembler; + delete compiler; } int VertexShader::getSemanticIndex(const std::string &attributeName) @@ -486,25 +457,11 @@ void FragmentShader::compile() { clear(); - initializeCompiler(); delete pixelShader; pixelShader = new sw::PixelShader(); - TranslatorASM *assembler = new TranslatorASM(this, SH_FRAGMENT_SHADER, SH_GLES2_SPEC); - - ShBuiltInResources resources; - ShInitBuiltInResources(&resources); - resources.MaxVertexAttribs = MAX_VERTEX_ATTRIBS; - resources.MaxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS; - resources.MaxVaryingVectors = MAX_VARYING_VECTORS; - resources.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS; - resources.MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS; - resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; - resources.MaxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS; - resources.MaxDrawBuffers = MAX_DRAW_BUFFERS; - resources.OES_standard_derivatives = 1; - assembler->Init(resources); + TranslatorASM *compiler = createCompiler(SH_FRAGMENT_SHADER); // Ensure we don't pass a NULL source to the compiler char *source = "\0"; @@ -513,7 +470,7 @@ source = mSource; } - int success = ShCompile(assembler, &source, 1, SH_OBJECT_CODE); + int success = ShCompile(compiler, &source, 1, SH_OBJECT_CODE); if(false) { @@ -533,13 +490,13 @@ pixelShader = 0; int infoLogLen = 0; - ShGetInfo(assembler, SH_INFO_LOG_LENGTH, &infoLogLen); + ShGetInfo(compiler, SH_INFO_LOG_LENGTH, &infoLogLen); mInfoLog = new char[infoLogLen]; - ShGetInfoLog(assembler, mInfoLog); + ShGetInfoLog(compiler, mInfoLog); TRACE("\n%s", mInfoLog); } - delete assembler; + delete compiler; } sw::Shader *FragmentShader::getShader() const
diff --git a/src/GLES2/libGLESv2/Shader.h b/src/GLES2/libGLESv2/Shader.h index 6629c39..b6e7e70 100644 --- a/src/GLES2/libGLESv2/Shader.h +++ b/src/GLES2/libGLESv2/Shader.h
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2012 TransGaming Inc. +// Copyright(c) 2005-2013 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -97,8 +97,8 @@ static void releaseCompiler(); protected: + TranslatorASM *createCompiler(ShShaderType type); void clear(); - void initializeCompiler(); static GLenum parseType(const std::string &type); static bool compareVarying(const Varying &x, const Varying &y); @@ -116,9 +116,6 @@ bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use ResourceManager *mResourceManager; - - static void *mFragmentCompiler; - static void *mVertexCompiler; }; class VertexShader : public Shader
diff --git a/src/GLES2/libGLESv2/Texture.cpp b/src/GLES2/libGLESv2/Texture.cpp index dedc7cb..a6f3886 100644 --- a/src/GLES2/libGLESv2/Texture.cpp +++ b/src/GLES2/libGLESv2/Texture.cpp
@@ -284,7 +284,7 @@ { if(image[i]) { - image[i]->release(); + image[i]->unbind(); image[i] = 0; } } @@ -378,18 +378,16 @@ { if(image[level]) { - image[level]->release(); + image[level]->unbind(); } - image[level] = new Image(resource, width, height, format, type); + image[level] = new Image(this, width, height, format, type); if(!image[level]) { return error(GL_OUT_OF_MEMORY); } - image[level]->addRef(); - Texture::setImage(format, type, unpackAlignment, pixels, image[level]); } @@ -414,7 +412,7 @@ { if(image[level]) { - image[level]->release(); + image[level]->unbind(); image[level] = 0; } } @@ -431,7 +429,7 @@ { if(image[level]) { - image[level]->release(); + image[level]->unbind(); image[level] = 0; } } @@ -441,18 +439,16 @@ { if(image[level]) { - image[level]->release(); + image[level]->unbind(); } - image[level] = new Image(resource, width, height, format, GL_UNSIGNED_BYTE); + image[level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); if(!image[level]) { return error(GL_OUT_OF_MEMORY); } - image[level]->addRef(); - Texture::setCompressedImage(imageSize, pixels, image[level]); } @@ -478,18 +474,16 @@ if(image[level]) { - image[level]->release(); + image[level]->unbind(); } - image[level] = new Image(resource, width, height, format, GL_UNSIGNED_BYTE); + image[level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); if(!image[level]) { return error(GL_OUT_OF_MEMORY); } - image[level]->addRef(); - if(width != 0 && height != 0) { sw::Rect sourceRect = {x, y, x + width, y + height}; @@ -618,18 +612,16 @@ { if(image[i]) { - image[i]->release(); + image[i]->unbind(); } - image[i] = new Image(resource, std::max(image[0]->getWidth() >> i, 1), std::max(image[0]->getHeight() >> i, 1), image[0]->getFormat(), image[0]->getType()); + image[i] = new Image(this, std::max(image[0]->getWidth() >> i, 1), std::max(image[0]->getHeight() >> i, 1), image[0]->getFormat(), image[0]->getType()); if(!image[i]) { return error(GL_OUT_OF_MEMORY); } - image[i]->addRef(); - getDevice()->stretchRect(image[i - 1], 0, image[i], 0, true); } } @@ -693,7 +685,7 @@ { if(image[f][i]) { - image[f][i]->release(); + image[f][i]->unbind(); image[f][i] = 0; } } @@ -801,18 +793,16 @@ if(image[face][level]) { - image[face][level]->release(); + image[face][level]->unbind(); } - image[face][level] = new Image(resource, width, height, format, GL_UNSIGNED_BYTE); + image[face][level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); if(!image[face][level]) { return error(GL_OUT_OF_MEMORY); } - image[face][level]->addRef(); - Texture::setCompressedImage(imageSize, pixels, image[face][level]); } @@ -939,18 +929,16 @@ if(image[face][level]) { - image[face][level]->release(); + image[face][level]->unbind(); } - image[face][level] = new Image(resource, width, height, format, GL_UNSIGNED_BYTE); + image[face][level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); if(!image[face][level]) { return error(GL_OUT_OF_MEMORY); } - image[face][level]->addRef(); - Texture::setImage(format, type, unpackAlignment, pixels, image[face][level]); } @@ -968,18 +956,16 @@ if(image[face][level]) { - image[face][level]->release(); + image[face][level]->unbind(); } - image[face][level] = new Image(resource, width, height, format, GL_UNSIGNED_BYTE); + image[face][level] = new Image(this, width, height, format, GL_UNSIGNED_BYTE); if(!image[face][level]) { return error(GL_OUT_OF_MEMORY); } - image[face][level]->addRef(); - if(width != 0 && height != 0) { sw::Rect sourceRect = {x, y, x + width, y + height}; @@ -1048,18 +1034,16 @@ { if(image[f][i]) { - image[f][i]->release(); + image[f][i]->unbind(); } - image[f][i] = new Image(resource, std::max(image[0][0]->getWidth() >> i, 1), std::max(image[0][0]->getHeight() >> i, 1), image[0][0]->getFormat(), image[0][0]->getType()); + image[f][i] = new Image(this, std::max(image[0][0]->getWidth() >> i, 1), std::max(image[0][0]->getHeight() >> i, 1), image[0][0]->getFormat(), image[0][0]->getType()); if(!image[f][i]) { return error(GL_OUT_OF_MEMORY); } - image[f][i]->addRef(); - getDevice()->stretchRect(image[f][i - 1], 0, image[f][i], 0, true); } }
diff --git a/src/GLES2/libGLESv2/Texture.h b/src/GLES2/libGLESv2/Texture.h index d62a537..302c7f0 100644 --- a/src/GLES2/libGLESv2/Texture.h +++ b/src/GLES2/libGLESv2/Texture.h
@@ -90,8 +90,6 @@ virtual void generateMipmaps() = 0; virtual void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source) = 0; - static const GLuint INCOMPLETE_TEXTURE_ID = static_cast<GLuint>(-1); // Every texture takes an id at creation time. The value is arbitrary because it is never registered with the resource manager. - 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); @@ -116,7 +114,7 @@ public: explicit Texture2D(GLuint id); - ~Texture2D(); + virtual ~Texture2D(); virtual bool isTexture2D(); @@ -172,7 +170,7 @@ public: explicit TextureCubeMap(GLuint id); - ~TextureCubeMap(); + virtual ~TextureCubeMap(); virtual bool isTextureCubeMap();
diff --git a/src/GLES2/libGLESv2/libGLESv2.cbp b/src/GLES2/libGLESv2/libGLESv2.cbp index 8f5d976..443c986 100644 --- a/src/GLES2/libGLESv2/libGLESv2.cbp +++ b/src/GLES2/libGLESv2/libGLESv2.cbp
@@ -141,12 +141,12 @@ <Unit filename="./../../Common/Version.h" /> <Unit filename="./../common/debug.cpp" /> <Unit filename="./../common/debug.h" /> + <Unit filename="../compiler/AnalyzeCallDepth.cpp" /> + <Unit filename="../compiler/AnalyzeCallDepth.h" /> <Unit filename="../compiler/BaseTypes.h" /> <Unit filename="../compiler/Common.h" /> <Unit filename="../compiler/Compiler.cpp" /> <Unit filename="../compiler/ConstantUnion.h" /> - <Unit filename="../compiler/DetectRecursion.cpp" /> - <Unit filename="../compiler/DetectRecursion.h" /> <Unit filename="../compiler/Diagnostics.cpp" /> <Unit filename="../compiler/Diagnostics.h" /> <Unit filename="../compiler/DirectiveHandler.cpp" />
diff --git a/src/GLES2/libGLESv2/libGLESv2.cpp b/src/GLES2/libGLESv2/libGLESv2.cpp index 0448330..96f004e 100644 --- a/src/GLES2/libGLESv2/libGLESv2.cpp +++ b/src/GLES2/libGLESv2/libGLESv2.cpp
@@ -24,6 +24,7 @@ #include "Query.h" #include "common/debug.h" #include "Common/Version.h" +#include "Main/Register.hpp" #define GL_APICALL #include <GLES2/gl2.h> @@ -1119,7 +1120,7 @@ return error(GL_INVALID_FRAMEBUFFER_OPERATION); } - if(context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0) + if(context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() > 1) { return error(GL_INVALID_OPERATION); } @@ -1255,7 +1256,7 @@ return error(GL_INVALID_FRAMEBUFFER_OPERATION); } - if(context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0) + if(context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() > 1) { return error(GL_INVALID_OPERATION); } @@ -3200,26 +3201,17 @@ switch(pname) { - case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break; - case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break; - case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getFormat(); break; - case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break; - case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break; - case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break; - case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break; - case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break; - case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break; - case GL_RENDERBUFFER_SAMPLES_ANGLE: - if(gl::IMPLEMENTATION_MAX_SAMPLES != 0) - { - *params = renderbuffer->getSamples(); - } - else - { - return error(GL_INVALID_ENUM); - } - break; - default: + case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break; + case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break; + case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getFormat(); break; + case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break; + case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break; + case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break; + case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break; + case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break; + case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break; + case GL_RENDERBUFFER_SAMPLES_ANGLE: *params = renderbuffer->getSamples(); break; + default: return error(GL_INVALID_ENUM); } } @@ -6118,4 +6110,9 @@ } } +void GL_APIENTRY Register(const char *licenseKey) +{ + RegisterLicenseKey(licenseKey); +} + }
diff --git a/src/GLES2/libGLESv2/libGLESv2.vcxproj b/src/GLES2/libGLESv2/libGLESv2.vcxproj index 924cd42..622d914 100644 --- a/src/GLES2/libGLESv2/libGLESv2.vcxproj +++ b/src/GLES2/libGLESv2/libGLESv2.vcxproj
@@ -80,13 +80,10 @@ <BrowseInformation>true</BrowseInformation> </ClCompile> <Link> - <AdditionalDependencies>dxguid.lib;dwmapi.lib;WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>dxguid.lib;WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <ModuleDefinitionFile>libGLESv2.def</ModuleDefinitionFile> <GenerateDebugInformation>true</GenerateDebugInformation> <SubSystem>Windows</SubSystem> - <RandomizedBaseAddress>false</RandomizedBaseAddress> - <DataExecutionPrevention> - </DataExecutionPrevention> <TargetMachine>MachineX86</TargetMachine> </Link> <PostBuildEvent> @@ -114,16 +111,13 @@ <IntrinsicFunctions>false</IntrinsicFunctions> </ClCompile> <Link> - <AdditionalDependencies>dxguid.lib;dwmapi.lib;WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>dxguid.lib;WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> <ModuleDefinitionFile>libGLESv2.def</ModuleDefinitionFile> <GenerateDebugInformation>true</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> - <RandomizedBaseAddress>false</RandomizedBaseAddress> - <DataExecutionPrevention> - </DataExecutionPrevention> <TargetMachine>MachineX86</TargetMachine> </Link> <PostBuildEvent> @@ -150,16 +144,13 @@ <IntrinsicFunctions>false</IntrinsicFunctions> </ClCompile> <Link> - <AdditionalDependencies>dxguid.lib;dwmapi.lib;WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalDependencies>dxguid.lib;WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries> <ModuleDefinitionFile>libGLESv2.def</ModuleDefinitionFile> <GenerateDebugInformation>true</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> - <RandomizedBaseAddress>true</RandomizedBaseAddress> - <DataExecutionPrevention> - </DataExecutionPrevention> <TargetMachine>MachineX86</TargetMachine> </Link> <PostBuildEvent> @@ -238,4 +229,4 @@ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file
diff --git a/src/GLES2/libGLESv2/main.cpp b/src/GLES2/libGLESv2/main.cpp index 4393ae7..9ddca97 100644 --- a/src/GLES2/libGLESv2/main.cpp +++ b/src/GLES2/libGLESv2/main.cpp
@@ -1,6 +1,6 @@ // SwiftShader Software Renderer // -// Copyright(c) 2005-2012 TransGaming Inc. +// Copyright(c) 2005-2013 TransGaming Inc. // // All rights reserved. No part of this software may be copied, distributed, transmitted, // transcribed, stored in a retrieval system, translated into any human or computer @@ -107,9 +107,21 @@ namespace gl { +static gl::Current *getCurrent(void) +{ + Current *current = (Current*)sw::Thread::getLocalStorage(currentTLS); + + if(!current) + { + glAttachThread(); + } + + return (Current*)sw::Thread::getLocalStorage(currentTLS); +} + void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface) { - Current *current = (Current*)sw::Thread::getLocalStorage(currentTLS); + Current *current = getCurrent(); current->context = context; current->display = display; @@ -122,14 +134,14 @@ Context *getContext() { - Current *current = (Current*)sw::Thread::getLocalStorage(currentTLS); + Current *current = getCurrent(); return current->context; } egl::Display *getDisplay() { - Current *current = (Current*)sw::Thread::getLocalStorage(currentTLS); + Current *current = getCurrent(); return current->display; }