blob: 281f830d328a4d35b67dfd5430fd1ab6087105fc [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.
#pragma version(1)
#pragma rs java_package_name(com.android.perftest)
#include "rs_graphics.rsh"
#include "subtest_def.rsh"
rs_program_vertex gProgVertex;
rs_program_fragment gProgFragmentTexture;
rs_program_fragment gProgFragmentTextureModulate;
rs_program_fragment gProgFragmentMultitex;
rs_program_store gProgStoreBlendNone;
rs_program_store gProgStoreBlendAlpha;
rs_allocation gTexOpaque;
rs_allocation gTexTorus;
rs_allocation gTexTransparent;
rs_allocation gTexChecker;
rs_sampler gLinearClamp;
rs_sampler gLinearWrap;
typedef struct FillTestData_s {
int testId;
int blend;
int quadCount;
} FillTestData;
FillTestData *gData;
typedef struct FillTestFragData_s {
float4 modulate;
} FillTestFragData;
FillTestFragData *gFragData;
static float gDt = 0.0f;
void init() {
}
static int gRenderSurfaceW = 1280;
static int gRenderSurfaceH = 720;
static void bindProgramVertexOrtho() {
// Default vertex shader
rsgBindProgramVertex(gProgVertex);
// Setup the projection matrix
rs_matrix4x4 proj;
rsMatrixLoadOrtho(&proj, 0, gRenderSurfaceW, gRenderSurfaceH, 0, -500, 500);
rsgProgramVertexLoadProjectionMatrix(&proj);
}
static void displaySingletexFill(bool blend, int quadCount, bool modulate) {
bindProgramVertexOrtho();
rs_matrix4x4 matrix;
rsMatrixLoadIdentity(&matrix);
rsgProgramVertexLoadModelMatrix(&matrix);
// Fragment shader with texture
if (!blend) {
rsgBindProgramStore(gProgStoreBlendNone);
} else {
rsgBindProgramStore(gProgStoreBlendAlpha);
}
if (modulate) {
rsgBindProgramFragment(gProgFragmentTextureModulate);
rsgBindSampler(gProgFragmentTextureModulate, 0, gLinearClamp);
rsgBindTexture(gProgFragmentTextureModulate, 0, gTexOpaque);
gFragData->modulate.r = 0.8f;
gFragData->modulate.g = 0.7f;
gFragData->modulate.b = 0.8f;
gFragData->modulate.a = 0.5f;
rsgAllocationSyncAll(rsGetAllocation(gFragData));
} else {
rsgBindProgramFragment(gProgFragmentTexture);
rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp);
rsgBindTexture(gProgFragmentTexture, 0, gTexOpaque);
}
for (int i = 0; i < quadCount; i ++) {
float startX = 5 * i, startY = 5 * i;
float width = gRenderSurfaceW - startX, height = gRenderSurfaceH - startY;
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);
}
}
static void displayMultitextureSample(bool blend, int quadCount) {
bindProgramVertexOrtho();
rs_matrix4x4 matrix;
rsMatrixLoadIdentity(&matrix);
rsgProgramVertexLoadModelMatrix(&matrix);
// Fragment shader with texture
if (!blend) {
rsgBindProgramStore(gProgStoreBlendNone);
} else {
rsgBindProgramStore(gProgStoreBlendAlpha);
}
rsgBindProgramFragment(gProgFragmentMultitex);
rsgBindSampler(gProgFragmentMultitex, 0, gLinearClamp);
rsgBindSampler(gProgFragmentMultitex, 1, gLinearWrap);
rsgBindSampler(gProgFragmentMultitex, 2, gLinearClamp);
rsgBindTexture(gProgFragmentMultitex, 0, gTexChecker);
rsgBindTexture(gProgFragmentMultitex, 1, gTexTorus);
rsgBindTexture(gProgFragmentMultitex, 2, gTexTransparent);
for (int i = 0; i < quadCount; i ++) {
float startX = 10 * i, startY = 10 * i;
float width = gRenderSurfaceW - startX, height = gRenderSurfaceH - startY;
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 root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
TestData *testData = (TestData*)usrData;
gRenderSurfaceW = testData->renderSurfaceW;
gRenderSurfaceH = testData->renderSurfaceH;
gDt = testData->dt;
gData = (FillTestData*)v_in;
switch(gData->testId) {
case 0:
displayMultitextureSample(gData->blend == 1 ? true : false, gData->quadCount);
break;
case 1:
displaySingletexFill(gData->blend == 1 ? true : false, gData->quadCount, false);
break;
case 2:
displaySingletexFill(gData->blend == 1 ? true : false, gData->quadCount, true);
break;
default:
rsDebug("Wrong test number", 0);
break;
}
}