19e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams/* 29e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * Copyright (C) 2011 The Android Open Source Project 39e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * 49e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 59e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * you may not use this file except in compliance with the License. 69e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * You may obtain a copy of the License at 79e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * 89e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 99e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * 109e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * Unless required by applicable law or agreed to in writing, software 119e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 129e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * See the License for the specific language governing permissions and 149e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams * limitations under the License. 159e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams */ 169e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 179e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include <GLES/gl.h> 189e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include <GLES2/gl2.h> 199e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include <GLES/glext.h> 209e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 219e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include <rs_hal.h> 229e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include <rsContext.h> 239e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include <rsPath.h> 249e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 259e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include "rsdCore.h" 269e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include "rsdPath.h" 279e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include "rsdAllocation.h" 289e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include "rsdGL.h" 299e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include "rsdVertexArray.h" 309e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include "rsdShaderCache.h" 319e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 329e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsusing namespace android; 339e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsusing namespace android::renderscript; 349e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 359e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsclass DrvPath { 369e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsprotected: 379e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams DrvPath(); 389e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samspublic: 399e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams virtual ~DrvPath(); 409e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams virtual void draw(Context *) = 0; 419e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams}; 429e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 439e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsclass DrvPathStatic : public DrvPath { 449e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samspublic: 459e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams typedef struct { 469e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams float x1, xc, x2; 479e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams float y1, yc, y2; 489e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams } segment_t; 499e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 509e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams segment_t *mSegments; 519e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams uint32_t mSegmentCount; 529e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 539e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams DrvPathStatic(const Allocation *vtx, const Allocation *loops); 549e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams virtual ~DrvPathStatic(); 559e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 569e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams virtual void draw(Context *); 579e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams}; 589e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 599e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsclass DrvPathDynamic : public DrvPath { 609e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samspublic: 619e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams DrvPathDynamic(); 629e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams virtual ~DrvPathDynamic(); 639e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams}; 649e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 659e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsstatic void cleanup(const Context *rsc, const Path *m) { 669e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams DrvPath *dp = (DrvPath *)m->mHal.drv; 679e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams if (dp) { 689e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams delete dp; 699e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams } 709e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 719e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 729e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsbool rsdPathInitStatic(const Context *rsc, const Path *m, 739e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams const Allocation *vtx, const Allocation *loops) { 749e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams DrvPathStatic *drv = NULL; 759e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams cleanup(rsc, m); 769e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 779e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams DrvPathStatic *dps = new DrvPathStatic(vtx, loops); 78028f20a6e5e883b7308298273b9aa517e5c890f5Jason Sams //LOGE("init path m %p, %p", m, dps); 799e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams m->mHal.drv = dps; 809e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams return dps != NULL; 819e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 829e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 839e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsbool rsdPathInitDynamic(const Context *rsc, const Path *m) { 849e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams return false; 859e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 869e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 879e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 889e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsvoid rsdPathDraw(const Context *rsc, const Path *m) { 89028f20a6e5e883b7308298273b9aa517e5c890f5Jason Sams //LOGE("render m=%p", m); 909e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 919e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams DrvPath *drv = (DrvPath *)m->mHal.drv; 929e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams if(drv) { 93028f20a6e5e883b7308298273b9aa517e5c890f5Jason Sams //LOGE("render 2 drv=%p", drv); 949e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams drv->draw((Context *)rsc); 959e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams } 969e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 979e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 989e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsvoid rsdPathDestroy(const Context *rsc, const Path *m) { 999e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams cleanup(rsc, m); 1009e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams m->mHal.drv = NULL; 1019e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 1029e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1039e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1049e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1059e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1069e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason SamsDrvPath::DrvPath() { 1079e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 1089e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1099e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason SamsDrvPath::~DrvPath() { 1109e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 1119e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1129e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason SamsDrvPathStatic::DrvPathStatic(const Allocation *vtx, const Allocation *loops) { 1139e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams mSegmentCount = vtx->getType()->getDimX() / 3; 1149e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams mSegments = new segment_t[mSegmentCount]; 115a6dd823b9dcbd7ce7dfc34eda52a1e4104771f79Jason Sams/* 1169e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams const float *fin = (const float *)vtx->getPtr(); 1179e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams for (uint32_t ct=0; ct < mSegmentCount; ct++) { 1189e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams segment_t *s = &mSegments[ct]; 1199e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams s->x1 = fin[0]; 1209e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams s->y1 = fin[1]; 1219e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1229e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams s->xc = fin[2]; 1239e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams s->yc = fin[3]; 1249e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1259e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams s->x2 = fin[4]; 1269e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams s->y2 = fin[5]; 1279e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams fin += 6; 1289e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams } 129a6dd823b9dcbd7ce7dfc34eda52a1e4104771f79Jason Sams */ 1309e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 1319e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1329e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason SamsDrvPathStatic::~DrvPathStatic() { 1339e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 1349e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1359e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsvoid DrvPathStatic::draw(Context *rsc) { 1369e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams const static float color[24] = { 1379e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1.f, 0.f, 0.f, 1.f, 0.5f, 0.f, 0.f, 1.f, 1389e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1.f, 0.f, 0.f, 1.f, 0.5f, 0.f, 0.f, 1.f, 1399e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; 1409e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams float vtx[12]; 1419e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 142028f20a6e5e883b7308298273b9aa517e5c890f5Jason Sams //LOGE("draw"); 1439e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams if (!rsc->setupCheck()) { 1449e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams return; 1459e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams } 1469e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1479e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams RsdHal *dc = (RsdHal *)rsc->mHal.drv; 1489e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams if (!dc->gl.shaderCache->setup(rsc)) { 1499e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams return; 1509e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams } 1519e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1529e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams RsdVertexArray::Attrib attribs[2]; 153e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray attribs[0].set(GL_FLOAT, 2, 8, false, (size_t)vtx, "ATTRIB_position"); 154e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray attribs[1].set(GL_FLOAT, 4, 16, false, (size_t)color, "ATTRIB_color"); 1559e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams RsdVertexArray va(attribs, 2); 1569e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams va.setup(rsc); 1579e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 158028f20a6e5e883b7308298273b9aa517e5c890f5Jason Sams //LOGE("mSegmentCount %i", mSegmentCount); 1599e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams for (uint32_t ct=0; ct < mSegmentCount; ct++) { 1609e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams segment_t *s = &mSegments[ct]; 1619e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1629e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[0] = s->x1; 1639e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[1] = s->y1; 1649e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[2] = s->xc; 1659e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[3] = s->yc; 1669e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1679e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[4] = s->x2; 1689e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[5] = s->y2; 1699e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[6] = s->xc; 1709e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[7] = s->yc; 1719e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1729e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[8] = s->x1; 1739e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[9] = s->y1; 1749e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[10] = s->x2; 1759e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams vtx[11] = s->y2; 1769e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1779e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams RSD_CALL_GL(glDrawArrays, GL_LINES, 0, 6); 1789e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams } 1799e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1809e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 1819e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1829e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason SamsDrvPathDynamic::DrvPathDynamic() { 1839e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 1849e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1859e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason SamsDrvPathDynamic::~DrvPathDynamic() { 1869e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 187