1c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams/*
2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams *
4c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * you may not use this file except in compliance with the License.
6c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * You may obtain a copy of the License at
7c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams *
8c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams *
10c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Unless required by applicable law or agreed to in writing, software
11c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * See the License for the specific language governing permissions and
14c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * limitations under the License.
15c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams */
16c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
17a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include <rs_hal.h>
18a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include <rsContext.h>
19a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
20c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES/gl.h>
21c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2.h>
22a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
23c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk#include "rsdGL.h"
24a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdCore.h"
25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdVertexArray.h"
26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdShaderCache.h"
27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
28c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsusing namespace android;
29c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsusing namespace android::renderscript;
30c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
31a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukRsdVertexArray::RsdVertexArray(const Attrib *attribs, uint32_t numAttribs) {
3254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    mAttribs = attribs;
3354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    mCount = numAttribs;
34c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
35c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
36a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukRsdVertexArray::~RsdVertexArray() {
37c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
38c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
39a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukRsdVertexArray::Attrib::Attrib() {
40433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    clear();
41433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams}
42433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
43a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid RsdVertexArray::Attrib::clear() {
44433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    buffer = 0;
45433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    offset = 0;
46433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    type = 0;
47433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    size = 0;
48433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    stride = 0;
4944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    ptr = nullptr;
50433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    normalized = false;
51b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    name.setTo("");
52c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
53c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
54a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid RsdVertexArray::Attrib::set(uint32_t type, uint32_t size, uint32_t stride,
55e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray                              bool normalized, size_t offset,
56afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                              const char *name) {
5754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    clear();
5854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    this->type = type;
5954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    this->size = size;
6054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    this->offset = offset;
6154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    this->normalized = normalized;
6254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    this->stride = stride;
63b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    this->name.setTo(name);
64c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
65c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
66a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid RsdVertexArray::logAttrib(uint32_t idx, uint32_t slot) const {
67afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (idx == 0) {
686598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        ALOGV("Starting vertex attribute binding");
69886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk    }
70e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray    ALOGV("va %i: slot=%i name=%s buf=%i ptr=%p size=%i  type=0x%x  stride=0x%x  norm=%i  offset=0x%p",
71e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray          idx, slot,
72b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni          mAttribs[idx].name.string(),
73e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray          mAttribs[idx].buffer,
74e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray          mAttribs[idx].ptr,
75e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray          mAttribs[idx].size,
76e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray          mAttribs[idx].type,
77e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray          mAttribs[idx].stride,
78e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray          mAttribs[idx].normalized,
79e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray          (void*)mAttribs[idx].offset);
80c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
81c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
82c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchoukvoid RsdVertexArray::setup(const Context *rsc) const {
83a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
84a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
85a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdVertexArrayState *state = dc->gl.vertexArrayState;
86a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdShaderCache *sc = dc->gl.shaderCache;
87a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
88c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsdGLCheckError(rsc, "RsdVertexArray::setup start");
892d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk    uint32_t maxAttrs = state->mAttrsEnabledSize;
90a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
912d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk    for (uint32_t ct=1; ct < maxAttrs; ct++) {
922d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk        if(state->mAttrsEnabled[ct]) {
932d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk            glDisableVertexAttribArray(ct);
942d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk            state->mAttrsEnabled[ct] = false;
952d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk        }
96c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
97c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
98c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsdGLCheckError(rsc, "RsdVertexArray::setup disabled");
99be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams    for (uint32_t ct=0; ct < mCount; ct++) {
100886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk        int32_t slot = sc->vtxAttribSlot(mAttribs[ct].name);
101afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        if (rsc->props.mLogShadersAttr) {
102886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk            logAttrib(ct, slot);
103c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        }
1042d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk        if (slot < 0 || slot >= (int32_t)maxAttrs) {
105af83e79895d05ba45c2f8e340f2222dc19e2fffaAlex Sakhartchouk            continue;
106af83e79895d05ba45c2f8e340f2222dc19e2fffaAlex Sakhartchouk        }
107be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        glEnableVertexAttribArray(slot);
1082d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk        state->mAttrsEnabled[slot] = true;
109be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        glBindBuffer(GL_ARRAY_BUFFER, mAttribs[ct].buffer);
110be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        glVertexAttribPointer(slot,
111be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                              mAttribs[ct].size,
112be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                              mAttribs[ct].type,
113be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                              mAttribs[ct].normalized,
114be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                              mAttribs[ct].stride,
115760f1f7335ad0c5aee59ca829a40bbf6e3328a1bJason Sams                              mAttribs[ct].ptr + mAttribs[ct].offset);
116c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
117c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsdGLCheckError(rsc, "RsdVertexArray::setup done");
118c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
119c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams////////////////////////////////////////////
120a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukRsdVertexArrayState::RsdVertexArrayState() {
12144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    mAttrsEnabled = nullptr;
1222d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk    mAttrsEnabledSize = 0;
1232d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk}
124c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
125a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukRsdVertexArrayState::~RsdVertexArrayState() {
1262d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk    if (mAttrsEnabled) {
1272d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk        delete[] mAttrsEnabled;
12844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        mAttrsEnabled = nullptr;
1292d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk    }
1302d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk}
131a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid RsdVertexArrayState::init(uint32_t maxAttrs) {
132a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    mAttrsEnabledSize = maxAttrs;
1332d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk    mAttrsEnabled = new bool[mAttrsEnabledSize];
1342d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk    for (uint32_t ct = 0; ct < mAttrsEnabledSize; ct++) {
1352d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk        mAttrsEnabled[ct] = false;
1362d791976a2b937017423519d9f9a4928fc31dae2Alex Sakhartchouk    }
137c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
138b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni
139