renderscript tests that touch graphics apis
Change-Id: Ic5093290fd1fa499dd7223f57a97064f01b54c08
diff --git a/tests/src/android/renderscript/cts/graphics_runner.rs b/tests/src/android/renderscript/cts/graphics_runner.rs
new file mode 100644
index 0000000..6119574a
--- /dev/null
+++ b/tests/src/android/renderscript/cts/graphics_runner.rs
@@ -0,0 +1,39 @@
+// Copyright (C) 2011 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "shared.rsh"
+#include "rs_graphics.rsh"
+
+#include "structs.rsh"
+
+static void drawQuad() {
+ float startX = 0, startY = 0;
+ float width = 4, height = 4;
+ rsgDrawQuadTexCoords(startX, startY, 0, 0, 0,
+ startX, startY + height, 0, 0, 1,
+ startX + width, startY + height, 0, 1, 1,
+ startX + width, startY, 0, 1, 0);
+}
+
+void testProgramVertex(rs_program_vertex pv) {
+ rsDebug("Set Program, drew quad", 0);
+ rsgBindProgramVertex(pv);
+ drawQuad();
+}
+
+// Just draw a quad with previously setup state
+int root(int launchID) {
+ rsDebug("Running script", 0);
+ return 0;
+}
diff --git a/tests/src/android/renderscript/cts/structs.rsh b/tests/src/android/renderscript/cts/structs.rsh
new file mode 100644
index 0000000..bfc57c6
--- /dev/null
+++ b/tests/src/android/renderscript/cts/structs.rsh
@@ -0,0 +1,38 @@
+// Copyright (C) 2011 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+typedef struct ConstMatrix {
+ rs_matrix4x4 MVP;
+} ConstMatrix_s;
+ConstMatrix_s *c1;
+
+typedef struct ConstComplex {
+ rs_matrix4x4 MVP;
+ rs_matrix4x4 EXTRA;
+ float extra1;
+ float2 extra2;
+ float3 extra3;
+ float4 extra4;
+} ConstComplex_s;
+ConstComplex_s *c2;
+
+typedef struct ConstExtra {
+ rs_matrix4x4 EXTRA;
+ float extra1;
+ float2 extra2;
+ float3 extra3;
+ float4 extra4;
+} ConstExtra_s;
+ConstExtra_s *c3;
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/FontTest.java b/tests/tests/renderscript/src/android/renderscript/cts/FontTest.java
new file mode 100644
index 0000000..1336ed9
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/FontTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import com.android.cts.stub.R;
+
+import android.renderscript.Font;
+
+public class FontTest extends RSBaseGraphics {
+
+ public void testCreateFont() {
+ for (int fontSize = 8; fontSize <= 12; fontSize += 2) {
+ Font.create(mRS, mRes, "sans-serif", Font.Style.NORMAL, fontSize);
+ Font.create(mRS, mRes, "serif", Font.Style.NORMAL, fontSize);
+ // Create fonts by family and style
+ Font.create(mRS, mRes, "serif", Font.Style.BOLD, fontSize);
+ Font.create(mRS, mRes, "serif", Font.Style.ITALIC, fontSize);
+ Font.create(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, fontSize);
+ Font.create(mRS, mRes, "mono", Font.Style.NORMAL, fontSize);
+ }
+ }
+}
+
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/MeshTest.java b/tests/tests/renderscript/src/android/renderscript/cts/MeshTest.java
new file mode 100644
index 0000000..970df90
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/MeshTest.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import com.android.cts.stub.R;
+
+import android.renderscript.Allocation;
+import android.renderscript.Allocation.MipmapControl;
+import android.renderscript.Element;
+import android.renderscript.Type;
+import android.renderscript.Mesh;
+import android.renderscript.Mesh.Primitive;
+import android.renderscript.Mesh.AllocationBuilder;
+import android.renderscript.Mesh.Builder;
+import android.renderscript.Mesh.TriangleMeshBuilder;
+
+public class MeshTest extends RSBaseGraphics {
+
+ Allocation mAttrAlloc;
+ Allocation mIndexAlloc;
+ Element mPosElem;
+ Type mPosType;
+ Type mIndexType;
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ Element.Builder eb = new Element.Builder(mRS);
+ eb.add(Element.F32_4(mRS), "position");
+ mPosElem = eb.create();
+ Type.Builder typeB = new Type.Builder(mRS, mPosElem);
+ mPosType = typeB.setX(3).create();
+ typeB = new Type.Builder(mRS, Element.U16(mRS));
+ mIndexType = typeB.setX(3).create();
+
+ mAttrAlloc = Allocation.createSized(mRS, mPosElem, 3);
+ mIndexAlloc = Allocation.createSized(mRS, Element.U16(mRS), 3);
+ }
+
+ public void testMeshAllocationBuilder() {
+ Mesh.AllocationBuilder mab;
+ for(Primitive prim : Primitive.values()) {
+ mab = new Mesh.AllocationBuilder(mRS);
+ mab.addVertexAllocation(mAttrAlloc);
+ mab.getCurrentVertexTypeIndex();
+ mab.addIndexSetType(prim);
+ assertTrue(mab.create() != null);
+
+ mab = new Mesh.AllocationBuilder(mRS);
+ mab.addVertexAllocation(mAttrAlloc);
+ mab.getCurrentVertexTypeIndex();
+ mab.addIndexSetAllocation(mIndexAlloc, prim);
+ mab.getCurrentIndexSetIndex();
+ mab.addIndexSetType(prim);
+ assertTrue(mab.create() != null);
+ }
+ }
+
+ public void testMeshBuilder() {
+ Mesh.Builder mb;
+ for(Primitive prim : Primitive.values()) {
+ mb = new Mesh.Builder(mRS,
+ Allocation.USAGE_SCRIPT |
+ Allocation.USAGE_GRAPHICS_VERTEX);
+ mb.addVertexType(mPosElem, 3);
+ mb.getCurrentVertexTypeIndex();
+ mb.addIndexSetType(prim);
+ assertTrue(mb.create() != null);
+
+ mb = new Mesh.Builder(mRS,
+ Allocation.USAGE_SCRIPT |
+ Allocation.USAGE_GRAPHICS_VERTEX);
+ mb.addVertexType(mPosElem, 3);
+ mb.getCurrentVertexTypeIndex();
+ mb.addIndexSetType(Element.U16(mRS), 3, prim);
+ mb.getCurrentIndexSetIndex();
+ assertTrue(mb.create() != null);
+
+ mb = new Mesh.Builder(mRS,
+ Allocation.USAGE_SCRIPT |
+ Allocation.USAGE_GRAPHICS_VERTEX);
+ mb.addVertexType(mPosElem, 3);
+ mb.getCurrentVertexTypeIndex();
+ mb.addIndexSetType(mIndexType, prim);
+ mb.getCurrentIndexSetIndex();
+ assertTrue(mb.create() != null);
+
+ mb = new Mesh.Builder(mRS,
+ Allocation.USAGE_SCRIPT |
+ Allocation.USAGE_GRAPHICS_VERTEX);
+ mb.addVertexType(mPosType);
+ mb.getCurrentVertexTypeIndex();
+ mb.addIndexSetType(prim);
+ assertTrue(mb.create() != null);
+
+ mb = new Mesh.Builder(mRS,
+ Allocation.USAGE_SCRIPT |
+ Allocation.USAGE_GRAPHICS_VERTEX);
+ mb.addVertexType(mPosType);
+ mb.getCurrentVertexTypeIndex();
+ mb.addIndexSetType(Element.U16(mRS), 3, prim);
+ mb.getCurrentIndexSetIndex();
+ assertTrue(mb.create() != null);
+
+ mb = new Mesh.Builder(mRS,
+ Allocation.USAGE_SCRIPT |
+ Allocation.USAGE_GRAPHICS_VERTEX);
+ mb.addVertexType(mPosType);
+ mb.getCurrentVertexTypeIndex();
+ mb.addIndexSetType(mIndexType, prim);
+ mb.getCurrentIndexSetIndex();
+ assertTrue(mb.create() != null);
+ }
+ }
+
+ void triangleMeshBuilderHelper(int size, int flags) {
+ // Test various num vertices and triangles
+ for (int numVerts = 3; numVerts < 100; numVerts += 15) {
+ for (int numTries = 1; numTries < 100; numTries += 15) {
+ Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS, size, flags);
+ // Append all the vertices
+ for (int numVertsI = 0; numVertsI < numVerts; numVertsI++) {
+ if (size == 2) {
+ tmb.addVertex(1.0f, 1.0f);
+ } else {
+ tmb.addVertex(1.0f, 1.0f, 1.0f);
+ }
+ if ((flags & TriangleMeshBuilder.COLOR) != 0) {
+ tmb.setColor(1.0f, 1.0f, 1.0f, 1.0f);
+ }
+ if ((flags & TriangleMeshBuilder.NORMAL) != 0) {
+ tmb.setNormal(1.0f, 1.0f, 1.0f);
+ }
+ if ((flags & TriangleMeshBuilder.TEXTURE_0) != 0) {
+ tmb.setTexture(1.0f, 1.0f);
+ }
+ }
+ // Add triangles to index them
+ for (int numTriesI = 0; numTriesI < numTries; numTriesI ++) {
+ tmb.addTriangle(0, 1, 2);
+ }
+ assertTrue(tmb.create(false) != null);
+ assertTrue(tmb.create(true) != null);
+ }
+ }
+ }
+
+ public void testMeshTriangleMeshBuilder() {
+ for (int size = 2; size <= 3; size ++) {
+ triangleMeshBuilderHelper(size, 0);
+ triangleMeshBuilderHelper(size, TriangleMeshBuilder.COLOR);
+ triangleMeshBuilderHelper(size, TriangleMeshBuilder.COLOR |
+ TriangleMeshBuilder.NORMAL);
+ triangleMeshBuilderHelper(size, TriangleMeshBuilder.COLOR |
+ TriangleMeshBuilder.TEXTURE_0);
+ triangleMeshBuilderHelper(size, TriangleMeshBuilder.COLOR |
+ TriangleMeshBuilder.NORMAL |
+ TriangleMeshBuilder.TEXTURE_0);
+ triangleMeshBuilderHelper(size, TriangleMeshBuilder.NORMAL);
+ triangleMeshBuilderHelper(size, TriangleMeshBuilder.NORMAL|
+ TriangleMeshBuilder.TEXTURE_0);
+ triangleMeshBuilderHelper(size, TriangleMeshBuilder.TEXTURE_0);
+ }
+ }
+}
+
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ProgramVertexTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ProgramVertexTest.java
new file mode 100644
index 0000000..7655bf4
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ProgramVertexTest.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import com.android.cts.stub.R;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.FieldPacker;
+import android.renderscript.Float3;
+import android.renderscript.Float4;
+import android.renderscript.Matrix4f;
+import android.renderscript.ProgramVertex;
+import android.renderscript.ProgramVertex.Builder;
+import android.renderscript.ScriptC;
+
+public class ProgramVertexTest extends RSBaseGraphics {
+
+ ScriptC_graphics_runner mScript;
+ Element mAttrPosElem;
+ Element mAttrNormTexElem;
+ Element mAttrPosNormTexElem;
+ Element mAttrExtra;
+
+ Allocation mConstMatrix;
+ Allocation mConstComplex;
+ Allocation mConstExtra;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ // Build elements for shader inputs
+ Element.Builder eb = new Element.Builder(mRS);
+ eb.add(Element.F32_4(mRS), "position");
+ mAttrPosElem = eb.create();
+
+ eb = new Element.Builder(mRS);
+ eb.add(Element.F32_3(mRS), "normal");
+ eb.add(Element.F32_2(mRS), "texture0");
+ mAttrNormTexElem = eb.create();
+
+ eb = new Element.Builder(mRS);
+ eb.add(Element.F32_4(mRS), "position");
+ eb.add(Element.F32_3(mRS), "normal");
+ eb.add(Element.F32_2(mRS), "texture0");
+ mAttrPosNormTexElem = eb.create();
+
+ eb.add(Element.F32(mRS), "extra1");
+ eb.add(Element.F32_2(mRS), "extra2");
+ eb.add(Element.F32_3(mRS), "extra3");
+ eb.add(Element.F32_4(mRS), "extra4");
+ mAttrExtra = eb.create();
+
+ ScriptField_ConstMatrix c1 = new ScriptField_ConstMatrix(mRS, 1,
+ Allocation.USAGE_SCRIPT |
+ Allocation.USAGE_GRAPHICS_CONSTANTS);
+ c1.set(new ScriptField_ConstMatrix.Item(), 0, true);
+ mConstMatrix = c1.getAllocation();
+
+ ScriptField_ConstComplex c2 = new ScriptField_ConstComplex(mRS, 1,
+ Allocation.USAGE_SCRIPT |
+ Allocation.USAGE_GRAPHICS_CONSTANTS);
+ c2.set(new ScriptField_ConstComplex.Item(), 0, true);
+ mConstComplex = c2.getAllocation();
+
+ ScriptField_ConstExtra c3 = new ScriptField_ConstExtra(mRS, 1,
+ Allocation.USAGE_SCRIPT |
+ Allocation.USAGE_GRAPHICS_CONSTANTS);
+ c3.set(new ScriptField_ConstExtra.Item(), 0, true);
+ mConstExtra = c3.getAllocation();
+
+ mScript = new ScriptC_graphics_runner(mRS, mRes, R.raw.graphics_runner);
+ mRS.bindRootScript(mScript);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ mRS.bindRootScript(null);
+ super.tearDown();
+ }
+
+ ProgramVertex buildShader(Element[] input, Allocation[] constInput, String shader) {
+ ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS);
+ if (input != null) {
+ for (int i = 0; i < input.length; i++) {
+ pvb.addInput(input[i]);
+ }
+ }
+ if (constInput != null) {
+ for (int i = 0; i < constInput.length; i++) {
+ pvb.addConstant(constInput[i].getType());
+ }
+ }
+
+ pvb.setShader(shader);
+ ProgramVertex pv = pvb.create();
+ if (constInput != null) {
+ for (int i = 0; i < constInput.length; i++) {
+ pv.bindConstants(constInput[i], i);
+ }
+ }
+ return pv;
+ }
+
+ void testProgramVertexBuilderHelper(boolean testBind) {
+ String simpleAttr = "void main() {\n"+
+ " gl_Position = ATTRIB_position;\n"+
+ "}";
+
+ String multiAttr = "void main() {\n"+
+ " vec4 temp = ATTRIB_position;\n"+
+ " temp.xyz += ATTRIB_normal;\n"+
+ " temp.xy += ATTRIB_texture0;\n"+
+ " gl_Position = temp;\n"+
+ "}";
+
+ String multiAttr2 = "void main() {\n"+
+ " vec4 temp = ATTRIB_position;\n"+
+ " temp.xyz += ATTRIB_normal;\n"+
+ " temp.xy += ATTRIB_texture0;\n"+
+ " temp += ATTRIB_extra4;\n"+
+ " temp.xyz += ATTRIB_extra3;\n "+
+ " temp.xy += ATTRIB_extra2;\n"+
+ " temp.x += ATTRIB_extra1;\n"+
+ " gl_Position = temp;\n"+
+ "}";
+
+ String simpleAttrSimpleUni = "void main() {\n"+
+ " gl_Position = UNI_MVP * ATTRIB_position;\n"+
+ "}";
+
+ String multiAttrMultiUni = "void main() {\n"+
+ " vec4 temp = UNI_MVP * ATTRIB_position;\n"+
+ " temp = UNI_EXTRA * temp;\n"+
+ " temp.xyz += ATTRIB_normal;\n"+
+ " temp.xy += ATTRIB_texture0;\n"+
+ " temp += UNI_extra4;\n"+
+ " temp.xyz += UNI_extra3;\n "+
+ " temp.xy += UNI_extra2;\n"+
+ " temp.x += UNI_extra1;\n"+
+ " gl_Position = temp;\n"+
+ "}";
+
+ // Create a series of shaders that do nothing useful
+ // but exercise creation pipeline
+ Element[] inputs = new Element[1];
+ inputs[0] = mAttrPosElem;
+ ProgramVertex pv = buildShader(inputs, null, simpleAttr);
+ if (testBind) {
+ mScript.invoke_testProgramVertex(pv);
+ }
+
+ inputs[0] = mAttrPosNormTexElem;
+ pv = buildShader(inputs, null, multiAttr);
+ if (testBind) {
+ mScript.invoke_testProgramVertex(pv);
+ }
+
+ inputs[0] = mAttrExtra;
+ pv = buildShader(inputs, null, multiAttr2);
+ if (testBind) {
+ mScript.invoke_testProgramVertex(pv);
+ }
+
+ // Now with constant inputs
+ Allocation[] constInput = new Allocation[1];
+ inputs[0] = mAttrPosElem;
+ constInput[0] = mConstMatrix;
+ pv = buildShader(inputs, constInput, simpleAttrSimpleUni);
+ if (testBind) {
+ mScript.invoke_testProgramVertex(pv);
+ }
+
+ inputs[0] = mAttrPosNormTexElem;
+ constInput[0] = mConstComplex;
+ pv = buildShader(inputs, constInput, multiAttrMultiUni);
+ if (testBind) {
+ mScript.invoke_testProgramVertex(pv);
+ }
+
+ // Now with multiple input and const structs
+ constInput = new Allocation[2];
+ constInput[0] = mConstMatrix;
+ constInput[1] = mConstExtra;
+ inputs[0] = mAttrPosNormTexElem;
+ pv = buildShader(inputs, constInput, multiAttrMultiUni);
+ if (testBind) {
+ mScript.invoke_testProgramVertex(pv);
+ }
+
+ inputs = new Element[2];
+ inputs[0] = mAttrPosElem;
+ inputs[1] = mAttrNormTexElem;
+ pv = buildShader(inputs, null, multiAttr);
+ if (testBind) {
+ mScript.invoke_testProgramVertex(pv);
+ }
+
+ constInput[0] = mConstMatrix;
+ constInput[1] = mConstExtra;
+ inputs[0] = mAttrPosElem;
+ inputs[1] = mAttrNormTexElem;
+ pv = buildShader(inputs, constInput, multiAttrMultiUni);
+ if (testBind) {
+ mScript.invoke_testProgramVertex(pv);
+ }
+ }
+
+ public void testProgramVertexBuilder() {
+ testProgramVertexBuilderHelper(false);
+ }
+
+ public void testProgramVertexCreation() {
+ testProgramVertexBuilderHelper(true);
+ }
+}
+
+