Create private properties on GLCanvas for experimentation with 3d

Change-Id: I17772f61efce727cb4c1111f4d97f58c741786b8
This commit is contained in:
Chris Craik
2013-12-15 17:10:19 -08:00
parent d83adf00ae
commit ba9b613437
7 changed files with 90 additions and 22 deletions

View File

@@ -153,6 +153,12 @@ class GLES20Canvas extends HardwareCanvas {
private static native void nSetName(int renderer, String name);
public static void setProperty(String name, String value) {
nSetProperty(name, value);
}
private static native void nSetProperty(String name, String value);
///////////////////////////////////////////////////////////////////////////
// Hardware layers
///////////////////////////////////////////////////////////////////////////

View File

@@ -185,6 +185,24 @@ static void android_view_GLES20Canvas_setName(JNIEnv* env,
}
}
static void android_view_GLES20Canvas_setProperty(JNIEnv* env,
jobject clazz, jstring name, jstring value) {
if (!Caches::hasInstance()) {
ALOGW("can't set property, no Caches instance");
return;
}
if (name == NULL || value == NULL) {
ALOGW("can't set prop, null passed");
}
const char* nameCharArray = env->GetStringUTFChars(name, NULL);
const char* valueCharArray = env->GetStringUTFChars(value, NULL);
Caches::getInstance().setTempProperty(nameCharArray, valueCharArray);
env->ReleaseStringUTFChars(name, nameCharArray);
env->ReleaseStringUTFChars(name, valueCharArray);
}
static void android_view_GLES20Canvas_setCountOverdrawEnabled(JNIEnv* env, jobject clazz,
OpenGLRenderer* renderer, jboolean enabled) {
renderer->setCountOverdrawEnabled(enabled);
@@ -1011,6 +1029,8 @@ static JNINativeMethod gMethods[] = {
{ "nFinish", "(I)V", (void*) android_view_GLES20Canvas_finish },
{ "nSetName", "(ILjava/lang/String;)V",
(void*) android_view_GLES20Canvas_setName },
{ "nSetProperty", "(Ljava/lang/String;Ljava/lang/String;)V",
(void*) android_view_GLES20Canvas_setProperty },
{ "nSetCountOverdrawEnabled", "(IZ)V", (void*) android_view_GLES20Canvas_setCountOverdrawEnabled },
{ "nGetOverdraw", "(I)F", (void*) android_view_GLES20Canvas_getOverdraw },

View File

@@ -55,6 +55,7 @@ Caches::Caches(): Singleton<Caches>(),
initProperties();
initStaticProperties();
initExtensions();
initTempProperties();
mDebugLevel = readDebugLevel();
ALOGD("Enabling debug mode %d", mDebugLevel);
@@ -676,5 +677,36 @@ TextureVertex* Caches::getRegionMesh() {
return mRegionMesh;
}
///////////////////////////////////////////////////////////////////////////////
// Temporary Properties
///////////////////////////////////////////////////////////////////////////////
void Caches::initTempProperties() {
propertyDirtyViewport = false;
propertyEnable3d = false;
propertyCameraDistance = 1.0f;
propertyShadowStrength = 0x3f;
}
void Caches::setTempProperty(const char* name, const char* value) {
ALOGD("setting property %s to %s", name, value);
if (!strcmp(name, "enable3d")) {
propertyEnable3d = !strcmp(value, "true");
propertyDirtyViewport = true;
ALOGD("enable3d = %d", propertyEnable3d);
return;
} else if (!strcmp(name, "cameraDistance")) {
propertyCameraDistance = fmin(fmax(atof(value), 0.001), 10);
propertyDirtyViewport = true;
ALOGD("camera dist multiplier = %.2f", propertyCameraDistance);
return;
} else if (!strcmp(name, "shadowStrength")) {
propertyShadowStrength = atoi(value);
ALOGD("shadow strength = 0x%x out of 0xff", propertyShadowStrength);
return;
}
ALOGD(" failed");
}
}; // namespace uirenderer
}; // namespace android

View File

