blob: 9a71386a306fc59f6d2407f73ca707b82286f613 [file] [log] [blame]
/*
* 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.Program;
import android.renderscript.ProgramFragment;
import android.renderscript.Sampler;
import android.renderscript.Type;
public class ProgramFragmentTest extends RSBaseGraphics {
ScriptC_graphics_runner mScript;
Allocation mConstMatrix;
Allocation mConstComplex;
Allocation mConstExtra;
Allocation mTex2D;
Allocation mTexCube;
@Override
protected void setUp() throws Exception {
super.setUp();
Type.Builder typeB = new Type.Builder(mRS, Element.RGB_888(mRS));
typeB.setX(8).setY(8);
mTex2D = Allocation.createTyped(mRS, typeB.create(),
Allocation.USAGE_SCRIPT |
Allocation.USAGE_GRAPHICS_TEXTURE);
typeB.setFaces(true);
mTexCube = Allocation.createTyped(mRS, typeB.create(),
Allocation.USAGE_SCRIPT |
Allocation.USAGE_GRAPHICS_TEXTURE);
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();
}
ProgramFragment buildShader(Allocation[] textures, Allocation[] constInput, String shader) {
ProgramFragment.Builder pfb = new ProgramFragment.Builder(mRS);
Program.BaseProgramBuilder bpb = pfb;
if (textures != null) {
for (int i = 0; i < textures.length; i++) {
Program.TextureType tType = Program.TextureType.TEXTURE_2D;
if (textures[i].getType().hasFaces()) {
tType = Program.TextureType.TEXTURE_CUBE;
}
// Add textures through the base program builder
bpb.addTexture(tType);
bpb.getCurrentTextureIndex();
}
}
if (constInput != null) {
for (int i = 0; i < constInput.length; i++) {
bpb.addConstant(constInput[i].getType());
bpb.getCurrentConstantIndex();
}
}
bpb.setShader(shader);
ProgramFragment pf = pfb.create();
if (constInput != null) {
for (int i = 0; i < constInput.length; i++) {
pf.bindConstants(constInput[i], i);
// Test the base class path too
Program p = pf;
p.bindConstants(constInput[i], i);
}
}
if (textures != null) {
for (int i = 0; i < textures.length; i++) {
pf.bindTexture(textures[i], i);
pf.bindSampler(Sampler.CLAMP_NEAREST(mRS), i);
// Test the base class path too
Program p = pf;
p.bindTexture(textures[i], i);
p.bindSampler(Sampler.CLAMP_NEAREST(mRS), i);
}
}
return pf;
}
void testProgramFragmentBuilderHelper(boolean testBind) {
String simpleFrag = "void main() {\n"+
" vec4 col = vec4(0.1, 0.2, 0.3, 0.4);"+
" gl_FragColor = col;\n"+
"}";
String simpleUni = "void main() {\n"+
" vec4 col = vec4(0.1, 0.2, 0.3, 0.4);\n"+
" col = UNI_MATRIX * col;\n"+
" gl_FragColor = col;\n"+
"}";
String simpleUniTex = "void main() {\n"+
" vec4 col = vec4(0.1, 0.2, 0.3, 0.4);"+
" col += texture2D(UNI_Tex0, vec2(0.1, 0.1));\n"+
" col += textureCube(UNI_Tex1, vec3(0.1, 0.2, 0.3));\n"+
" col = UNI_MATRIX * col;\n"+
" gl_FragColor = col;\n"+
"}";
String multiUni = "void main() {\n"+
" vec4 col = vec4(0.1, 0.2, 0.3, 0.4);"+
" col = UNI_MATRIX * col;\n"+
" col = UNI_EXTRA * col;\n"+
" col += UNI_extra4;\n"+
" col.xyz += UNI_extra3;\n "+
" col.xy += UNI_extra2;\n"+
" col.x += UNI_extra1;\n"+
" gl_FragColor = col;\n"+
"}";
// Create a series of shaders that do nothing useful
// but exercise creation pipeline
ProgramFragment pf = buildShader(null, null, simpleFrag);
if (testBind) {
mScript.invoke_testProgramFragment(pf);
}
Allocation[] constInput = new Allocation[1];
constInput[0] = mConstMatrix;
pf = buildShader(null, constInput, simpleUni);
if (testBind) {
mScript.invoke_testProgramFragment(pf);
mRS.bindProgramFragment(pf);
}
constInput[0] = mConstComplex;
pf = buildShader(null, constInput, multiUni);
if (testBind) {
mScript.invoke_testProgramFragment(pf);
mRS.bindProgramFragment(pf);
}
Allocation[] textures = new Allocation[2];
textures[0] = mTex2D;
textures[1] = mTexCube;
pf = buildShader(textures, constInput, simpleUniTex);
if (testBind) {
mScript.invoke_testProgramFragment(pf);
mRS.bindProgramFragment(pf);
}
constInput = new Allocation[2];
constInput[0] = mConstMatrix;
constInput[1] = mConstExtra;
pf = buildShader(null, constInput, multiUni);
if (testBind) {
mScript.invoke_testProgramFragment(pf);
mRS.bindProgramFragment(pf);
}
}
public void testProgramFragmentBuilder() {
testProgramFragmentBuilderHelper(false);
}
public void testProgramFragmentCreation() {
testProgramFragmentBuilderHelper(true);
}
public void testProgramTextureType() {
assertEquals(Program.TextureType.TEXTURE_2D,
Program.TextureType.valueOf("TEXTURE_2D"));
assertEquals(Program.TextureType.TEXTURE_CUBE,
Program.TextureType.valueOf("TEXTURE_CUBE"));
// Make sure no new enums are added
assertEquals(2, Program.TextureType.values().length);
ProgramFragment.Builder pfb = new ProgramFragment.Builder(mRS);
for (Program.TextureType tt : Program.TextureType.values()) {
pfb.addTexture(tt);
}
}
}