diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/gui/SurfaceTexture.cpp | 15 | ||||
-rw-r--r-- | libs/gui/tests/SurfaceTextureClient_test.cpp | 6 | ||||
-rw-r--r-- | libs/gui/tests/SurfaceTexture_test.cpp | 2 | ||||
-rw-r--r-- | libs/gui/tests/Surface_test.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 24 | ||||
-rw-r--r-- | libs/hwui/ProgramCache.cpp | 9 | ||||
-rw-r--r-- | libs/hwui/ProgramCache.h | 5 | ||||
-rw-r--r-- | libs/rs/scriptc/rs_types.rsh | 11 | ||||
-rw-r--r-- | libs/utils/RefBase.cpp | 2 |
9 files changed, 55 insertions, 21 deletions
diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index 39418f0..15a176e 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -274,10 +274,14 @@ status_t SurfaceTexture::updateTexImage() { EGLImageKHR image = mSlots[mLastQueued].mEglImage; if (image == EGL_NO_IMAGE_KHR) { EGLDisplay dpy = eglGetCurrentDisplay(); - sp<GraphicBuffer> graphicBuffer = mSlots[mLastQueued].mGraphicBuffer; - image = createImage(dpy, graphicBuffer); + image = createImage(dpy, mSlots[mLastQueued].mGraphicBuffer); mSlots[mLastQueued].mEglImage = image; mSlots[mLastQueued].mEglDisplay = dpy; + if (image == EGL_NO_IMAGE_KHR) { + // NOTE: if dpy was invalid, createImage() is guaranteed to + // fail. so we'd end up here. + return -EINVAL; + } } GLint error; @@ -483,12 +487,9 @@ EGLImageKHR SurfaceTexture::createImage(EGLDisplay dpy, }; EGLImageKHR image = eglCreateImageKHR(dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, cbuf, attrs); - EGLint error = eglGetError(); - if (error != EGL_SUCCESS) { + if (image == EGL_NO_IMAGE_KHR) { + EGLint error = eglGetError(); LOGE("error creating EGLImage: %#x", error); - } else if (image == EGL_NO_IMAGE_KHR) { - LOGE("no error reported, but no image was returned by " - "eglCreateImageKHR"); } return image; } diff --git a/libs/gui/tests/SurfaceTextureClient_test.cpp b/libs/gui/tests/SurfaceTextureClient_test.cpp index 348171d..db781de 100644 --- a/libs/gui/tests/SurfaceTextureClient_test.cpp +++ b/libs/gui/tests/SurfaceTextureClient_test.cpp @@ -64,7 +64,7 @@ TEST_F(SurfaceTextureClientTest, ANativeWindowLockFails) { ASSERT_EQ(BAD_VALUE, ANativeWindow_lock(anw.get(), &buf, NULL)); } -TEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceFails) { +TEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceSucceeds) { sp<ANativeWindow> anw(mSTC); EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); @@ -94,8 +94,8 @@ TEST_F(SurfaceTextureClientTest, EglCreateWindowSurfaceFails) { EGLSurface eglSurface = eglCreateWindowSurface(dpy, myConfig, anw.get(), NULL); - ASSERT_EQ(EGL_NO_SURFACE, eglSurface); - ASSERT_EQ(EGL_BAD_NATIVE_WINDOW, eglGetError()); + ASSERT_NE(EGL_NO_SURFACE, eglSurface); + ASSERT_EQ(EGL_SUCCESS, eglGetError()); eglTerminate(dpy); } diff --git a/libs/gui/tests/SurfaceTexture_test.cpp b/libs/gui/tests/SurfaceTexture_test.cpp index 4184463..6c71343 100644 --- a/libs/gui/tests/SurfaceTexture_test.cpp +++ b/libs/gui/tests/SurfaceTexture_test.cpp @@ -76,7 +76,7 @@ protected: mComposerClient = new SurfaceComposerClient; ASSERT_EQ(NO_ERROR, mComposerClient->initCheck()); - mSurfaceControl = mComposerClient->createSurface(getpid(), + mSurfaceControl = mComposerClient->createSurface( String8("Test Surface"), 0, getSurfaceWidth(), getSurfaceHeight(), PIXEL_FORMAT_RGB_888, 0); diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index fd07479..440a48b 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -30,7 +30,7 @@ protected: mComposerClient = new SurfaceComposerClient; ASSERT_EQ(NO_ERROR, mComposerClient->initCheck()); - mSurfaceControl = mComposerClient->createSurface(getpid(), + mSurfaceControl = mComposerClient->createSurface( String8("Test Surface"), 0, 32, 32, PIXEL_FORMAT_RGB_888, 0); ASSERT_TRUE(mSurfaceControl != NULL); diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 75f5a5f..dd0cca2 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -1407,7 +1407,7 @@ void OpenGLRenderer::drawLinesAsQuads(float *points, int count, bool isAA, bool if (!isAA) { setupDrawVertices(vertices); } else { - void *alphaCoords = ((void*) aaVertices) + gVertexAlphaOffset; + AlphaVertex* alphaCoords = aaVertices + gVertexAlphaOffset; // innerProportion is the ratio of the inner (non-AA) port of the line to the total // AA stroke width (the base stroke width expanded by a half pixel on either side). // This value is used in the fragment shader to determine how to fill fragments. @@ -1418,7 +1418,9 @@ void OpenGLRenderer::drawLinesAsQuads(float *points, int count, bool isAA, bool int generatedVerticesCount = 0; AlphaVertex *prevAAVertex = NULL; Vertex *prevVertex = NULL; - float inverseScaleX, inverseScaleY; + float inverseScaleX = 1.0f; + float inverseScaleY = 1.0f; + if (isHairline) { // The quad that we use for AA hairlines needs to account for scaling because the line // should always be one pixel wide regardless of scale. @@ -1438,6 +1440,7 @@ void OpenGLRenderer::drawLinesAsQuads(float *points, int count, bool isAA, bool inverseScaleY = (scaleY != 0) ? (inverseScaleY / scaleY) : 0; } } + for (int i = 0; i < count; i += 4) { // a = start point, b = end point vec2 a(points[i], points[i + 1]); @@ -1767,23 +1770,32 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, count, mShadowRadius); const AutoTexture autoCleanup(shadow); - const float sx = x - shadow->left + mShadowDx; - const float sy = y - shadow->top + mShadowDy; + const float sx = oldX - shadow->left + mShadowDx; + const float sy = oldY - shadow->top + mShadowDy; const int shadowAlpha = ((mShadowColor >> 24) & 0xFF); + int shadowColor = mShadowColor; + if (mShader) { + shadowColor = 0xffffffff; + } glActiveTexture(gTextureUnits[0]); setupDraw(); setupDrawWithTexture(true); - setupDrawAlpha8Color(mShadowColor, shadowAlpha < 255 ? shadowAlpha : alpha); + setupDrawAlpha8Color(shadowColor, shadowAlpha < 255 ? shadowAlpha : alpha); + setupDrawColorFilter(); + setupDrawShader(); setupDrawBlending(true, mode); setupDrawProgram(); - setupDrawModelView(sx, sy, sx + shadow->width, sy + shadow->height, pureTranslate); + setupDrawModelView(sx, sy, sx + shadow->width, sy + shadow->height); setupDrawTexture(shadow->id); setupDrawPureColorUniforms(); + setupDrawColorFilterUniforms(); + setupDrawShaderUniforms(); setupDrawMesh(NULL, (GLvoid*) gMeshTextureOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, gMeshCount); + finishDrawTexture(); } diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp index b873bb8..80b1917 100644 --- a/libs/hwui/ProgramCache.cpp +++ b/libs/hwui/ProgramCache.cpp @@ -179,6 +179,8 @@ const char* gFS_Fast_SingleModulateGradient = // General case const char* gFS_Main_FetchColor = " fragColor = color;\n"; +const char* gFS_Main_ModulateColor = + " fragColor *= color.a;\n"; const char* gFS_Main_AccountForWidth = " if (distance < boundaryWidth) {\n" " fragColor *= (distance * inverseBoundaryWidth);\n" @@ -581,6 +583,7 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti shader.append(gFS_Main_FetchBitmapNpot); } } + bool applyModulate = false; // Case when we have two shaders set if (description.hasGradient && description.hasBitmap) { int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp; @@ -590,15 +593,21 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti shader.append(gFS_Main_BlendShadersGB); } shader.append(gFS_Main_BlendShaders_Modulate[op]); + applyModulate = true; } else { if (description.hasGradient) { int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp; shader.append(gFS_Main_GradientShader_Modulate[op]); + applyModulate = true; } else if (description.hasBitmap) { int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp; shader.append(gFS_Main_BitmapShader_Modulate[op]); + applyModulate = true; } } + if (description.modulate && applyModulate) { + shader.append(gFS_Main_ModulateColor); + } // Apply the color op if needed shader.append(gFS_Main_ApplyColorOp[description.colorOp]); // Output the fragment diff --git a/libs/hwui/ProgramCache.h b/libs/hwui/ProgramCache.h index 9a7a2d2..18d98cb 100644 --- a/libs/hwui/ProgramCache.h +++ b/libs/hwui/ProgramCache.h @@ -57,7 +57,6 @@ namespace uirenderer { #define PROGRAM_KEY_COLOR_BLEND 0x80 #define PROGRAM_KEY_BITMAP_NPOT 0x100 #define PROGRAM_KEY_SWAP_SRC_DST 0x2000 -#define PROGRAM_KEY_VERTEX_WIDTH (1 << 37) #define PROGRAM_KEY_BITMAP_WRAPS_MASK 0x600 #define PROGRAM_KEY_BITMAP_WRAPT_MASK 0x1800 @@ -76,6 +75,8 @@ namespace uirenderer { #define PROGRAM_IS_POINT_SHIFT 36 +#define PROGRAM_HAS_WIDTH_SHIFT 37 + /////////////////////////////////////////////////////////////////////////////// // Types /////////////////////////////////////////////////////////////////////////////// @@ -205,7 +206,6 @@ struct ProgramDescription { programid key() const { programid key = 0; if (hasTexture) key |= PROGRAM_KEY_TEXTURE; - if (hasWidth) key |= PROGRAM_KEY_VERTEX_WIDTH; if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE; if (hasBitmap) { key |= PROGRAM_KEY_BITMAP; @@ -239,6 +239,7 @@ struct ProgramDescription { if (swapSrcDst) key |= PROGRAM_KEY_SWAP_SRC_DST; if (modulate) key |= programid(0x1) << PROGRAM_MODULATE_SHIFT; if (isPoint) key |= programid(0x1) << PROGRAM_IS_POINT_SHIFT; + if (hasWidth) key |= programid(0x1) << PROGRAM_HAS_WIDTH_SHIFT; return key; } diff --git a/libs/rs/scriptc/rs_types.rsh b/libs/rs/scriptc/rs_types.rsh index a010096..d9f4b4b 100644 --- a/libs/rs/scriptc/rs_types.rsh +++ b/libs/rs/scriptc/rs_types.rsh @@ -36,6 +36,10 @@ typedef float float2 __attribute__((ext_vector_type(2))); typedef float float3 __attribute__((ext_vector_type(3))); typedef float float4 __attribute__((ext_vector_type(4))); +typedef double double2 __attribute__((ext_vector_type(2))); +typedef double double3 __attribute__((ext_vector_type(3))); +typedef double double4 __attribute__((ext_vector_type(4))); + typedef uchar uchar2 __attribute__((ext_vector_type(2))); typedef uchar uchar3 __attribute__((ext_vector_type(3))); typedef uchar uchar4 __attribute__((ext_vector_type(4))); @@ -48,6 +52,10 @@ typedef uint uint2 __attribute__((ext_vector_type(2))); typedef uint uint3 __attribute__((ext_vector_type(3))); typedef uint uint4 __attribute__((ext_vector_type(4))); +typedef ulong ulong2 __attribute__((ext_vector_type(2))); +typedef ulong ulong3 __attribute__((ext_vector_type(3))); +typedef ulong ulong4 __attribute__((ext_vector_type(4))); + typedef char char2 __attribute__((ext_vector_type(2))); typedef char char3 __attribute__((ext_vector_type(3))); typedef char char4 __attribute__((ext_vector_type(4))); @@ -60,6 +68,9 @@ typedef int int2 __attribute__((ext_vector_type(2))); typedef int int3 __attribute__((ext_vector_type(3))); typedef int int4 __attribute__((ext_vector_type(4))); +typedef long long2 __attribute__((ext_vector_type(2))); +typedef long long3 __attribute__((ext_vector_type(3))); +typedef long long4 __attribute__((ext_vector_type(4))); typedef struct { float m[16]; diff --git a/libs/utils/RefBase.cpp b/libs/utils/RefBase.cpp index bb6c125..2034486 100644 --- a/libs/utils/RefBase.cpp +++ b/libs/utils/RefBase.cpp @@ -524,7 +524,7 @@ void RefBase::weakref_type::printRefs() const void RefBase::weakref_type::trackMe(bool enable, bool retain) { - static_cast<const weakref_impl*>(this)->trackMe(enable, retain); + static_cast<weakref_impl*>(this)->trackMe(enable, retain); } RefBase::weakref_type* RefBase::createWeak(const void* id) const |