rsdVertexArray.cpp revision 886f11ade9dde05485cb11c0d67d87f76a428f6c
1c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams/* 2c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Copyright (C) 2009 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 17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 18c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include "rsContext.h" 19c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES/gl.h> 20c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2.h> 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h> 24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 26c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 27c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsusing namespace android; 28c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsusing namespace android::renderscript; 29c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 30c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 31c460e55d78cbe8bee95c5c947dfe541218142a5bJason SamsVertexArray::VertexArray() 32c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 33be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams clearAll(); 34c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 35c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 36c460e55d78cbe8bee95c5c947dfe541218142a5bJason SamsVertexArray::~VertexArray() 37c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 38c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 39c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 40c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 41c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid VertexArray::clearAll() 42c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 43433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) { 44433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mAttribs[ct].clear(); 45433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams } 46c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mActiveBuffer = 0; 47590549f4c4507f9b36fba51a61415e582bbff659Jason Sams mActivePointer = NULL; 48be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mCount = 0; 49433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams} 50433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams 51433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason SamsVertexArray::Attrib::Attrib() 52433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams{ 53433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams clear(); 54433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams} 55433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams 56433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Samsvoid VertexArray::Attrib::set(const Attrib &a) 57433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams{ 58433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams buffer = a.buffer; 59590549f4c4507f9b36fba51a61415e582bbff659Jason Sams ptr = a.ptr; 60433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams offset = a.offset; 61433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams type = a.type; 62433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams size = a.size; 63433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams stride = a.stride; 64433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams normalized = a.normalized; 65433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams name.setTo(a.name); 66433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams} 67433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams 68433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Samsvoid VertexArray::Attrib::clear() 69433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams{ 70433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams buffer = 0; 71433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams offset = 0; 72433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams type = 0; 73433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams size = 0; 74433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams stride = 0; 75590549f4c4507f9b36fba51a61415e582bbff659Jason Sams ptr = NULL; 76433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams normalized = false; 77433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams name.setTo(""); 78c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 79c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 80be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Samsvoid VertexArray::clear(uint32_t n) 81c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 82433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mAttribs[n].clear(); 83c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 84c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 8579f52df541f87ac07709e770cd79f14dd1a05e93Jason Samsvoid VertexArray::add(const Attrib &a, uint32_t stride) 86c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 87fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk rsAssert(mCount < RS_MAX_ATTRIBS); 88be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[mCount].set(a); 89be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[mCount].buffer = mActiveBuffer; 90760f1f7335ad0c5aee59ca829a40bbf6e3328a1bJason Sams mAttribs[mCount].ptr = mActivePointer; 91be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[mCount].stride = stride; 92be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mCount ++; 93c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 94c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 9579f52df541f87ac07709e770cd79f14dd1a05e93Jason Samsvoid VertexArray::add(uint32_t type, uint32_t size, uint32_t stride, bool normalized, uint32_t offset, const char *name) 96433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams{ 97fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk rsAssert(mCount < RS_MAX_ATTRIBS); 98be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[mCount].clear(); 99be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[mCount].type = type; 100be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[mCount].size = size; 101be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[mCount].offset = offset; 102be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[mCount].normalized = normalized; 103be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[mCount].stride = stride; 10479f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams mAttribs[mCount].name.setTo(name); 105760f1f7335ad0c5aee59ca829a40bbf6e3328a1bJason Sams 106760f1f7335ad0c5aee59ca829a40bbf6e3328a1bJason Sams mAttribs[mCount].buffer = mActiveBuffer; 107760f1f7335ad0c5aee59ca829a40bbf6e3328a1bJason Sams mAttribs[mCount].ptr = mActivePointer; 108be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mCount ++; 109c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 110c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 111433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Samsvoid VertexArray::logAttrib(uint32_t idx, uint32_t slot) const { 112886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk if(idx == 0) { 113886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk LOGV("Starting vertex attribute binding"); 114886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk } 115886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk LOGV("va %i: slot=%i name=%s buf=%i ptr=%p size=%i type=0x%x stride=0x%x norm=%i offset=0x%x", 116886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk idx, slot, 117433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams mAttribs[idx].name.string(), 118c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mAttribs[idx].buffer, 119760f1f7335ad0c5aee59ca829a40bbf6e3328a1bJason Sams mAttribs[idx].ptr, 120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mAttribs[idx].size, 121c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mAttribs[idx].type, 122c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mAttribs[idx].stride, 123d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams mAttribs[idx].normalized, 124c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams mAttribs[idx].offset); 125c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 126c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 127d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Samsvoid VertexArray::setupGL2(const Context *rsc, class VertexArrayState *state, ShaderCache *sc) const 128c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 1293eb28f07ab726a2e73063b95729abc191103b432Jason Sams rsc->checkError("VertexArray::setupGL2 start"); 13079f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams for (uint32_t ct=1; ct <= 0xf/*state->mLastEnableCount*/; ct++) { 131c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams glDisableVertexAttribArray(ct); 132c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 133c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 1343eb28f07ab726a2e73063b95729abc191103b432Jason Sams rsc->checkError("VertexArray::setupGL2 disabled"); 135be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams for (uint32_t ct=0; ct < mCount; ct++) { 136886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk int32_t slot = sc->vtxAttribSlot(mAttribs[ct].name); 137886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk if(rsc->props.mLogShadersAttr) { 138886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk logAttrib(ct, slot); 139c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 140af83e79895d05ba45c2f8e340f2222dc19e2fffaAlex Sakhartchouk if(slot < 0) { 141af83e79895d05ba45c2f8e340f2222dc19e2fffaAlex Sakhartchouk continue; 142af83e79895d05ba45c2f8e340f2222dc19e2fffaAlex Sakhartchouk } 143be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams glEnableVertexAttribArray(slot); 144be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams glBindBuffer(GL_ARRAY_BUFFER, mAttribs[ct].buffer); 145be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams glVertexAttribPointer(slot, 146be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[ct].size, 147be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[ct].type, 148be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[ct].normalized, 149be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribs[ct].stride, 150760f1f7335ad0c5aee59ca829a40bbf6e3328a1bJason Sams mAttribs[ct].ptr + mAttribs[ct].offset); 151c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 1523eb28f07ab726a2e73063b95729abc191103b432Jason Sams state->mLastEnableCount = mCount; 1533eb28f07ab726a2e73063b95729abc191103b432Jason Sams rsc->checkError("VertexArray::setupGL2 done"); 154c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 155c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams//////////////////////////////////////////// 156c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 157c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid VertexArrayState::init(Context *) { 1583eb28f07ab726a2e73063b95729abc191103b432Jason Sams mLastEnableCount = 0; 159c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 160c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 161