18650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// Copyright (C) 2011 The Android Open Source Project
28650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk//
38650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// Licensed under the Apache License, Version 2.0 (the "License");
48650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// you may not use this file except in compliance with the License.
58650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// You may obtain a copy of the License at
68650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk//
78650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk//      http://www.apache.org/licenses/LICENSE-2.0
88650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk//
98650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// Unless required by applicable law or agreed to in writing, software
108650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// distributed under the License is distributed on an "AS IS" BASIS,
118650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// See the License for the specific language governing permissions and
138650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// limitations under the License.
148650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
158650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk#pragma version(1)
168650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
178650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk#pragma rs java_package_name(com.android.fbotest)
188650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
198650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk#include "rs_graphics.rsh"
208650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
218650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_program_vertex gPVBackground;
228650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_program_fragment gPFBackground;
238650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
248650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_allocation gTGrid;
258650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
268650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_program_store gPFSBackground;
278650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
288650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_font gItalic;
298650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_allocation gTextAlloc;
308650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
318650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_allocation gOffscreen;
328650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_allocation gOffscreenDepth;
338650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_allocation gReadBackTest;
348650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
358650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouktypedef struct MeshInfo {
368650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rs_mesh mMesh;
378650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    int mNumIndexSets;
388650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    float3 bBoxMin;
398650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    float3 bBoxMax;
408650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} MeshInfo_t;
418650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
428650c32907b74b945dd6cc9a5bf41c12fde005dfAlex SakhartchoukMeshInfo_t *gMeshes;
438650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
448650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float3 gLookAt;
458650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
468650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float gRotateX;
478650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float gRotateY;
488650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float gZoom;
498650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
508650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float gLastX;
518650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float gLastY;
528650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
538650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukvoid onActionDown(float x, float y) {
548650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gLastX = x;
558650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gLastY = y;
568650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
578650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
588650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukvoid onActionScale(float scale) {
598650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
608650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gZoom *= 1.0f / scale;
618650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gZoom = max(0.1f, min(gZoom, 500.0f));
628650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
638650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
648650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukvoid onActionMove(float x, float y) {
658650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    float dx = gLastX - x;
668650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    float dy = gLastY - y;
678650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
688650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    if (fabs(dy) <= 2.0f) {
698650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        dy = 0.0f;
708650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
718650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    if (fabs(dx) <= 2.0f) {
728650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        dx = 0.0f;
738650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
748650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
758650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gRotateY -= dx;
768650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    if (gRotateY > 360) {
778650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        gRotateY -= 360;
788650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
798650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    if (gRotateY < 0) {
808650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        gRotateY += 360;
818650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
828650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
838650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gRotateX -= dy;
848650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gRotateX = min(gRotateX, 80.0f);
858650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gRotateX = max(gRotateX, -80.0f);
868650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
878650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gLastX = x;
888650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gLastY = y;
898650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
908650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
918650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukvoid init() {
928650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gRotateX = 0.0f;
938650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gRotateY = 0.0f;
948650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gZoom = 50.0f;
958650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gLookAt = 0.0f;
968650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
978650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
988650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukvoid updateMeshInfo() {
998650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rs_allocation allMeshes = rsGetAllocation(gMeshes);
1008650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    int size = rsAllocationGetDimX(allMeshes);
1018650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gLookAt = 0.0f;
1028650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    float minX, minY, minZ, maxX, maxY, maxZ;
1038650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    for (int i = 0; i < size; i++) {
1048650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        MeshInfo_t *info = (MeshInfo_t*)rsGetElementAt(allMeshes, i);
1058650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        rsgMeshComputeBoundingBox(info->mMesh,
1068650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                                  &minX, &minY, &minZ,
1078650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                                  &maxX, &maxY, &maxZ);
10838b78b1bf5dd564bf8e6c022eaba3ef6a21a3d03Jason Sams        info->bBoxMin = (float3){minX, minY, minZ};
10938b78b1bf5dd564bf8e6c022eaba3ef6a21a3d03Jason Sams        info->bBoxMax = (float3){maxX, maxY, maxZ};
1108650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        gLookAt += (info->bBoxMin + info->bBoxMax)*0.5f;
1118650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
1128650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gLookAt = gLookAt / (float)size;
1138650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
1148650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1158650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic void renderAllMeshes() {
1168650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rs_allocation allMeshes = rsGetAllocation(gMeshes);
1178650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    int size = rsAllocationGetDimX(allMeshes);
1188650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    gLookAt = 0.0f;
1198650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    float minX, minY, minZ, maxX, maxY, maxZ;
1208650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    for (int i = 0; i < size; i++) {
1218650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        MeshInfo_t *info = (MeshInfo_t*)rsGetElementAt(allMeshes, i);
1228650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        rsgDrawMesh(info->mMesh);
1238650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
1248650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
1258650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1268650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic void drawDescription() {
1278650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    uint width = rsgGetWidth();
1288650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    uint height = rsgGetHeight();
1298650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    int left = 0, right = 0, top = 0, bottom = 0;
1308650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1318650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindFont(gItalic);
1328650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1338650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgMeasureText(gTextAlloc, &left, &right, &top, &bottom);
1348650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgDrawText(gTextAlloc, 2 -left, height - 2 + bottom);
1358650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
1368650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1378650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic void renderOffscreen(bool useDepth) {
1388650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1398650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindColorTarget(gOffscreen, 0);
1408650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    if (useDepth) {
1418650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        rsgBindDepthTarget(gOffscreenDepth);
1428650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        rsgClearDepth(1.0f);
1438650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    } else {
1448650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk        rsgClearDepthTarget();
1458650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    }
1468650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgClearColor(0.8f, 0.0f, 0.0f, 1.0f);
1478650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1488650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindProgramVertex(gPVBackground);
1498650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rs_matrix4x4 proj;
1508650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    float aspect = (float)rsAllocationGetDimX(gOffscreen) / (float)rsAllocationGetDimY(gOffscreen);
1518650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixLoadPerspective(&proj, 30.0f, aspect, 1.0f, 100.0f);
1528650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgProgramVertexLoadProjectionMatrix(&proj);
1538650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1548650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindProgramFragment(gPFBackground);
1558650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindProgramStore(gPFSBackground);
1568650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindTexture(gPFBackground, 0, gTGrid);
1578650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1588650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rs_matrix4x4 matrix;
1598650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixLoadIdentity(&matrix);
1608650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    // Position our models on the screen
1618650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixTranslate(&matrix, gLookAt.x, gLookAt.y, gLookAt.z - gZoom);
1628650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixRotate(&matrix, gRotateX, 1.0f, 0.0f, 0.0f);
1638650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixRotate(&matrix, gRotateY, 0.0f, 1.0f, 0.0f);
1648650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgProgramVertexLoadModelMatrix(&matrix);
1658650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1668650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    renderAllMeshes();
1678650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1688650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    // Render into the frambuffer
1698650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgClearAllRenderTargets();
1708650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
1718650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1728650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic void drawOffscreenResult(int posX, int posY, rs_allocation texture) {
1738650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    // display the result
1748650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rs_matrix4x4 proj, matrix;
1758650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixLoadOrtho(&proj, 0, rsgGetWidth(), rsgGetHeight(), 0, -500, 500);
1768650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgProgramVertexLoadProjectionMatrix(&proj);
1778650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixLoadIdentity(&matrix);
1788650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgProgramVertexLoadModelMatrix(&matrix);
1798650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindTexture(gPFBackground, 0, texture);
1808650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    float startX = posX, startY = posY;
1818650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    float width = 256, height = 256;
1828650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgDrawQuadTexCoords(startX, startY, 0, 0, 1,
1838650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                         startX, startY + height, 0, 0, 0,
1848650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                         startX + width, startY + height, 0, 1, 0,
1858650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                         startX + width, startY, 0, 1, 1);
1868650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
1878650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1888650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukint root(void) {
1898650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1908650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
1918650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgClearDepth(1.0f);
1928650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1938650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    renderOffscreen(true);
1948650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    drawOffscreenResult(0, 0, gOffscreen);
1958650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1968650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
1978650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    uint32_t w = rsAllocationGetDimX(gOffscreen);
1988650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    uint32_t h = rsAllocationGetDimY(gOffscreen);
1998650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    uint32_t numElements = w*h;
2008650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
2018650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgAllocationSyncAll(gOffscreen, RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET);
2028650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
2038650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsAllocationCopy2DRange(gReadBackTest, 0, 0, 0,
2048650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                            RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, w, h,
2058650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk                            gOffscreen, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X);
2068650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
2078650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgAllocationSyncAll(gReadBackTest);
2088650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    drawOffscreenResult(0, 300, gReadBackTest);
2098650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
2108650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindProgramVertex(gPVBackground);
2118650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rs_matrix4x4 proj;
2128650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    float aspect = (float)rsgGetWidth() / (float)rsgGetHeight();
2138650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixLoadPerspective(&proj, 30.0f, aspect, 1.0f, 100.0f);
2148650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgProgramVertexLoadProjectionMatrix(&proj);
2158650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
2168650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindProgramFragment(gPFBackground);
2178650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindProgramStore(gPFSBackground);
2188650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgBindTexture(gPFBackground, 0, gTGrid);
2198650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
2208650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rs_matrix4x4 matrix;
2218650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixLoadIdentity(&matrix);
2228650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    // Position our models on the screen
2238650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixTranslate(&matrix, gLookAt.x, gLookAt.y, gLookAt.z - gZoom);
2248650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixRotate(&matrix, gRotateX, 1.0f, 0.0f, 0.0f);
2258650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsMatrixRotate(&matrix, gRotateY, 0.0f, 1.0f, 0.0f);
2268650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    rsgProgramVertexLoadModelMatrix(&matrix);
2278650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
2288650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    renderAllMeshes();
2298650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
2308650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    drawDescription();
2318650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk
2328650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk    return 0;
2338650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk}
234