xref: /aosp_15_r20/frameworks/rs/driver/rsdVertexArray.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
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