rsProgramVertex.cpp revision 383e5b1f68c321a77bfd7466fa1171a9bfab4a6f
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, 374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t paramLength) : 384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Program(rsc, shaderText, shaderLength, params, paramLength) 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 40f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocFile = __FILE__; 41f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocLine = __LINE__; 424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams init(rsc); 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 46326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramVertex::~ProgramVertex() 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 5056bc1af0a040b003164e3394f1c7a277b15e7d85Jason Samsstatic void logMatrix(const char *txt, const float *f) 5156bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams{ 52992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams LOGV("Matrix %s, %p", txt, f); 53cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams LOGV("%6.4f, %6.4f, %6.4f, %6.4f", f[0], f[4], f[8], f[12]); 54cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams LOGV("%6.4f, %6.4f, %6.4f, %6.4f", f[1], f[5], f[9], f[13]); 55cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams LOGV("%6.4f, %6.4f, %6.4f, %6.4f", f[2], f[6], f[10], f[14]); 56cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams LOGV("%6.4f, %6.4f, %6.4f, %6.4f", f[3], f[7], f[11], f[15]); 5756bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams} 5856bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams 59cd50653f99c960e1a47c2c30e53b369b8805344aJason Samsvoid ProgramVertex::loadShader(Context *rsc) { 60cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams Program::loadShader(rsc, GL_VERTEX_SHADER); 61c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 62c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 63c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramVertex::createShader() 64c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 65f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams if (mUserShader.length() > 1) { 669ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 676e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk appendUserConstants(); 689ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 69b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t ct=0; ct < mInputCount; ct++) { 70b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams const Element *e = mInputElements[ct].get(); 71b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t field=0; field < e->getFieldCount(); field++) { 72b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams const Element *f = e->getField(field); 73bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams const char *fn = e->getFieldName(field); 74bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams 75bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams if (fn[0] == '#') { 76bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams continue; 77bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams } 78b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 79b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams // Cannot be complex 80b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(!f->getFieldCount()); 81b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams switch(f->getComponent().getVectorSize()) { 82b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 1: mShader.append("attribute float ATTRIB_"); break; 83b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 2: mShader.append("attribute vec2 ATTRIB_"); break; 84b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 3: mShader.append("attribute vec3 ATTRIB_"); break; 85b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 4: mShader.append("attribute vec4 ATTRIB_"); break; 86b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams default: 87b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(0); 88b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 89b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 90bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams mShader.append(fn); 91b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams mShader.append(";\n"); 92b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 93b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 94f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams mShader.append(mUserShader); 95c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } else { 96e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk LOGE("ProgramFragment::createShader cannot create program, shader code not defined"); 97e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsAssert(0); 98c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 99c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 100c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 101383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::setupGL2(Context *rsc, ProgramVertexState *state, ShaderCache *sc) 102c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 103c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("sgl2 vtx1 %x", glGetError()); 104c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if ((state->mLast.get() == this) && !mDirty) { 105e64c2f172516972abe581ca1b762302dd2ba1199Jason Sams return; 106c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 107c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 1083eb28f07ab726a2e73063b95729abc191103b432Jason Sams rsc->checkError("ProgramVertex::setupGL2 start"); 109e9ed6cc76bbff93f681cf4a72d9cfc2bc2d00ae9Jason Sams 110e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(!isUserProgram()) { 111e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk float *f = static_cast<float *>(mConstants[0]->getPtr()); 112e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Matrix mvp; 113e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mvp.load(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); 114e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Matrix t; 115e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk t.load(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]); 116e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mvp.multiply(&t); 117e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk for(uint32_t i = 0; i < 16; i ++) { 118e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk f[RS_PROGRAM_VERTEX_MVP_OFFSET + i] = mvp.m[i]; 119e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 121c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 1223eb28f07ab726a2e73063b95729abc191103b432Jason Sams rsc->checkError("ProgramVertex::setupGL2 begin uniforms"); 123383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk setupUserConstants(rsc, sc, false); 1249ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 125c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams state->mLast.set(this); 126433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams rsc->checkError("ProgramVertex::setupGL2"); 127c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 128c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 129383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::setProjectionMatrix(Context *rsc, const rsc_Matrix *m) const 130c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams{ 131e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(isUserProgram()) { 132383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to set fixed function emulation matrix projection on user program"); 133383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set emulation matrix on user shader"); 134383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 135383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 136383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(mConstants[0].get() == NULL) { 137383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to set fixed function emulation matrix projection because allocation is missing"); 138e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 139e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1409ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 141c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m, sizeof(rsc_Matrix)); 142cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 143c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 144c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 145383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::setModelviewMatrix(Context *rsc, const rsc_Matrix *m) const 146c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams{ 147e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(isUserProgram()) { 148383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to set fixed function emulation matrix modelview on user program"); 149383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set emulation matrix on user shader"); 150383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 151383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 152383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(mConstants[0].get() == NULL) { 153383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to set fixed function emulation matrix modelview because allocation is missing"); 154383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 155e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 156e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1579ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 158c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m, sizeof(rsc_Matrix)); 159cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 160c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 161c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 162383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::setTextureMatrix(Context *rsc, const rsc_Matrix *m) const 163c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams{ 164e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(isUserProgram()) { 165383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to set fixed function emulation matrix texture on user program"); 166383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set emulation matrix on user shader"); 167383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 168383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 169383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(mConstants[0].get() == NULL) { 170383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to set fixed function emulation matrix texture because allocation is missing"); 171383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 172e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 173e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1749ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 175c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m, sizeof(rsc_Matrix)); 176cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 177c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 178c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 179383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::getProjectionMatrix(Context *rsc, rsc_Matrix *m) const 18095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk{ 181e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(isUserProgram()) { 182383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to get fixed function emulation matrix projection on user program"); 183383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot get emulation matrix on user shader"); 184383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 185383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 186383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(mConstants[0].get() == NULL) { 187383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to get fixed function emulation matrix projection because allocation is missing"); 188383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 189e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 190e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 19195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk float *f = static_cast<float *>(mConstants[0]->getPtr()); 19295333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk memcpy(m, &f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], sizeof(rsc_Matrix)); 19395333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 19495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 195383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::transformToScreen(Context *rsc, float *v4out, const float *v3in) const 1963a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams{ 197e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(isUserProgram()) { 198e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 199e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 2009ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 2013a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams Matrix mvp; 2023a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams mvp.loadMultiply((Matrix *)&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], 2033a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams (Matrix *)&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); 2043a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams mvp.vectorMultiply(v4out, v3in); 2053a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams} 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 207c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramVertex::init(Context *rsc) 208c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 209be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribCount = 0; 210433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams if (mUserShader.size() > 0) { 211433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams for (uint32_t ct=0; ct < mInputCount; ct++) { 2129ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams initAddUserElement(mInputElements[ct].get(), mAttribNames, &mAttribCount, "ATTRIB_"); 2139ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams } 2149ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 215e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mUniformCount = 0; 2164c9a208262a1fc9ba062d21b8c6c787b8a822991Jason Sams for (uint32_t ct=0; ct < mConstantCount; ct++) { 2179ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, "UNI_"); 218433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams } 2199ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams } 220c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams createShader(); 221c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 222c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 223fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid ProgramVertex::serialize(OStream *stream) const 224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 227fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 228fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukProgramVertex *ProgramVertex::createFromStream(Context *rsc, IStream *stream) 229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 231fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 232fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 234c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams/////////////////////////////////////////////////////////////////////// 235c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 236326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramVertexState::ProgramVertexState() 237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 240326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramVertexState::~ProgramVertexState() 241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 242326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 244771565f47fc44608444c00aa8fa3bda769ceaeceJason Samsvoid ProgramVertexState::init(Context *rsc) 2458ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams{ 246e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *matrixElem = Element::create(rsc, RS_TYPE_MATRIX_4X4, RS_KIND_USER, false, 1); 247e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *f3Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 3); 248e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *f4Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4); 249e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 250e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderBegin(); 251e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "MV", 1); 252e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "P", 1); 253e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "TexMatrix", 1); 254e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "MVP", 1); 255e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *constInput = rsc->mStateElement.elementBuilderCreate(rsc); 256e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 257e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderBegin(); 258e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f4Elem, "position", 1); 259e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f4Elem, "color", 1); 260e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f3Elem, "normal", 1); 261e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f4Elem, "texture0", 1); 262e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *attrElem = rsc->mStateElement.elementBuilderCreate(rsc); 263e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 264e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Type *inputType = new Type(rsc); 265e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk inputType->setElement(constInput); 266e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk inputType->setDimX(1); 267e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk inputType->compute(); 268e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 269e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk String8 shaderString(RS_SHADER_INTERNAL); 270e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("varying vec4 varColor;\n"); 271e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("varying vec4 varTex0;\n"); 272e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("void main() {\n"); 273e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_Position = UNI_MVP * ATTRIB_position;\n"); 274e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_PointSize = 1.0;\n"); 275e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" varColor = ATTRIB_color;\n"); 276e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" varTex0 = ATTRIB_texture0;\n"); 277e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("}\n"); 278e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 279e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk uint32_t tmp[6]; 280e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[0] = RS_PROGRAM_PARAM_CONSTANT; 281e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[1] = (uint32_t)inputType; 282e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[2] = RS_PROGRAM_PARAM_INPUT; 283e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[3] = (uint32_t)attrElem; 284e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[4] = RS_PROGRAM_PARAM_TEXTURE_COUNT; 285e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[5] = 0; 286e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 287e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk ProgramVertex *pv = new ProgramVertex(rsc, shaderString.string(), 288e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.length(), tmp, 6); 289e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Allocation *alloc = new Allocation(rsc, inputType); 290383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pv->bindAllocation(rsc, alloc, 0); 291fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2928ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefaultAlloc.set(alloc); 2938ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefault.set(pv); 294cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams 295771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams updateSize(rsc); 296fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 297e18844a5f648071fcc3594f84bca1728644af41aJason Sams} 298e18844a5f648071fcc3594f84bca1728644af41aJason Sams 299771565f47fc44608444c00aa8fa3bda769ceaeceJason Samsvoid ProgramVertexState::updateSize(Context *rsc) 300e18844a5f648071fcc3594f84bca1728644af41aJason Sams{ 301e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk float *f = static_cast<float *>(mDefaultAlloc->getPtr()); 302e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 3038ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams Matrix m; 304771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams m.loadOrtho(0,rsc->getWidth(), rsc->getHeight(),0, -1,1); 305e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m.m, sizeof(m)); 306e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_MVP_OFFSET], m.m, sizeof(m)); 3078ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams 3088ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams m.loadIdentity(); 309e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m.m, sizeof(m)); 310e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m.m, sizeof(m)); 3118ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams} 312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 313f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Samsvoid ProgramVertexState::deinit(Context *rsc) 314f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{ 315f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefaultAlloc.clear(); 316f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefault.clear(); 317f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mLast.clear(); 318f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 319f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 321326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 322326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 324383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex SakhartchoukRsProgramVertex rsi_ProgramVertexCreate(Context *rsc, const char * shaderText, 3254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t shaderLength, const uint32_t * params, 3264815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t paramLength) 327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 3284815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ProgramVertex *pv = new ProgramVertex(rsc, shaderText, shaderLength, params, paramLength); 3294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams pv->incUserRef(); 3304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return pv; 331b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams} 332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 333326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 335326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 336