diff options
-rw-r--r-- | core/java/android/view/GLES20RenderLayer.java | 10 | ||||
-rw-r--r-- | core/java/android/view/GLES20TextureLayer.java | 5 | ||||
-rw-r--r-- | core/java/android/view/HardwareLayer.java | 7 | ||||
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 5 | ||||
-rw-r--r-- | core/jni/android_view_GLES20Canvas.cpp | 12 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.h | 91 |
6 files changed, 91 insertions, 39 deletions
diff --git a/core/java/android/view/GLES20RenderLayer.java b/core/java/android/view/GLES20RenderLayer.java index a77425a..b5cfc11 100644 --- a/core/java/android/view/GLES20RenderLayer.java +++ b/core/java/android/view/GLES20RenderLayer.java @@ -82,17 +82,11 @@ class GLES20RenderLayer extends GLES20Layer { } @Override - void end(Canvas currentCanvas) { - if (currentCanvas instanceof GLES20Canvas) { - ((GLES20Canvas) currentCanvas).resume(); - } + void end() { } @Override - HardwareCanvas start(Canvas currentCanvas) { - if (currentCanvas instanceof GLES20Canvas) { - ((GLES20Canvas) currentCanvas).interrupt(); - } + HardwareCanvas start() { return getCanvas(); } diff --git a/core/java/android/view/GLES20TextureLayer.java b/core/java/android/view/GLES20TextureLayer.java index e198ef6..6ad36ef 100644 --- a/core/java/android/view/GLES20TextureLayer.java +++ b/core/java/android/view/GLES20TextureLayer.java @@ -16,7 +16,6 @@ package android.view; -import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.SurfaceTexture; @@ -57,12 +56,12 @@ class GLES20TextureLayer extends GLES20Layer { } @Override - HardwareCanvas start(Canvas currentCanvas) { + HardwareCanvas start() { return null; } @Override - void end(Canvas currentCanvas) { + void end() { } SurfaceTexture getSurfaceTexture() { diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/HardwareLayer.java index 06c6e7c..8fdf104 100644 --- a/core/java/android/view/HardwareLayer.java +++ b/core/java/android/view/HardwareLayer.java @@ -17,7 +17,6 @@ package android.view; import android.graphics.Bitmap; -import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Rect; @@ -144,15 +143,13 @@ abstract class HardwareLayer { /** * This must be invoked before drawing onto this layer. - * @param currentCanvas */ - abstract HardwareCanvas start(Canvas currentCanvas); + abstract HardwareCanvas start(); /** * This must be invoked after drawing onto this layer. - * @param currentCanvas */ - abstract void end(Canvas currentCanvas); + abstract void end(); /** * Copies this layer into the specified bitmap. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index afcbaaf..3993432 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1408,7 +1408,6 @@ public final class ViewRootImpl implements ViewParent, disposeResizeBuffer(); boolean completed = false; - HardwareCanvas hwRendererCanvas = mAttachInfo.mHardwareRenderer.getCanvas(); HardwareCanvas layerCanvas = null; try { if (mResizeBuffer == null) { @@ -1418,7 +1417,7 @@ public final class ViewRootImpl implements ViewParent, mResizeBuffer.getHeight() != mHeight) { mResizeBuffer.resize(mWidth, mHeight); } - layerCanvas = mResizeBuffer.start(hwRendererCanvas); + layerCanvas = mResizeBuffer.start(); layerCanvas.setViewport(mWidth, mHeight); layerCanvas.onPreDraw(null); final int restoreCount = layerCanvas.save(); @@ -1457,7 +1456,7 @@ public final class ViewRootImpl implements ViewParent, layerCanvas.onPostDraw(); } if (mResizeBuffer != null) { - mResizeBuffer.end(hwRendererCanvas); + mResizeBuffer.end(); if (!completed) { mResizeBuffer.destroy(); mResizeBuffer = null; diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index 9fc73a4..2bff8a1 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -720,16 +720,6 @@ static void android_view_GLES20Canvas_outputDisplayList(JNIEnv* env, // Layers // ---------------------------------------------------------------------------- -static void android_view_GLES20Canvas_interrupt(JNIEnv* env, jobject clazz, - OpenGLRenderer* renderer) { - renderer->interrupt(); -} - -static void android_view_GLES20Canvas_resume(JNIEnv* env, jobject clazz, - OpenGLRenderer* renderer) { - renderer->resume(); -} - static OpenGLRenderer* android_view_GLES20Canvas_createLayerRenderer(JNIEnv* env, jobject clazz, Layer* layer) { if (layer) { @@ -972,8 +962,6 @@ static JNINativeMethod gMethods[] = { { "nResetDisplayListRenderer", "(I)V", (void*) android_view_GLES20Canvas_resetDisplayListRenderer }, { "nOutputDisplayList", "(II)V", (void*) android_view_GLES20Canvas_outputDisplayList }, - { "nInterrupt", "(I)V", (void*) android_view_GLES20Canvas_interrupt }, - { "nResume", "(I)V", (void*) android_view_GLES20Canvas_resume }, { "nCreateLayerRenderer", "(I)I", (void*) android_view_GLES20Canvas_createLayerRenderer }, { "nCreateLayer", "(IIZ[I)I", (void*) android_view_GLES20Canvas_createLayer }, diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index 51683e1..f4e6919 100644 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -63,17 +63,54 @@ public: ANDROID_API OpenGLRenderer(); virtual ~OpenGLRenderer(); + /** + * Indicates whether this renderer executes drawing commands immediately. + * If this method returns true, the drawing commands will be executed + * later. + */ virtual bool isDeferred(); + /** + * Sets the dimension of the underlying drawing surface. This method must + * be called at least once every time the drawing surface changes size. + * + * @param width The width in pixels of the underlysing surface + * @param height The height in pixels of the underlysing surface + */ virtual void setViewport(int width, int height); + /** + * Prepares the renderer to draw a frame. This method must be invoked + * at the beginning of each frame. When this method is invoked, the + * entire drawing surface is assumed to be redrawn. + * + * @param opaque If true, the target surface is considered opaque + * and will not be cleared. If false, the target surface + * will be cleared + */ ANDROID_API int prepare(bool opaque); + + /** + * Prepares the renderer to draw a frame. This method must be invoked + * at the beginning of each frame. Only the specified rectangle of the + * frame is assumed to be dirty. A clip will automatically be set to + * the specified rectangle. + * + * @param left The left coordinate of the dirty rectangle + * @param top The top coordinate of the dirty rectangle + * @param right The right coordinate of the dirty rectangle + * @param bottom The bottom coordinate of the dirty rectangle + * @param opaque If true, the target surface is considered opaque + * and will not be cleared. If false, the target surface + * will be cleared in the specified dirty rectangle + */ virtual int prepareDirty(float left, float top, float right, float bottom, bool opaque); - virtual void finish(); - // These two calls must not be recorded in display lists - virtual void interrupt(); - virtual void resume(); + /** + * Indicates the end of a frame. This method must be invoked whenever + * the caller is done rendering a frame. + */ + virtual void finish(); ANDROID_API status_t invokeFunctors(Rect& dirty); ANDROID_API void detachFunctor(Functor* functor); @@ -90,10 +127,6 @@ public: virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha, int flags); - void setAlpha(float alpha) { - mSnapshot->alpha = alpha; - } - virtual void translate(float dx, float dy); virtual void rotate(float degrees); virtual void scale(float sx, float sy); @@ -159,12 +192,49 @@ public: SkPaint* filterPaint(SkPaint* paint); + /** + * Returns the desired size for the stencil buffer. If the returned value + * is 0, then no stencil buffer is required. + */ ANDROID_API static uint32_t getStencilSize(); + /** + * Sets the alpha on the current snapshot. This alpha value will be modulated + * with other alpha values when drawing primitives. + */ + void setAlpha(float alpha) { + mSnapshot->alpha = alpha; + } + + /** + * Inserts a named group marker in the stream of GL commands. This marker + * can be used by tools to group commands into logical groups. A call to + * this method must always be followed later on by a call to endMark(). + */ void startMark(const char* name) const; + + /** + * Closes the last group marker opened by startMark(). + */ void endMark() const; protected: + + /** + * This method must be invoked before handing control over to a draw functor. + * See callDrawGLFunction() for instance. + * + * This command must not be recorded inside display lists. + */ + void interrupt(); + + /** + * This method must be invoked after getting control back from a draw functor. + * + * This command must not be recorded inside display lists. + */ + void resume(); + /** * Compose the layer defined in the current snapshot with the layer * defined by the previous snapshot. @@ -579,6 +649,7 @@ private: * Invoked before any drawing operation. This sets required state. */ void setupDraw(bool clear = true); + /** * Various methods to setup OpenGL rendering. */ @@ -626,6 +697,10 @@ private: void finishDrawTexture(); void accountForClear(SkXfermode::Mode mode); + /** + * Renders the specified region as a series of rectangles. This method + * is used for debugging only. + */ void drawRegionRects(const Region& region); /** |