| // 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; |
| } |
| } |