rsProgramVertex.cpp revision afb743aca56c18beb7ab924e75cb6e070ef3e55a
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 17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h" 191aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h> 201aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h> 21c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2.h> 22c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2ext.h> 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h> 26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/glext.h> 27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif //ANDROID_RS_BUILD_FOR_HOST 28fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 29fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsProgramVertex.h" 301aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 354815c0d121310cfcd6a8aba4eab77a9910af53acJason SamsProgramVertex::ProgramVertex(Context *rsc, const char * shaderText, 364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t shaderLength, const uint32_t * params, 37afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t paramLength) 38afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk : Program(rsc, shaderText, shaderLength, params, paramLength) { 394815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams init(rsc); 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 42afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertex::~ProgramVertex() { 43afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mShaderID) { 44889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mRSC->mShaderCache.cleanupVertex(mShaderID); 45889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk } 4656bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams} 4756bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams 48cd50653f99c960e1a47c2c30e53b369b8805344aJason Samsvoid ProgramVertex::loadShader(Context *rsc) { 49cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams Program::loadShader(rsc, GL_VERTEX_SHADER); 50c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 51c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 52afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::createShader() { 53f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams if (mUserShader.length() > 1) { 549ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 556e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk appendUserConstants(); 569ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 57b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t ct=0; ct < mInputCount; ct++) { 58b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams const Element *e = mInputElements[ct].get(); 59b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t field=0; field < e->getFieldCount(); field++) { 60b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams const Element *f = e->getField(field); 61bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams const char *fn = e->getFieldName(field); 62bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams 63bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams if (fn[0] == '#') { 64bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams continue; 65bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams } 66b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 67b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams // Cannot be complex 68b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(!f->getFieldCount()); 69afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (f->getComponent().getVectorSize()) { 70b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 1: mShader.append("attribute float ATTRIB_"); break; 71b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 2: mShader.append("attribute vec2 ATTRIB_"); break; 72b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 3: mShader.append("attribute vec3 ATTRIB_"); break; 73b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 4: mShader.append("attribute vec4 ATTRIB_"); break; 74b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams default: 75b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(0); 76b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 77b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 78bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams mShader.append(fn); 79b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams mShader.append(";\n"); 80b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 81b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 82f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams mShader.append(mUserShader); 83c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } else { 84e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk LOGE("ProgramFragment::createShader cannot create program, shader code not defined"); 85e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsAssert(0); 86c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 87c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 88c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 89afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::setupGL2(Context *rsc, ProgramVertexState *state, ShaderCache *sc) { 90c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("sgl2 vtx1 %x", glGetError()); 91c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if ((state->mLast.get() == this) && !mDirty) { 92e64c2f172516972abe581ca1b762302dd2ba1199Jason Sams return; 93c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 94c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 953eb28f07ab726a2e73063b95729abc191103b432Jason Sams rsc->checkError("ProgramVertex::setupGL2 start"); 96e9ed6cc76bbff93f681cf4a72d9cfc2bc2d00ae9Jason Sams 97afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!isUserProgram()) { 98afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mConstants[0].get() == NULL) { 990bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk LOGE("Unable to set fixed function emulation matrices because allocation is missing"); 1000bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 1010bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk return; 1020bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk } 103e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk float *f = static_cast<float *>(mConstants[0]->getPtr()); 104e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Matrix mvp; 105e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mvp.load(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); 106e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Matrix t; 107e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk t.load(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]); 108e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mvp.multiply(&t); 109afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < 16; i ++) { 110e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk f[RS_PROGRAM_VERTEX_MVP_OFFSET + i] = mvp.m[i]; 111e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 112c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 113c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 1143eb28f07ab726a2e73063b95729abc191103b432Jason Sams rsc->checkError("ProgramVertex::setupGL2 begin uniforms"); 115383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk setupUserConstants(rsc, sc, false); 1169ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 117c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams state->mLast.set(this); 118433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams rsc->checkError("ProgramVertex::setupGL2"); 119c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 121afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::setProjectionMatrix(Context *rsc, const rsc_Matrix *m) const { 122afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 123383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to set fixed function emulation matrix projection on user program"); 124383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set emulation matrix on user shader"); 125383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 126383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 127afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mConstants[0].get() == NULL) { 128383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to set fixed function emulation matrix projection because allocation is missing"); 129e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 130e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1319ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 132c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m, sizeof(rsc_Matrix)); 133cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 134c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 135c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 136afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::setModelviewMatrix(Context *rsc, const rsc_Matrix *m) const { 137afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 138383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to set fixed function emulation matrix modelview on user program"); 139383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set emulation matrix on user shader"); 140383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 141383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 142afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mConstants[0].get() == NULL) { 143383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to set fixed function emulation matrix modelview because allocation is missing"); 144383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 145e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 146e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1479ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 148c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m, sizeof(rsc_Matrix)); 149cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 150c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 151c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 152afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::setTextureMatrix(Context *rsc, const rsc_Matrix *m) const { 153afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 154383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to set fixed function emulation matrix texture on user program"); 155383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set emulation matrix on user shader"); 156383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 157383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 158afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mConstants[0].get() == NULL) { 159383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to set fixed function emulation matrix texture because allocation is missing"); 160383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 161e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 162e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1639ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 164c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m, sizeof(rsc_Matrix)); 165cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 166c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 167c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 168afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::getProjectionMatrix(Context *rsc, rsc_Matrix *m) const { 169afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 170383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to get fixed function emulation matrix projection on user program"); 171383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot get emulation matrix on user shader"); 172383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 173383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 174afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mConstants[0].get() == NULL) { 175383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to get fixed function emulation matrix projection because allocation is missing"); 176383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 177e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 178e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 17995333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk float *f = static_cast<float *>(mConstants[0]->getPtr()); 18095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk memcpy(m, &f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], sizeof(rsc_Matrix)); 18195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 18295333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 183afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::transformToScreen(Context *rsc, float *v4out, const float *v3in) const { 184afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 185e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 186e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1879ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 1883a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams Matrix mvp; 1893a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams mvp.loadMultiply((Matrix *)&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], 1903a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams (Matrix *)&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); 1913a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams mvp.vectorMultiply(v4out, v3in); 1923a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams} 193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 194afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::init(Context *rsc) { 19554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t attribCount = 0; 19654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t uniformCount = 0; 197433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams if (mUserShader.size() > 0) { 198433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams for (uint32_t ct=0; ct < mInputCount; ct++) { 19954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk initAddUserElement(mInputElements[ct].get(), mAttribNames, NULL, &attribCount, RS_SHADER_ATTR); 2009ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams } 2014c9a208262a1fc9ba062d21b8c6c787b8a822991Jason Sams for (uint32_t ct=0; ct < mConstantCount; ct++) { 20254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, mUniformArraySizes, &uniformCount, RS_SHADER_UNI); 203433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams } 2049ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams } 205c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams createShader(); 206c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 207c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 208afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::serialize(OStream *stream) const { 209fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 210fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 211afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertex *ProgramVertex::createFromStream(Context *rsc, IStream *stream) { 212fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 213fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 214fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2154815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 216c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams/////////////////////////////////////////////////////////////////////// 217c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 218afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertexState::ProgramVertexState() { 219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 221afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertexState::~ProgramVertexState() { 222326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 224afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertexState::init(Context *rsc) { 225e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *matrixElem = Element::create(rsc, RS_TYPE_MATRIX_4X4, RS_KIND_USER, false, 1); 2267ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk const Element *f2Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 2); 227e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *f3Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 3); 228e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *f4Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4); 229e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 230e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderBegin(); 231e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "MV", 1); 232e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "P", 1); 233e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "TexMatrix", 1); 234e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "MVP", 1); 235e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *constInput = rsc->mStateElement.elementBuilderCreate(rsc); 236e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 237e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderBegin(); 238e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f4Elem, "position", 1); 239e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f4Elem, "color", 1); 240e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f3Elem, "normal", 1); 2417ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f2Elem, "texture0", 1); 242e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *attrElem = rsc->mStateElement.elementBuilderCreate(rsc); 243e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 244f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams Type *inputType = Type::getType(rsc, constInput, 1, 0, 0, false, false); 245e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 246e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk String8 shaderString(RS_SHADER_INTERNAL); 247e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("varying vec4 varColor;\n"); 2487ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk shaderString.append("varying vec2 varTex0;\n"); 249e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("void main() {\n"); 250e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_Position = UNI_MVP * ATTRIB_position;\n"); 251e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_PointSize = 1.0;\n"); 252e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" varColor = ATTRIB_color;\n"); 253e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" varTex0 = ATTRIB_texture0;\n"); 254e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("}\n"); 255e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 256e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk uint32_t tmp[6]; 257e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[0] = RS_PROGRAM_PARAM_CONSTANT; 258e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[1] = (uint32_t)inputType; 259e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[2] = RS_PROGRAM_PARAM_INPUT; 260e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[3] = (uint32_t)attrElem; 261e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[4] = RS_PROGRAM_PARAM_TEXTURE_COUNT; 262e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[5] = 0; 263e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 264e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk ProgramVertex *pv = new ProgramVertex(rsc, shaderString.string(), 265e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.length(), tmp, 6); 266e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Allocation *alloc = new Allocation(rsc, inputType); 267383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pv->bindAllocation(rsc, alloc, 0); 268fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2698ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefaultAlloc.set(alloc); 2708ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefault.set(pv); 271cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams 272771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams updateSize(rsc); 273e18844a5f648071fcc3594f84bca1728644af41aJason Sams} 274e18844a5f648071fcc3594f84bca1728644af41aJason Sams 275afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertexState::updateSize(Context *rsc) { 276e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk float *f = static_cast<float *>(mDefaultAlloc->getPtr()); 277e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 2788ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams Matrix m; 279771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams m.loadOrtho(0,rsc->getWidth(), rsc->getHeight(),0, -1,1); 280e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m.m, sizeof(m)); 281e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_MVP_OFFSET], m.m, sizeof(m)); 2828ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams 2838ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams m.loadIdentity(); 284e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m.m, sizeof(m)); 285e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m.m, sizeof(m)); 2868ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams} 287326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 288afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertexState::deinit(Context *rsc) { 289f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefaultAlloc.clear(); 290f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefault.clear(); 291f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mLast.clear(); 292f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 293f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 294326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 295326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 296326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 297326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 298383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex SakhartchoukRsProgramVertex rsi_ProgramVertexCreate(Context *rsc, const char * shaderText, 2994815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t shaderLength, const uint32_t * params, 300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t paramLength) { 3014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ProgramVertex *pv = new ProgramVertex(rsc, shaderText, shaderLength, params, paramLength); 3024815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams pv->incUserRef(); 3034815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return pv; 304b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams} 305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 308