Loading include/ui/PixelFormat.h +1 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,7 @@ status_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info); ssize_t bytesPerPixel(PixelFormat format); ssize_t bitsPerPixel(PixelFormat format); unsigned int minColorDepth(PixelFormat format); }; // namespace android Loading libs/ui/PixelFormat.cpp +16 −0 Original line number Diff line number Diff line Loading @@ -160,6 +160,22 @@ ssize_t bitsPerPixel(PixelFormat format) { return BAD_VALUE; } unsigned int minColorDepth(PixelFormat format) { switch (format) { case PIXEL_FORMAT_RGBA_8888: case PIXEL_FORMAT_RGBX_8888: case PIXEL_FORMAT_BGRA_8888: case PIXEL_FORMAT_RGB_888: return 8; case PIXEL_FORMAT_RGB_565: case PIXEL_FORMAT_RGBA_5551: return 5; case PIXEL_FORMAT_RGBA_4444: return 4; } return BAD_VALUE; } // ---------------------------------------------------------------------------- }; // namespace android // ---------------------------------------------------------------------------- Loading services/surfaceflinger/Layer.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, mDebug(false), mFormat(PIXEL_FORMAT_NONE), mOpaqueLayer(true), mNeedsDithering(false), mTransactionFlags(0), mQueuedFrames(0), mCurrentTransform(0), Loading Loading @@ -199,6 +200,12 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h, mSurfaceFlingerConsumer->setDefaultBufferFormat(format); mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); if (mFlinger->getUseDithering()) { int displayMinColorDepth = mFlinger->getMinColorDepth(); int layerMinColorDepth = minColorDepth(format); mNeedsDithering = (layerMinColorDepth > displayMinColorDepth); } return NO_ERROR; } Loading Loading @@ -573,6 +580,7 @@ void Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& cli { RenderEngine& engine(mFlinger->getRenderEngine()); computeGeometry(hw, mMesh); engine.setDither(false); engine.setupFillWithColor(red, green, blue, alpha); engine.drawMesh(mMesh); } Loading Loading @@ -619,6 +627,7 @@ void Layer::drawWithOpenGL( texCoords[3] = vec2(right, 1.0f - top); RenderEngine& engine(mFlinger->getRenderEngine()); engine.setDither(needsDithering()); engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(), s.alpha); engine.drawMesh(mMesh); engine.disableBlending(); Loading services/surfaceflinger/Layer.h +6 −0 Original line number Diff line number Diff line Loading @@ -152,6 +152,11 @@ public: */ virtual bool isOpaque() const; /* * needsDithering - true if this surface needs dithering */ virtual bool needsDithering() const { return mNeedsDithering; } /* * isSecure - true if this surface is secure, that is if it prevents * screenshots or VNC servers. Loading Loading @@ -340,6 +345,7 @@ private: mutable bool mDebug; PixelFormat mFormat; bool mOpaqueLayer; bool mNeedsDithering; // these are protected by an external lock State mCurrentState; Loading services/surfaceflinger/RenderEngine/RenderEngine.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -205,6 +205,14 @@ void RenderEngine::readPixels(size_t l, size_t b, size_t w, size_t h, uint32_t* glReadPixels(l, b, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); } void RenderEngine::setDither(bool dither) { if (dither) { glEnable(GL_DITHER); } else { glDisable(GL_DITHER); } } void RenderEngine::dump(String8& result) { const GLExtensions& extensions(GLExtensions::getInstance()); result.appendFormat("GLES: %s, %s, %s\n", Loading Loading
include/ui/PixelFormat.h +1 −0 Original line number Diff line number Diff line Loading @@ -122,6 +122,7 @@ status_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info); ssize_t bytesPerPixel(PixelFormat format); ssize_t bitsPerPixel(PixelFormat format); unsigned int minColorDepth(PixelFormat format); }; // namespace android Loading
libs/ui/PixelFormat.cpp +16 −0 Original line number Diff line number Diff line Loading @@ -160,6 +160,22 @@ ssize_t bitsPerPixel(PixelFormat format) { return BAD_VALUE; } unsigned int minColorDepth(PixelFormat format) { switch (format) { case PIXEL_FORMAT_RGBA_8888: case PIXEL_FORMAT_RGBX_8888: case PIXEL_FORMAT_BGRA_8888: case PIXEL_FORMAT_RGB_888: return 8; case PIXEL_FORMAT_RGB_565: case PIXEL_FORMAT_RGBA_5551: return 5; case PIXEL_FORMAT_RGBA_4444: return 4; } return BAD_VALUE; } // ---------------------------------------------------------------------------- }; // namespace android // ---------------------------------------------------------------------------- Loading
services/surfaceflinger/Layer.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, mDebug(false), mFormat(PIXEL_FORMAT_NONE), mOpaqueLayer(true), mNeedsDithering(false), mTransactionFlags(0), mQueuedFrames(0), mCurrentTransform(0), Loading Loading @@ -199,6 +200,12 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h, mSurfaceFlingerConsumer->setDefaultBufferFormat(format); mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); if (mFlinger->getUseDithering()) { int displayMinColorDepth = mFlinger->getMinColorDepth(); int layerMinColorDepth = minColorDepth(format); mNeedsDithering = (layerMinColorDepth > displayMinColorDepth); } return NO_ERROR; } Loading Loading @@ -573,6 +580,7 @@ void Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& cli { RenderEngine& engine(mFlinger->getRenderEngine()); computeGeometry(hw, mMesh); engine.setDither(false); engine.setupFillWithColor(red, green, blue, alpha); engine.drawMesh(mMesh); } Loading Loading @@ -619,6 +627,7 @@ void Layer::drawWithOpenGL( texCoords[3] = vec2(right, 1.0f - top); RenderEngine& engine(mFlinger->getRenderEngine()); engine.setDither(needsDithering()); engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(), s.alpha); engine.drawMesh(mMesh); engine.disableBlending(); Loading
services/surfaceflinger/Layer.h +6 −0 Original line number Diff line number Diff line Loading @@ -152,6 +152,11 @@ public: */ virtual bool isOpaque() const; /* * needsDithering - true if this surface needs dithering */ virtual bool needsDithering() const { return mNeedsDithering; } /* * isSecure - true if this surface is secure, that is if it prevents * screenshots or VNC servers. Loading Loading @@ -340,6 +345,7 @@ private: mutable bool mDebug; PixelFormat mFormat; bool mOpaqueLayer; bool mNeedsDithering; // these are protected by an external lock State mCurrentState; Loading
services/surfaceflinger/RenderEngine/RenderEngine.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -205,6 +205,14 @@ void RenderEngine::readPixels(size_t l, size_t b, size_t w, size_t h, uint32_t* glReadPixels(l, b, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); } void RenderEngine::setDither(bool dither) { if (dither) { glEnable(GL_DITHER); } else { glDisable(GL_DITHER); } } void RenderEngine::dump(String8& result) { const GLExtensions& extensions(GLExtensions::getInstance()); result.appendFormat("GLES: %s, %s, %s\n", Loading