blob: 2953db41f1a4411b5a1a988e59418886f341f9f5 [file] [log] [blame]
Romain Guye4d01122010-06-16 18:44:05 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Romain Guya1db5742010-07-20 13:09:13 -070017#define LOG_TAG "OpenGLRenderer"
18
Romain Guye4d01122010-06-16 18:44:05 -070019#include "jni.h"
Patrick Dubroye4ac2d62010-12-01 11:23:13 -080020#include "GraphicsJNI.h"
Romain Guye4d01122010-06-16 18:44:05 -070021#include <nativehelper/JNIHelp.h>
Romain Guy65549432012-03-26 16:45:05 -070022
Romain Guye4d01122010-06-16 18:44:05 -070023#include <android_runtime/AndroidRuntime.h>
Romain Guy65549432012-03-26 16:45:05 -070024
John Reck773bbe02015-08-17 15:18:29 -070025#include <androidfw/ResourceTypes.h>
26
Romain Guy65549432012-03-26 16:45:05 -070027#include <cutils/properties.h>
Romain Guy8f0095c2011-05-02 17:24:22 -070028
Romain Guyce0537b2010-06-29 21:05:21 -070029#include <SkBitmap.h>
Romain Guy079ba2c2010-07-16 14:12:24 -070030#include <SkRegion.h>
Romain Guye4d01122010-06-16 18:44:05 -070031
Chris Craikdb663fe2015-04-20 13:34:45 -070032#include <DisplayListCanvas.h>
Romain Guy9d5316e2010-06-24 19:30:36 -070033#include <Rect.h>
John Reck113e0822014-03-18 09:22:59 -070034#include <RenderNode.h>
John Reck52244ff2014-05-01 21:27:37 -070035#include <CanvasProperty.h>
Behdad Esfahbod6ba30b82014-07-15 16:22:32 -040036#include <Paint.h>
John Reck0e89e2b2014-10-31 14:49:06 -070037#include <renderthread/RenderProxy.h>
Romain Guy85bf02f2010-06-22 13:11:24 -070038
Andreas Gampe987f79f2014-11-18 17:29:46 -080039#include "core_jni_helpers.h"
40
Romain Guye4d01122010-06-16 18:44:05 -070041namespace android {
42
Romain Guy9d5316e2010-06-24 19:30:36 -070043using namespace uirenderer;
44
Andreas Gampeed6b9df2014-11-20 22:02:20 -080045static struct {
46 jmethodID set;
47} gRectClassInfo;
48
Romain Guy244ada12012-03-28 16:41:26 -070049// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -070050// Setup
51// ----------------------------------------------------------------------------
52
Chris Craikc9070eb2015-03-09 18:50:14 -070053static void android_view_DisplayListCanvas_insertReorderBarrier(JNIEnv* env, jobject clazz,
Chris Craik8afd0f22014-08-21 17:41:57 -070054 jlong rendererPtr, jboolean reorderEnable) {
Chris Craikdb663fe2015-04-20 13:34:45 -070055 DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
Chris Craik8afd0f22014-08-21 17:41:57 -070056 renderer->insertReorderBarrier(reorderEnable);
57}
58
Romain Guy530041d2012-01-25 18:56:29 -080059// ----------------------------------------------------------------------------
60// Functor
61// ----------------------------------------------------------------------------
62
Chris Craikc9070eb2015-03-09 18:50:14 -070063static void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +000064 jlong rendererPtr, jlong functorPtr) {
Chris Craikdb663fe2015-04-20 13:34:45 -070065 DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
Chris Craik9f66ea02013-12-27 15:15:55 -080066 Functor* functor = reinterpret_cast<Functor*>(functorPtr);
Chris Craik956f3402015-04-27 16:41:00 -070067 renderer->callDrawGLFunction(functor);
Chet Haasedaf98e92011-01-10 14:10:36 -080068}
69
Romain Guy8f3b8e32012-03-27 16:33:45 -070070// ----------------------------------------------------------------------------
71// Misc
72// ----------------------------------------------------------------------------
73
Chris Craikc9070eb2015-03-09 18:50:14 -070074static jint android_view_DisplayListCanvas_getMaxTextureWidth(JNIEnv* env, jobject clazz) {
Romain Guyf61970fc2011-07-07 14:10:06 -070075 return Caches::getInstance().maxTextureSize;
76}
77
Chris Craikc9070eb2015-03-09 18:50:14 -070078static jint android_view_DisplayListCanvas_getMaxTextureHeight(JNIEnv* env, jobject clazz) {
Romain Guyf61970fc2011-07-07 14:10:06 -070079 return Caches::getInstance().maxTextureSize;
80}
81
Romain Guye4d01122010-06-16 18:44:05 -070082// ----------------------------------------------------------------------------
Romain Guybb9524b2010-06-22 18:56:38 -070083// Drawing
Romain Guy85bf02f2010-06-22 13:11:24 -070084// ----------------------------------------------------------------------------
85
John Reck773bbe02015-08-17 15:18:29 -070086static void android_view_DisplayListCanvas_drawPatch(JNIEnv* env, jobject clazz,
87 jlong rendererPtr, jobject jbitmap, jlong patchPtr,
88 float left, float top, float right, float bottom, jlong paintPtr) {
89 SkBitmap bitmap;
90 GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
91 DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
92 Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(patchPtr);
93 Paint* paint = reinterpret_cast<Paint*>(paintPtr);
94 renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);
95}
96
Chris Craikc9070eb2015-03-09 18:50:14 -070097static void android_view_DisplayListCanvas_drawRoundRectProps(JNIEnv* env, jobject clazz,
Jorim Jaggi072707d2014-09-15 17:20:08 +020098 jlong rendererPtr, jlong leftPropPtr, jlong topPropPtr, jlong rightPropPtr,
99 jlong bottomPropPtr, jlong rxPropPtr, jlong ryPropPtr, jlong paintPropPtr) {
Chris Craikdb663fe2015-04-20 13:34:45 -0700100 DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
Jorim Jaggi072707d2014-09-15 17:20:08 +0200101 CanvasPropertyPrimitive* leftProp = reinterpret_cast<CanvasPropertyPrimitive*>(leftPropPtr);
102 CanvasPropertyPrimitive* topProp = reinterpret_cast<CanvasPropertyPrimitive*>(topPropPtr);
103 CanvasPropertyPrimitive* rightProp = reinterpret_cast<CanvasPropertyPrimitive*>(rightPropPtr);
104 CanvasPropertyPrimitive* bottomProp = reinterpret_cast<CanvasPropertyPrimitive*>(bottomPropPtr);
105 CanvasPropertyPrimitive* rxProp = reinterpret_cast<CanvasPropertyPrimitive*>(rxPropPtr);
106 CanvasPropertyPrimitive* ryProp = reinterpret_cast<CanvasPropertyPrimitive*>(ryPropPtr);
107 CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
108 renderer->drawRoundRect(leftProp, topProp, rightProp, bottomProp, rxProp, ryProp, paintProp);
109}
110
Chris Craikc9070eb2015-03-09 18:50:14 -0700111static void android_view_DisplayListCanvas_drawCircleProps(JNIEnv* env, jobject clazz,
John Reck52244ff2014-05-01 21:27:37 -0700112 jlong rendererPtr, jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
Chris Craikdb663fe2015-04-20 13:34:45 -0700113 DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
John Reck52244ff2014-05-01 21:27:37 -0700114 CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
115 CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr);
116 CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr);
117 CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr);
118 renderer->drawCircle(xProp, yProp, radiusProp, paintProp);
119}
120
Romain Guyb051e892010-09-28 19:09:36 -0700121// ----------------------------------------------------------------------------
122// Display lists
123// ----------------------------------------------------------------------------
124
Chris Craikc9070eb2015-03-09 18:50:14 -0700125static jlong android_view_DisplayListCanvas_finishRecording(JNIEnv* env,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000126 jobject clazz, jlong rendererPtr) {
Chris Craikdb663fe2015-04-20 13:34:45 -0700127 DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
John Reck44fd8d22014-02-26 11:00:11 -0800128 return reinterpret_cast<jlong>(renderer->finishRecording());
129}
130
Derek Sollenbergercc882b62015-07-09 15:51:20 -0400131static jlong android_view_DisplayListCanvas_createDisplayListCanvas(JNIEnv* env, jobject clazz,
132 jint width, jint height) {
133 return reinterpret_cast<jlong>(new DisplayListCanvas(width, height));
Chet Haase5977baa2011-01-05 18:01:22 -0800134}
135
Derek Sollenbergercc882b62015-07-09 15:51:20 -0400136static void android_view_DisplayListCanvas_resetDisplayListCanvas(JNIEnv* env, jobject clazz,
137 jlong rendererPtr, jint width, jint height) {
138 DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
139 renderer->reset(width, height);
140}
141
142
Chris Craikc9070eb2015-03-09 18:50:14 -0700143static void android_view_DisplayListCanvas_drawRenderNode(JNIEnv* env,
Chris Craik956f3402015-04-27 16:41:00 -0700144 jobject clazz, jlong rendererPtr, jlong renderNodePtr) {
Chris Craikdb663fe2015-04-20 13:34:45 -0700145 DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
Chris Craika7090e02014-06-20 16:01:00 -0700146 RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
Chris Craik956f3402015-04-27 16:41:00 -0700147 renderer->drawRenderNode(renderNode);
Romain Guyb051e892010-09-28 19:09:36 -0700148}
149
Romain Guy6c319ca2011-01-11 14:29:25 -0800150// ----------------------------------------------------------------------------
151// Layers
152// ----------------------------------------------------------------------------
153
Chris Craikc9070eb2015-03-09 18:50:14 -0700154static void android_view_DisplayListCanvas_drawLayer(JNIEnv* env, jobject clazz,
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000155 jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) {
Chris Craikdb663fe2015-04-20 13:34:45 -0700156 DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
John Reck12f5e342014-11-07 07:53:43 -0800157 DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
Chris Craika08f95c2013-03-15 17:24:33 -0700158 renderer->drawLayer(layer, x, y);
Romain Guy6c319ca2011-01-11 14:29:25 -0800159}
160
Romain Guy16393512010-08-08 00:14:31 -0700161// ----------------------------------------------------------------------------
162// Common
163// ----------------------------------------------------------------------------
164
Chris Craikc9070eb2015-03-09 18:50:14 -0700165static jboolean android_view_DisplayListCanvas_isAvailable(JNIEnv* env, jobject clazz) {
John Recka2732a22014-12-18 13:52:33 -0800166 char prop[PROPERTY_VALUE_MAX];
167 if (property_get("ro.kernel.qemu", prop, NULL) == 0) {
168 // not in the emulator
169 return JNI_TRUE;
Jesse Hall44063452011-12-01 11:27:45 -0800170 }
John Recka2732a22014-12-18 13:52:33 -0800171 // In the emulator this property will be set to 1 when hardware GLES is
172 // enabled, 0 otherwise. On old emulator versions it will be undefined.
173 property_get("ro.kernel.qemu.gles", prop, "0");
174 return atoi(prop) == 1 ? JNI_TRUE : JNI_FALSE;
Romain Guy16393512010-08-08 00:14:31 -0700175}
176
Romain Guya1db5742010-07-20 13:09:13 -0700177// ----------------------------------------------------------------------------
Chet Haase9c1e23b2011-03-24 10:51:31 -0700178// Logging
179// ----------------------------------------------------------------------------
180
Chet Haase9c1e23b2011-03-24 10:51:31 -0700181static void
Romain Guy65b345f2011-07-27 18:51:50 -0700182android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
John Recka2732a22014-12-18 13:52:33 -0800183 int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
Chris Craik2ae07332015-01-21 14:22:39 -0800184 android::uirenderer::renderthread::RenderProxy::dumpGraphicsMemory(fd);
Chet Haase9c1e23b2011-03-24 10:51:31 -0700185}
186
187// ----------------------------------------------------------------------------
Romain Guye4d01122010-06-16 18:44:05 -0700188// JNI Glue
189// ----------------------------------------------------------------------------
190
Chris Craikc9070eb2015-03-09 18:50:14 -0700191const char* const kClassPathName = "android/view/DisplayListCanvas";
Romain Guye4d01122010-06-16 18:44:05 -0700192
193static JNINativeMethod gMethods[] = {
Chris Craikc9070eb2015-03-09 18:50:14 -0700194 { "nIsAvailable", "()Z", (void*) android_view_DisplayListCanvas_isAvailable },
Chris Craikc9070eb2015-03-09 18:50:14 -0700195 { "nInsertReorderBarrier","(JZ)V", (void*) android_view_DisplayListCanvas_insertReorderBarrier },
Romain Guy16393512010-08-08 00:14:31 -0700196
Chris Craikc9070eb2015-03-09 18:50:14 -0700197 { "nCallDrawGLFunction", "(JJ)V", (void*) android_view_DisplayListCanvas_callDrawGLFunction },
Romain Guy7d7b5492011-01-24 16:33:45 -0800198
John Reck773bbe02015-08-17 15:18:29 -0700199 { "nDrawPatch", "(JLandroid/graphics/Bitmap;JFFFFJ)V", (void*) android_view_DisplayListCanvas_drawPatch },
200
Chris Craikc9070eb2015-03-09 18:50:14 -0700201 { "nDrawRoundRect", "(JJJJJJJJ)V", (void*) android_view_DisplayListCanvas_drawRoundRectProps },
202 { "nDrawCircle", "(JJJJJ)V", (void*) android_view_DisplayListCanvas_drawCircleProps },
Romain Guyb051e892010-09-28 19:09:36 -0700203
Chris Craikc9070eb2015-03-09 18:50:14 -0700204 { "nFinishRecording", "(J)J", (void*) android_view_DisplayListCanvas_finishRecording },
Chris Craik956f3402015-04-27 16:41:00 -0700205 { "nDrawRenderNode", "(JJ)V", (void*) android_view_DisplayListCanvas_drawRenderNode },
Romain Guy13631f32012-01-30 17:41:55 -0800206
Derek Sollenbergercc882b62015-07-09 15:51:20 -0400207 { "nCreateDisplayListCanvas", "(II)J", (void*) android_view_DisplayListCanvas_createDisplayListCanvas },
208 { "nResetDisplayListCanvas", "(JII)V", (void*) android_view_DisplayListCanvas_resetDisplayListCanvas },
Romain Guy13631f32012-01-30 17:41:55 -0800209
Chris Craikc9070eb2015-03-09 18:50:14 -0700210 { "nDrawLayer", "(JJFF)V", (void*) android_view_DisplayListCanvas_drawLayer },
Romain Guyb051e892010-09-28 19:09:36 -0700211
Chris Craikc9070eb2015-03-09 18:50:14 -0700212 { "nGetMaximumTextureWidth", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureWidth },
213 { "nGetMaximumTextureHeight", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureHeight },
Romain Guye4d01122010-06-16 18:44:05 -0700214};
215
Chet Haase9c1e23b2011-03-24 10:51:31 -0700216static JNINativeMethod gActivityThreadMethods[] = {
217 { "dumpGraphicsInfo", "(Ljava/io/FileDescriptor;)V",
218 (void*) android_app_ActivityThread_dumpGraphics }
219};
220
Chris Craikc9070eb2015-03-09 18:50:14 -0700221int register_android_view_DisplayListCanvas(JNIEnv* env) {
John Recka2732a22014-12-18 13:52:33 -0800222 jclass clazz = FindClassOrDie(env, "android/graphics/Rect");
223 gRectClassInfo.set = GetMethodIDOrDie(env, clazz, "set", "(IIII)V");
Romain Guy9d5316e2010-06-24 19:30:36 -0700224
Andreas Gampe987f79f2014-11-18 17:29:46 -0800225 return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
Romain Guye4d01122010-06-16 18:44:05 -0700226}
227
Romain Guy6be3d552011-07-14 18:08:37 -0700228int register_android_app_ActivityThread(JNIEnv* env) {
Andreas Gampeed6b9df2014-11-20 22:02:20 -0800229 return RegisterMethodsOrDie(env, "android/app/ActivityThread",
Chet Haase9c1e23b2011-03-24 10:51:31 -0700230 gActivityThreadMethods, NELEM(gActivityThreadMethods));
231}
232
Romain Guye4d01122010-06-16 18:44:05 -0700233};