1aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy/* 2aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * Copyright (C) 2011 The Android Open Source Project 3aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * 4aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * you may not use this file except in compliance with the License. 6aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * You may obtain a copy of the License at 7aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * 8aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * 10aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * Unless required by applicable law or agreed to in writing, software 11aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * See the License for the specific language governing permissions and 14aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * limitations under the License. 15aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy */ 16aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 17aa6c24c21c727a196451332448d4e3b11a80be69Romain Guypackage android.view; 18aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 19aa6c24c21c727a196451332448d4e3b11a80be69Romain Guyimport android.graphics.Canvas; 20302a9df1d50373c82923bb84ff665dfce584fb22Romain Guyimport android.graphics.Matrix; 212bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guyimport android.graphics.Rect; 22aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 23aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy/** 24aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * An OpenGL ES 2.0 implementation of {@link HardwareLayer}. This 25aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * implementation can be used a rendering target. It generates a 26aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy * {@link Canvas} that can be used to render into an FBO using OpenGL. 27aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy */ 28aa6c24c21c727a196451332448d4e3b11a80be69Romain Guyclass GLES20RenderLayer extends GLES20Layer { 29aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy private int mLayerWidth; 30aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy private int mLayerHeight; 31aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 32aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy private final GLES20Canvas mCanvas; 33aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 34aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy GLES20RenderLayer(int width, int height, boolean isOpaque) { 35aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy super(width, height, isOpaque); 36aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 37aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy int[] layerInfo = new int[2]; 38aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy mLayer = GLES20Canvas.nCreateLayer(width, height, isOpaque, layerInfo); 39aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy if (mLayer != 0) { 40aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy mLayerWidth = layerInfo[0]; 41aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy mLayerHeight = layerInfo[1]; 42aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 43aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy mCanvas = new GLES20Canvas(mLayer, !isOpaque); 44aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy mFinalizer = new Finalizer(mLayer); 45aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } else { 46aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy mCanvas = null; 47aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy mFinalizer = null; 48aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } 49aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } 50aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 51aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy @Override 52aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy boolean isValid() { 53aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy return mLayer != 0 && mLayerWidth > 0 && mLayerHeight > 0; 54aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } 55aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 56aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy @Override 57603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase boolean resize(int width, int height) { 58603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase if (!isValid() || width <= 0 || height <= 0) return false; 59aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 60aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy mWidth = width; 61aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy mHeight = height; 62aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 63aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy if (width != mLayerWidth || height != mLayerHeight) { 64aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy int[] layerInfo = new int[2]; 65aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 66603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase if (GLES20Canvas.nResizeLayer(mLayer, width, height, layerInfo)) { 67603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayerWidth = layerInfo[0]; 68603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayerHeight = layerInfo[1]; 69603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } else { 70603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase // Failure: not enough GPU resources for requested size 71603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayer = 0; 72603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayerWidth = 0; 73603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayerHeight = 0; 74603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } 75aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } 76603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase return isValid(); 77aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } 78aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 79aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy @Override 80846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy void setOpaque(boolean isOpaque) { 81846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy mOpaque = isOpaque; 82846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy GLES20Canvas.nSetOpaqueLayer(mLayer, isOpaque); 83846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy } 84846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy 85846a533945576e5cb1a66529ca3a52d71749f04fRomain Guy @Override 86aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy HardwareCanvas getCanvas() { 87aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy return mCanvas; 88aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } 89aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 90aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy @Override 91c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy void end(Canvas currentCanvas) { 92c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy if (currentCanvas instanceof GLES20Canvas) { 93c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy ((GLES20Canvas) currentCanvas).resume(); 94c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy } 95aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } 96aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy 97aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy @Override 98c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy HardwareCanvas start(Canvas currentCanvas) { 99c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy if (currentCanvas instanceof GLES20Canvas) { 100c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy ((GLES20Canvas) currentCanvas).interrupt(); 101c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy } 102aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy return getCanvas(); 103aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy } 104302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy 105302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy /** 106302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy * Ignored 107302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy */ 108302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy @Override 109302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy void setTransform(Matrix matrix) { 110302a9df1d50373c82923bb84ff665dfce584fb22Romain Guy } 1112bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy 1122bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy @Override 11311cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy void redrawLater(DisplayList displayList, Rect dirtyRect) { 1142bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy GLES20Canvas.nUpdateRenderLayer(mLayer, mCanvas.getRenderer(), 1152bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy ((GLES20DisplayList) displayList).getNativeDisplayList(), 1162bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom); 1172bf68f063b0077ddef6ebfe54f2ae5e063c2c229Romain Guy } 118aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy} 119