rsElement.cpp revision e5ffb879ae535a899a486285a23bea05e912480f
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h" 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 19565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams#include <GLES/gl.h> 20565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ElementState::initPredefined() 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * u_8 = new Component(Component::USER, Component::UNSIGNED, true, 8); 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * i_8 = new Component(Component::USER, Component::SIGNED, true, 8); 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * u_16 = new Component(Component::USER, Component::UNSIGNED, true, 16); 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * i_16 = new Component(Component::USER, Component::SIGNED, true, 16); 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * u_32 = new Component(Component::USER, Component::UNSIGNED, true, 32); 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * i_32 = new Component(Component::USER, Component::SIGNED, true, 32); 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * f_32 = new Component(Component::USER, Component::FLOAT, true, 32); 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * r_4 = new Component(Component::RED, Component::UNSIGNED, true, 4); 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * r_5 = new Component(Component::RED, Component::UNSIGNED, true, 5); 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * r_8 = new Component(Component::RED, Component::UNSIGNED, true, 8); 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * g_4 = new Component(Component::GREEN, Component::UNSIGNED, true, 4); 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * g_5 = new Component(Component::GREEN, Component::UNSIGNED, true, 5); 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * g_6 = new Component(Component::GREEN, Component::UNSIGNED, true, 6); 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * g_8 = new Component(Component::GREEN, Component::UNSIGNED, true, 8); 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * b_4 = new Component(Component::BLUE, Component::UNSIGNED, true, 4); 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * b_5 = new Component(Component::BLUE, Component::UNSIGNED, true, 5); 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * b_8 = new Component(Component::BLUE, Component::UNSIGNED, true, 8); 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * a_1 = new Component(Component::ALPHA, Component::UNSIGNED, true, 1); 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * a_4 = new Component(Component::ALPHA, Component::UNSIGNED, true, 4); 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * a_8 = new Component(Component::ALPHA, Component::UNSIGNED, true, 8); 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * idx_16 = new Component(Component::INDEX, Component::UNSIGNED, false, 16); 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * idx_32 = new Component(Component::INDEX, Component::UNSIGNED, false, 32); 54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * x = new Component(Component::X, Component::FLOAT, false, 32); 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * y = new Component(Component::Y, Component::FLOAT, false, 32); 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * z = new Component(Component::Z, Component::FLOAT, false, 32); 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * nx = new Component(Component::NX, Component::FLOAT, false, 32); 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * ny = new Component(Component::NY, Component::FLOAT, false, 32); 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * nz = new Component(Component::NZ, Component::FLOAT, false, 32); 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * s = new Component(Component::S, Component::FLOAT, false, 32); 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Component * t = new Component(Component::T, Component::FLOAT, false, 32); 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Element * e; 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(1); 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, u_8); 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_USER_U8, e)); 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(1); 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, i_8); 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_USER_I8, e)); 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(1); 77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, u_16); 78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_USER_U16, e)); 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(1); 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, i_16); 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_USER_I16, e)); 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(1); 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, u_32); 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_USER_U32, e)); 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(1); 89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, i_32); 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_USER_I32, e)); 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(1); 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, f_32); 94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_USER_FLOAT, e)); 95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 966678e9b2568ad041429a2477177133fe4932159fJason Sams e = new Element(1); 976678e9b2568ad041429a2477177133fe4932159fJason Sams e->setComponent(0, a_8); 986678e9b2568ad041429a2477177133fe4932159fJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_A_8, e)); 996678e9b2568ad041429a2477177133fe4932159fJason Sams 100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(3); 101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, r_5); 102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, g_6); 103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(2, b_5); 104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_RGB_565, e)); 105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(4); 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, r_5); 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, g_5); 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(2, b_5); 110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(3, a_1); 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_5551, e)); 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(4); 114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, r_4); 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, g_4); 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(2, b_4); 117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(3, a_4); 118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_4444, e)); 119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(3); 121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, r_8); 122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, g_8); 123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(2, b_8); 124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_RGB_888, e)); 125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(4); 127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, r_8); 128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, g_8); 129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(2, b_8); 130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(3, a_8); 131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_RGBA_8888, e)); 132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(1); 134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, idx_16); 135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_INDEX_16, e)); 136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(1); 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, idx_32); 139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_INDEX_32, e)); 140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(2); 142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, x); 143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, y); 144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_XY_F32, e)); 145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(3); 147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, x); 148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, y); 149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(2, z); 150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_XYZ_F32, e)); 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(4); 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, s); 154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, t); 155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(2, x); 156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(3, y); 157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_ST_XY_F32, e)); 158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(5); 160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, s); 161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, t); 162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(2, x); 163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(3, y); 164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(4, z); 165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_ST_XYZ_F32, e)); 166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(6); 168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, nx); 169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, ny); 170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(2, nz); 171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(3, x); 172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(4, y); 173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(5, z); 174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_NORM_XYZ_F32, e)); 175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e = new Element(8); 177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(0, nx); 178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(1, ny); 179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(2, nz); 180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(3, s); 181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(4, t); 182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(5, x); 183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(6, y); 184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->setComponent(7, z); 185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPredefinedList.add(Predefined(RS_ELEMENT_NORM_ST_XYZ_F32, e)); 186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 189326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::Element() 190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponents = NULL; 192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponentCount = 0; 193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 195326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::Element(uint32_t count) 196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 197326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponents = new ObjectBaseRef<Component> [count]; 198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponentCount = count; 199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 201326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::~Element() 202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear() 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete [] mComponents; 209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponents = NULL; 210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponentCount = 0; 211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 213326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::setComponent(uint32_t idx, Component *c) 214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!mComponents[idx].get()); 216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(idx < mComponentCount); 217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponents[idx].set(c); 218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams c->incRef(); 219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 222326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const 223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t total = 0; 225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (size_t ct=0; ct < mComponentCount; ct++) { 226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams total += mComponents[ct]->getBits(); 227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return total; 229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 230326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 231326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getComponentOffsetBits(uint32_t componentNumber) const 232326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 233326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t offset = 0; 234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t ct = 0; ct < componentNumber; ct++) { 235326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += mComponents[ct]->getBits(); 236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 240565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Samsuint32_t Element::getGLType() const 241565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams{ 242565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams int bits[4]; 243565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 244565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (mComponentCount > 4) { 245565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 246565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 247565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 248565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams for (uint32_t ct=0; ct < mComponentCount; ct++) { 249565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams bits[ct] = mComponents[ct]->getBits(); 250565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (mComponents[ct]->getType() != Component::UNSIGNED) { 251565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 252565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 253565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (!mComponents[ct]->getIsNormalized()) { 254565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 255565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 256565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 257565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 258565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams switch(mComponentCount) { 259565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 1: 260565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (bits[0] == 8) { 261565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_BYTE; 262565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 263565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 264565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 2: 265565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 8) && 266565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 8)) { 267565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_BYTE; 268565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 269565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 270565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 3: 271565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 8) && 272565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 8) && 273565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[2] == 8)) { 274565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_BYTE; 275565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 276565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 5) && 277565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 6) && 278565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[2] == 5)) { 279565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_SHORT_5_6_5; 280565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 281565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 282565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 4: 283565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 8) && 284565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 8) && 285565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[2] == 8) && 286565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[3] == 8)) { 287565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_BYTE; 288565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 289565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 4) && 290565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 4) && 291565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[2] == 4) && 292565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[3] == 4)) { 293565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_SHORT_4_4_4_4; 294565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 295565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 5) && 296565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 5) && 297565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[2] == 5) && 298565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[3] == 1)) { 299565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_SHORT_5_5_5_1; 300565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 301565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 302565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 303565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams} 304565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 305565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Samsuint32_t Element::getGLFormat() const 306565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams{ 307565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams switch(mComponentCount) { 308565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 1: 309565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (mComponents[0]->getKind() == Component::ALPHA) { 310565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_ALPHA; 311565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 312565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (mComponents[0]->getKind() == Component::LUMINANCE) { 313565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_LUMINANCE; 314565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 315565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams break; 316565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 2: 317565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((mComponents[0]->getKind() == Component::LUMINANCE) && 318565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[1]->getKind() == Component::ALPHA)) { 319565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_LUMINANCE_ALPHA; 320565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 321565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams break; 322565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 3: 323565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((mComponents[0]->getKind() == Component::RED) && 324565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[1]->getKind() == Component::GREEN) && 325565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[2]->getKind() == Component::BLUE)) { 326565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_RGB; 327565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 328565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams break; 329565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 4: 330565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((mComponents[0]->getKind() == Component::RED) && 331565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[1]->getKind() == Component::GREEN) && 332565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[2]->getKind() == Component::BLUE) && 333565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[3]->getKind() == Component::ALPHA)) { 334565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_RGBA; 335565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 336565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams break; 337565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 338565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 339565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams} 340565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 341565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 342326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState() 343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 346326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState() 347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////////////////////////////// 351e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 353326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 354326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 356326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ElementBegin(Context *rsc) 357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsc->mStateElement.mComponentBuildList.clear(); 359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 361326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ElementAddPredefined(Context *rsc, RsElementPredefined predef) 362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 363326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState * sec = &rsc->mStateElement; 364326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 365326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams RsElement ve = rsi_ElementGetPredefined(rsc, predef); 366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const Element *e = static_cast<const Element *>(ve); 367326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 368326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for(size_t ct = 0; ct < sec->mPredefinedList[predef].mElement->getComponentCount(); ct++) { 369326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams sec->mComponentBuildList.add(sec->mPredefinedList[predef].mElement->getComponent(ct)); 370326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 371326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 373326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsElement rsi_ElementGetPredefined(Context *rsc, RsElementPredefined predef) 374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 375326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState * sec = &rsc->mStateElement; 376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (!sec->mPredefinedList.size()) { 378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams sec->initPredefined(); 379326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 380326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 381e5ffb879ae535a899a486285a23bea05e912480fJason Sams if ((predef < 0) || 382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams (static_cast<uint32_t>(predef) >= sec->mPredefinedList.size())) { 383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams LOGE("rsElementGetPredefined: Request for bad predefined type"); 384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // error 385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return NULL; 386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 387326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 388326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(sec->mPredefinedList[predef].mEnum == predef); 389326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Element * e = sec->mPredefinedList[predef].mElement; 390326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams e->incRef(); 391326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return e; 392326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 393326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 394326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits) 395326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 396326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState * sec = &rsc->mStateElement; 397326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 398e5ffb879ae535a899a486285a23bea05e912480fJason Sams Component *c = new Component(static_cast<Component::DataKind>(dk), 399e5ffb879ae535a899a486285a23bea05e912480fJason Sams static_cast<Component::DataType>(dt), 400e5ffb879ae535a899a486285a23bea05e912480fJason Sams isNormalized, 401e5ffb879ae535a899a486285a23bea05e912480fJason Sams bits); 402e5ffb879ae535a899a486285a23bea05e912480fJason Sams sec->mComponentBuildList.add(c); 403326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 404326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 405326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsElement rsi_ElementCreate(Context *rsc) 406326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 407326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState * sec = &rsc->mStateElement; 408326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Element *se = new Element(sec->mComponentBuildList.size()); 409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 410326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (size_t ct = 0; ct < se->getComponentCount(); ct++) { 411326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams se->setComponent(ct, sec->mComponentBuildList[ct]); 412326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 413326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 414326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsc->mStateElement.mComponentBuildList.clear(); 415326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams se->incRef(); 416326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return se; 417326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 418326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 419326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ElementDestroy(Context *rsc, RsElement vse) 420326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 421326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Element * se = static_cast<Element *>(vse); 422326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams se->decRef(); 423326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 424326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 425326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 426326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 427326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 428