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