1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker *
4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker *
8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker *
10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker */
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Worker #include <rs_hal.h>
18*e1eccf28SAndroid Build Coastguard Worker #include <rsContext.h>
19*e1eccf28SAndroid Build Coastguard Worker
20*e1eccf28SAndroid Build Coastguard Worker #include <GLES/gl.h>
21*e1eccf28SAndroid Build Coastguard Worker #include <GLES2/gl2.h>
22*e1eccf28SAndroid Build Coastguard Worker
23*e1eccf28SAndroid Build Coastguard Worker #include "rsdGL.h"
24*e1eccf28SAndroid Build Coastguard Worker #include "rsdCore.h"
25*e1eccf28SAndroid Build Coastguard Worker #include "rsdVertexArray.h"
26*e1eccf28SAndroid Build Coastguard Worker #include "rsdShaderCache.h"
27*e1eccf28SAndroid Build Coastguard Worker
28*e1eccf28SAndroid Build Coastguard Worker using android::renderscript::Context;
29*e1eccf28SAndroid Build Coastguard Worker
RsdVertexArray(const Attrib * attribs,uint32_t numAttribs)30*e1eccf28SAndroid Build Coastguard Worker RsdVertexArray::RsdVertexArray(const Attrib *attribs, uint32_t numAttribs) {
31*e1eccf28SAndroid Build Coastguard Worker mAttribs = attribs;
32*e1eccf28SAndroid Build Coastguard Worker mCount = numAttribs;
33*e1eccf28SAndroid Build Coastguard Worker }
34*e1eccf28SAndroid Build Coastguard Worker
~RsdVertexArray()35*e1eccf28SAndroid Build Coastguard Worker RsdVertexArray::~RsdVertexArray() {
36*e1eccf28SAndroid Build Coastguard Worker }
37*e1eccf28SAndroid Build Coastguard Worker
Attrib()38*e1eccf28SAndroid Build Coastguard Worker RsdVertexArray::Attrib::Attrib() {
39*e1eccf28SAndroid Build Coastguard Worker clear();
40*e1eccf28SAndroid Build Coastguard Worker }
41*e1eccf28SAndroid Build Coastguard Worker
clear()42*e1eccf28SAndroid Build Coastguard Worker void RsdVertexArray::Attrib::clear() {
43*e1eccf28SAndroid Build Coastguard Worker buffer = 0;
44*e1eccf28SAndroid Build Coastguard Worker offset = 0;
45*e1eccf28SAndroid Build Coastguard Worker type = 0;
46*e1eccf28SAndroid Build Coastguard Worker size = 0;
47*e1eccf28SAndroid Build Coastguard Worker stride = 0;
48*e1eccf28SAndroid Build Coastguard Worker ptr = nullptr;
49*e1eccf28SAndroid Build Coastguard Worker normalized = false;
50*e1eccf28SAndroid Build Coastguard Worker name.assign("");
51*e1eccf28SAndroid Build Coastguard Worker }
52*e1eccf28SAndroid Build Coastguard Worker
set(uint32_t type,uint32_t size,uint32_t stride,bool normalized,size_t offset,const char * name)53*e1eccf28SAndroid Build Coastguard Worker void RsdVertexArray::Attrib::set(uint32_t type, uint32_t size, uint32_t stride,
54*e1eccf28SAndroid Build Coastguard Worker bool normalized, size_t offset,
55*e1eccf28SAndroid Build Coastguard Worker const char *name) {
56*e1eccf28SAndroid Build Coastguard Worker clear();
57*e1eccf28SAndroid Build Coastguard Worker this->type = type;
58*e1eccf28SAndroid Build Coastguard Worker this->size = size;
59*e1eccf28SAndroid Build Coastguard Worker this->offset = offset;
60*e1eccf28SAndroid Build Coastguard Worker this->normalized = normalized;
61*e1eccf28SAndroid Build Coastguard Worker this->stride = stride;
62*e1eccf28SAndroid Build Coastguard Worker this->name.assign(name);
63*e1eccf28SAndroid Build Coastguard Worker }
64*e1eccf28SAndroid Build Coastguard Worker
logAttrib(uint32_t idx,uint32_t slot) const65*e1eccf28SAndroid Build Coastguard Worker void RsdVertexArray::logAttrib(uint32_t idx, uint32_t slot) const {
66*e1eccf28SAndroid Build Coastguard Worker if (idx == 0) {
67*e1eccf28SAndroid Build Coastguard Worker ALOGV("Starting vertex attribute binding");
68*e1eccf28SAndroid Build Coastguard Worker }
69*e1eccf28SAndroid Build Coastguard Worker ALOGV("va %i: slot=%i name=%s buf=%i ptr=%p size=%i type=0x%x stride=0x%x norm=%i offset=0x%p",
70*e1eccf28SAndroid Build Coastguard Worker idx, slot,
71*e1eccf28SAndroid Build Coastguard Worker mAttribs[idx].name.c_str(),
72*e1eccf28SAndroid Build Coastguard Worker mAttribs[idx].buffer,
73*e1eccf28SAndroid Build Coastguard Worker mAttribs[idx].ptr,
74*e1eccf28SAndroid Build Coastguard Worker mAttribs[idx].size,
75*e1eccf28SAndroid Build Coastguard Worker mAttribs[idx].type,
76*e1eccf28SAndroid Build Coastguard Worker mAttribs[idx].stride,
77*e1eccf28SAndroid Build Coastguard Worker mAttribs[idx].normalized,
78*e1eccf28SAndroid Build Coastguard Worker (void*)mAttribs[idx].offset);
79*e1eccf28SAndroid Build Coastguard Worker }
80*e1eccf28SAndroid Build Coastguard Worker
setup(const Context * rsc) const81*e1eccf28SAndroid Build Coastguard Worker void RsdVertexArray::setup(const Context *rsc) const {
82*e1eccf28SAndroid Build Coastguard Worker
83*e1eccf28SAndroid Build Coastguard Worker RsdHal *dc = (RsdHal *)rsc->mHal.drv;
84*e1eccf28SAndroid Build Coastguard Worker RsdVertexArrayState *state = dc->gl.vertexArrayState;
85*e1eccf28SAndroid Build Coastguard Worker RsdShaderCache *sc = dc->gl.shaderCache;
86*e1eccf28SAndroid Build Coastguard Worker
87*e1eccf28SAndroid Build Coastguard Worker rsdGLCheckError(rsc, "RsdVertexArray::setup start");
88*e1eccf28SAndroid Build Coastguard Worker uint32_t maxAttrs = state->mAttrsEnabledSize;
89*e1eccf28SAndroid Build Coastguard Worker
90*e1eccf28SAndroid Build Coastguard Worker for (uint32_t ct=1; ct < maxAttrs; ct++) {
91*e1eccf28SAndroid Build Coastguard Worker if(state->mAttrsEnabled[ct]) {
92*e1eccf28SAndroid Build Coastguard Worker glDisableVertexAttribArray(ct);
93*e1eccf28SAndroid Build Coastguard Worker state->mAttrsEnabled[ct] = false;
94*e1eccf28SAndroid Build Coastguard Worker }
95*e1eccf28SAndroid Build Coastguard Worker }
96*e1eccf28SAndroid Build Coastguard Worker
97*e1eccf28SAndroid Build Coastguard Worker rsdGLCheckError(rsc, "RsdVertexArray::setup disabled");
98*e1eccf28SAndroid Build Coastguard Worker for (uint32_t ct=0; ct < mCount; ct++) {
99*e1eccf28SAndroid Build Coastguard Worker int32_t slot = sc->vtxAttribSlot(mAttribs[ct].name);
100*e1eccf28SAndroid Build Coastguard Worker if (rsc->props.mLogShadersAttr) {
101*e1eccf28SAndroid Build Coastguard Worker logAttrib(ct, slot);
102*e1eccf28SAndroid Build Coastguard Worker }
103*e1eccf28SAndroid Build Coastguard Worker if (slot < 0 || slot >= (int32_t)maxAttrs) {
104*e1eccf28SAndroid Build Coastguard Worker continue;
105*e1eccf28SAndroid Build Coastguard Worker }
106*e1eccf28SAndroid Build Coastguard Worker glEnableVertexAttribArray(slot);
107*e1eccf28SAndroid Build Coastguard Worker state->mAttrsEnabled[slot] = true;
108*e1eccf28SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, mAttribs[ct].buffer);
109*e1eccf28SAndroid Build Coastguard Worker glVertexAttribPointer(slot,
110*e1eccf28SAndroid Build Coastguard Worker mAttribs[ct].size,
111*e1eccf28SAndroid Build Coastguard Worker mAttribs[ct].type,
112*e1eccf28SAndroid Build Coastguard Worker mAttribs[ct].normalized,
113*e1eccf28SAndroid Build Coastguard Worker mAttribs[ct].stride,
114*e1eccf28SAndroid Build Coastguard Worker mAttribs[ct].ptr + mAttribs[ct].offset);
115*e1eccf28SAndroid Build Coastguard Worker }
116*e1eccf28SAndroid Build Coastguard Worker rsdGLCheckError(rsc, "RsdVertexArray::setup done");
117*e1eccf28SAndroid Build Coastguard Worker }
118*e1eccf28SAndroid Build Coastguard Worker ////////////////////////////////////////////
RsdVertexArrayState()119*e1eccf28SAndroid Build Coastguard Worker RsdVertexArrayState::RsdVertexArrayState() {
120*e1eccf28SAndroid Build Coastguard Worker mAttrsEnabled = nullptr;
121*e1eccf28SAndroid Build Coastguard Worker mAttrsEnabledSize = 0;
122*e1eccf28SAndroid Build Coastguard Worker }
123*e1eccf28SAndroid Build Coastguard Worker
~RsdVertexArrayState()124*e1eccf28SAndroid Build Coastguard Worker RsdVertexArrayState::~RsdVertexArrayState() {
125*e1eccf28SAndroid Build Coastguard Worker if (mAttrsEnabled) {
126*e1eccf28SAndroid Build Coastguard Worker delete[] mAttrsEnabled;
127*e1eccf28SAndroid Build Coastguard Worker mAttrsEnabled = nullptr;
128*e1eccf28SAndroid Build Coastguard Worker }
129*e1eccf28SAndroid Build Coastguard Worker }
init(uint32_t maxAttrs)130*e1eccf28SAndroid Build Coastguard Worker void RsdVertexArrayState::init(uint32_t maxAttrs) {
131*e1eccf28SAndroid Build Coastguard Worker mAttrsEnabledSize = maxAttrs;
132*e1eccf28SAndroid Build Coastguard Worker mAttrsEnabled = new bool[mAttrsEnabledSize];
133*e1eccf28SAndroid Build Coastguard Worker for (uint32_t ct = 0; ct < mAttrsEnabledSize; ct++) {
134*e1eccf28SAndroid Build Coastguard Worker mAttrsEnabled[ct] = false;
135*e1eccf28SAndroid Build Coastguard Worker }
136*e1eccf28SAndroid Build Coastguard Worker }
137