Make Blitter part of Renderer. This fixes two issues. We had a global 'blitter' instance which doesn't get destroyed until the library us unloaded. This is reported as a memory leak (albeit benign). Potentially worse is that the singleton was shared between all threads, and the Routine cache isn't thread safe. Bug chromium:732691 Change-Id: I7b90d7d2bc67b4a9f78cdf4f54a76fa2f798b7cc Reviewed-on: https://swiftshader-review.googlesource.com/10128 Tested-by: Nicolas Capens <capn@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp index 5e09b65..b6f76c8 100644 --- a/src/OpenGL/libGLES_CM/Context.cpp +++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -2850,6 +2850,11 @@ projectionStack.load(P); } +void Context::blit(sw::Surface *source, const sw::SliceRect &sRect, sw::Surface *dest, const sw::SliceRect &dRect) +{ + device->blit(source, sRect, dest, dRect, false); +} + void Context::finish() { device->finish();
diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h index ab169be..ece2860 100644 --- a/src/OpenGL/libGLES_CM/Context.h +++ b/src/OpenGL/libGLES_CM/Context.h
@@ -490,11 +490,12 @@ bool isQueryParameterBool(GLenum pname); bool isQueryParameterPointer(GLenum pname); - void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels); - void clear(GLbitfield mask); void drawArrays(GLenum mode, GLint first, GLsizei count); void drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices); void drawTexture(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); + void blit(sw::Surface *source, const sw::SliceRect &sRect, sw::Surface *dest, const sw::SliceRect &dRect) override; + void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei *bufSize, void* pixels); + void clear(GLbitfield mask); void flush(); void recordInvalidEnum();
diff --git a/src/OpenGL/libGLES_CM/Texture.cpp b/src/OpenGL/libGLES_CM/Texture.cpp index e2e8400..494439a 100644 --- a/src/OpenGL/libGLES_CM/Texture.cpp +++ b/src/OpenGL/libGLES_CM/Texture.cpp
@@ -227,13 +227,13 @@ return image; } -void Texture::setImage(GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, egl::Image *image) +void Texture::setImage(egl::Context *context, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, egl::Image *image) { if(pixels && image) { egl::Image::UnpackInfo unpackInfo; unpackInfo.alignment = unpackAlignment; - image->loadImageData(0, 0, 0, image->getWidth(), image->getHeight(), 1, format, type, unpackInfo, pixels); + image->loadImageData(context, 0, 0, 0, image->getWidth(), image->getHeight(), 1, format, type, unpackInfo, pixels); } } @@ -245,7 +245,7 @@ } } -void Texture::subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, egl::Image *image) +void Texture::subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, egl::Image *image) { if(!image) { @@ -271,7 +271,7 @@ { egl::Image::UnpackInfo unpackInfo; unpackInfo.alignment = unpackAlignment; - image->loadImageData(xoffset, yoffset, 0, width, height, 1, format, type, unpackInfo, pixels); + image->loadImageData(context, xoffset, yoffset, 0, width, height, 1, format, type, unpackInfo, pixels); } } @@ -457,7 +457,7 @@ return levels; } -void Texture2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels) +void Texture2D::setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels) { if(image[level]) { @@ -471,7 +471,7 @@ return error(GL_OUT_OF_MEMORY); } - Texture::setImage(format, type, unpackAlignment, pixels, image[level]); + Texture::setImage(context, format, type, unpackAlignment, pixels, image[level]); } void Texture2D::bindTexImage(gl::Surface *surface) @@ -539,9 +539,9 @@ Texture::setCompressedImage(imageSize, pixels, image[level]); } -void Texture2D::subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels) +void Texture2D::subImage(egl::Context *context, 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]); + Texture::subImage(context, xoffset, yoffset, width, height, format, type, unpackAlignment, pixels, image[level]); } void Texture2D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels)
diff --git a/src/OpenGL/libGLES_CM/Texture.h b/src/OpenGL/libGLES_CM/Texture.h index 3e0fa8a..0c7efc8 100644 --- a/src/OpenGL/libGLES_CM/Texture.h +++ b/src/OpenGL/libGLES_CM/Texture.h
@@ -99,8 +99,8 @@ protected: ~Texture() override; - void setImage(GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, egl::Image *image); - void subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, egl::Image *image); + void setImage(egl::Context *context, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, egl::Image *image); + void subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, egl::Image *image); void setCompressedImage(GLsizei imageSize, const void *pixels, egl::Image *image); void subImageCompressed(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, egl::Image *image); @@ -140,9 +140,9 @@ sw::Format getInternalFormat(GLenum target, GLint level) const override; int getLevelCount() const override; - void setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); + void setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels); 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 subImage(egl::Context *context, 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); void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source); void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source);
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cpp b/src/OpenGL/libGLES_CM/libGLES_CM.cpp index b47ce13..62acae1 100644 --- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp +++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
@@ -4320,7 +4320,7 @@ return error(GL_INVALID_OPERATION); } - texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels); + texture->setImage(context, level, width, height, format, type, context->getUnpackAlignment(), pixels); } else UNREACHABLE(target); } @@ -4557,7 +4557,7 @@ if(validateSubImageParams(false, width, height, xoffset, yoffset, target, level, format, texture)) { - texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels); + texture->subImage(context, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels); } } else UNREACHABLE(target);
diff --git a/src/OpenGL/libGLES_CM/main.cpp b/src/OpenGL/libGLES_CM/main.cpp index f9b3cbd..6a2ddc9 100644 --- a/src/OpenGL/libGLES_CM/main.cpp +++ b/src/OpenGL/libGLES_CM/main.cpp
@@ -93,14 +93,14 @@ return static_cast<es1::Context*>(context); } - return 0; + return nullptr; } Device *getDevice() { Context *context = getContext(); - return context ? context->getDevice() : 0; + return context ? context->getDevice() : nullptr; } // Records an error code