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