@@ -353,6 +353,14 @@ public:
PFNGLLABELOBJECTEXTPROC setLabel;
PFNGLGETOBJECTLABELEXTPROC getLabel;
// TEMPORARY properties
void initTempProperties();
void setTempProperty(const char* name, const char* value);
bool propertyEnable3d;
bool propertyDirtyViewport; // flag set when dirtying the viewport
float propertyCameraDistance;
int propertyShadowStrength;
private:
enum OverdrawColorSet {
kColorSet_Default = 0,

View File

@@ -85,9 +85,6 @@
// Turn on to highlight drawing batches and merged batches with different colors
#define DEBUG_MERGE_BEHAVIOR 0
// Turn on to enable 3D support in the renderer (off by default until API for control exists)
#define DEBUG_ENABLE_3D 0
// Turn on to enable debugging shadow
#define DEBUG_SHADOW 0

View File

@@ -310,12 +310,12 @@ void DisplayList::updateMatrix() {
mPivotY = mPrevHeight / 2.0f;
}
}
if (!DEBUG_ENABLE_3D && (mMatrixFlags & ROTATION_3D) == 0) {
if (!Caches::getInstance().propertyEnable3d && (mMatrixFlags & ROTATION_3D) == 0) {
mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
} else {
if (DEBUG_ENABLE_3D) {
if (Caches::getInstance().propertyEnable3d) {
mTransform.loadTranslate(mPivotX + mTranslationX, mPivotY + mTranslationY,
mTranslationZ);
mTransform.rotate(mRotationX, 1, 0, 0);
@@ -420,11 +420,11 @@ void DisplayList::setViewProperties(OpenGLRenderer& renderer, T& handler,
renderer.translate(mTranslationX, mTranslationY);
renderer.translateZ(mTranslationZ);
} else {
#if DEBUG_ENABLE_3D
renderer.concatMatrix(mTransform);
#else
renderer.concatMatrix(mTransformMatrix);
#endif
if (Caches::getInstance().propertyEnable3d) {
renderer.concatMatrix(mTransform);
} else {
renderer.concatMatrix(mTransformMatrix);
}
}
}
bool clipToBoundsNeeded = mCaching ? false : mClipToBounds;
@@ -474,12 +474,12 @@ void DisplayList::applyViewPropertyTransforms(mat4& matrix) {
if (mMatrixFlags == TRANSLATION) {
matrix.translate(mTranslationX, mTranslationY, mTranslationZ);
} else {
#if DEBUG_ENABLE_3D
matrix.multiply(mTransform);
#else
mat4 temp(*mTransformMatrix);
matrix.multiply(temp);
#endif
if (Caches::getInstance().propertyEnable3d) {
matrix.multiply(mTransform);
} else {
mat4 temp(*mTransformMatrix);
matrix.multiply(temp);
}
}
}
}

View File

@@ -182,10 +182,10 @@ void OpenGLRenderer::setViewport(int width, int height) {
}
void OpenGLRenderer::initViewport(int width, int height) {
float dist = std::max(width, height) * 1.5;
if (DEBUG_ENABLE_3D) {
if (mCaches.propertyEnable3d) {
// TODO: make view proj app configurable
float dist = std::max(width, height) * 1.5;
dist *= mCaches.propertyCameraDistance;
Matrix4 projection;
projection.loadFrustum(-width / 2, -height / 2, width / 2, height / 2, dist, 0);
Matrix4 view;
@@ -2081,6 +2081,12 @@ status_t OpenGLRenderer::drawDisplayList(DisplayList* displayList, Rect& dirty,
int32_t replayFlags) {
status_t status;
if (mCaches.propertyDirtyViewport) {
// force recalc of view/proj matrices
setViewport(mWidth, mHeight);
mCaches.propertyDirtyViewport = false;
}
// All the usual checks and setup operations (quickReject, setupDraw, etc.)
// will be performed by the display list itself
if (displayList && displayList->isRenderable()) {
@@ -3394,9 +3400,8 @@ status_t OpenGLRenderer::drawShadow(const mat4& casterTransform, float casterAlp
mCaches.enableScissor();
SkPaint paint;
paint.setColor(0x3f000000);
// Force the draw to use alpha values.
paint.setAntiAlias(true);
paint.setColor(mCaches.propertyShadowStrength << 24);
paint.setAntiAlias(true); // want to use AlphaVertex
VertexBuffer shadowVertexBuffer;
ShadowTessellator::tessellateAmbientShadow(width, height, casterTransform,