rsdPath.cpp revision e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4
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