rsProgramVertex.cpp revision 7ffcaf20cbb115326f3d72a983835d6c314a4cef
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{ 48889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk if(mShaderID) { 49889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk mRSC->mShaderCache.cleanupVertex(mShaderID); 50889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk } 5156bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams} 5256bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams 53cd50653f99c960e1a47c2c30e53b369b8805344aJason Samsvoid ProgramVertex::loadShader(Context *rsc) { 54cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams Program::loadShader(rsc, GL_VERTEX_SHADER); 55c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 56c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 57c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramVertex::createShader() 58c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 59f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams if (mUserShader.length() > 1) { 609ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 616e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk appendUserConstants(); 629ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 63b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t ct=0; ct < mInputCount; ct++) { 64b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams const Element *e = mInputElements[ct].get(); 65b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t field=0; field < e->getFieldCount(); field++) { 66b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams const Element *f = e->getField(field); 67bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams const char *fn = e->getFieldName(field); 68bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams 69bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams if (fn[0] == '#') { 70bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams continue; 71bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams } 72b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 73b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams // Cannot be complex 74b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(!f->getFieldCount()); 75b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams switch(f->getComponent().getVectorSize()) { 76b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 1: mShader.append("attribute float ATTRIB_"); break; 77b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 2: mShader.append("attribute vec2 ATTRIB_"); break; 78b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 3: mShader.append("attribute vec3 ATTRIB_"); break; 79b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams case 4: mShader.append("attribute vec4 ATTRIB_"); break; 80b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams default: 81b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(0); 82b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 83b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 84bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams mShader.append(fn); 85b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams mShader.append(";\n"); 86b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 87b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 88f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams mShader.append(mUserShader); 89c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } else { 90e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk LOGE("ProgramFragment::createShader cannot create program, shader code not defined"); 91e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsAssert(0); 92c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 93c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 94c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 95383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::setupGL2(Context *rsc, ProgramVertexState *state, ShaderCache *sc) 96c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 97c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams //LOGE("sgl2 vtx1 %x", glGetError()); 98c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if ((state->mLast.get() == this) && !mDirty) { 99e64c2f172516972abe581ca1b762302dd2ba1199Jason Sams return; 100c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 101c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 1023eb28f07ab726a2e73063b95729abc191103b432Jason Sams rsc->checkError("ProgramVertex::setupGL2 start"); 103e9ed6cc76bbff93f681cf4a72d9cfc2bc2d00ae9Jason Sams 104e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(!isUserProgram()) { 1050bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk if(mConstants[0].get() == NULL) { 1060bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk LOGE("Unable to set fixed function emulation matrices because allocation is missing"); 1070bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 1080bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk return; 1090bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk } 110e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk float *f = static_cast<float *>(mConstants[0]->getPtr()); 111e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Matrix mvp; 112e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mvp.load(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); 113e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Matrix t; 114e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk t.load(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]); 115e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mvp.multiply(&t); 116e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk for(uint32_t i = 0; i < 16; i ++) { 117e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk f[RS_PROGRAM_VERTEX_MVP_OFFSET + i] = mvp.m[i]; 118e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 119c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 1213eb28f07ab726a2e73063b95729abc191103b432Jason Sams rsc->checkError("ProgramVertex::setupGL2 begin uniforms"); 122383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk setupUserConstants(rsc, sc, false); 1239ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 124c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams state->mLast.set(this); 125433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams rsc->checkError("ProgramVertex::setupGL2"); 126c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 127c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 128383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::setProjectionMatrix(Context *rsc, const rsc_Matrix *m) const 129c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams{ 130e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(isUserProgram()) { 131383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to set fixed function emulation matrix projection on user program"); 132383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set emulation matrix on user shader"); 133383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 134383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 135383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(mConstants[0].get() == NULL) { 136383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to set fixed function emulation matrix projection because allocation is missing"); 137e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 138e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1399ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 140c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m, sizeof(rsc_Matrix)); 141cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 142c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 143c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 144383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::setModelviewMatrix(Context *rsc, const rsc_Matrix *m) const 145c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams{ 146e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(isUserProgram()) { 147383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to set fixed function emulation matrix modelview on user program"); 148383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set emulation matrix on user shader"); 149383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 150383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 151383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(mConstants[0].get() == NULL) { 152383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to set fixed function emulation matrix modelview because allocation is missing"); 153383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 154e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 155e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1569ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 157c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m, sizeof(rsc_Matrix)); 158cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 159c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 160c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 161383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::setTextureMatrix(Context *rsc, const rsc_Matrix *m) const 162c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams{ 163e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(isUserProgram()) { 164383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to set fixed function emulation matrix texture on user program"); 165383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set emulation matrix on user shader"); 166383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 167383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 168383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(mConstants[0].get() == NULL) { 169383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to set fixed function emulation matrix texture because allocation is missing"); 170383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 171e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 172e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1739ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 174c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m, sizeof(rsc_Matrix)); 175cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 176c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 177c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 178383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::getProjectionMatrix(Context *rsc, rsc_Matrix *m) const 17995333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk{ 180e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(isUserProgram()) { 181383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to get fixed function emulation matrix projection on user program"); 182383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot get emulation matrix on user shader"); 183383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 184383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 185383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(mConstants[0].get() == NULL) { 186383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to get fixed function emulation matrix projection because allocation is missing"); 187383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Fixed function allocation missing"); 188e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 189e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 19095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk float *f = static_cast<float *>(mConstants[0]->getPtr()); 19195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk memcpy(m, &f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], sizeof(rsc_Matrix)); 19295333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 19395333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 194383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukvoid ProgramVertex::transformToScreen(Context *rsc, float *v4out, const float *v3in) const 1953a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams{ 196e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk if(isUserProgram()) { 197e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 198e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 1999ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams float *f = static_cast<float *>(mConstants[0]->getPtr()); 2003a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams Matrix mvp; 2013a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams mvp.loadMultiply((Matrix *)&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], 2023a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams (Matrix *)&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); 2033a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams mvp.vectorMultiply(v4out, v3in); 2043a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams} 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 206c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramVertex::init(Context *rsc) 207c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{ 208be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams mAttribCount = 0; 209433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams if (mUserShader.size() > 0) { 210433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams for (uint32_t ct=0; ct < mInputCount; ct++) { 211886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk initAddUserElement(mInputElements[ct].get(), mAttribNames, &mAttribCount, RS_SHADER_ATTR); 2129ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams } 213e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mUniformCount = 0; 2144c9a208262a1fc9ba062d21b8c6c787b8a822991Jason Sams for (uint32_t ct=0; ct < mConstantCount; ct++) { 215886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk initAddUserElement(mConstantTypes[ct]->getElement(), mUniformNames, &mUniformCount, RS_SHADER_UNI); 216433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams } 2179ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams } 218c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams createShader(); 219c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 220c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 221fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid ProgramVertex::serialize(OStream *stream) const 222fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 223fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukProgramVertex *ProgramVertex::createFromStream(Context *rsc, IStream *stream) 227fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 228fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 232c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams/////////////////////////////////////////////////////////////////////// 233c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 234326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramVertexState::ProgramVertexState() 235326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 238326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramVertexState::~ProgramVertexState() 239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 242771565f47fc44608444c00aa8fa3bda769ceaeceJason Samsvoid ProgramVertexState::init(Context *rsc) 2438ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams{ 244e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *matrixElem = Element::create(rsc, RS_TYPE_MATRIX_4X4, RS_KIND_USER, false, 1); 2457ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk const Element *f2Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 2); 246e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *f3Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 3); 247e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *f4Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4); 248e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 249e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderBegin(); 250e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "MV", 1); 251e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "P", 1); 252e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "TexMatrix", 1); 253e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "MVP", 1); 254e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *constInput = rsc->mStateElement.elementBuilderCreate(rsc); 255e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 256e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderBegin(); 257e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f4Elem, "position", 1); 258e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f4Elem, "color", 1); 259e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f3Elem, "normal", 1); 2607ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f2Elem, "texture0", 1); 261e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *attrElem = rsc->mStateElement.elementBuilderCreate(rsc); 262e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 263e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Type *inputType = new Type(rsc); 264e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk inputType->setElement(constInput); 265e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk inputType->setDimX(1); 266e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk inputType->compute(); 267e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 268e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk String8 shaderString(RS_SHADER_INTERNAL); 269e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("varying vec4 varColor;\n"); 2707ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk shaderString.append("varying vec2 varTex0;\n"); 271e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("void main() {\n"); 272e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_Position = UNI_MVP * ATTRIB_position;\n"); 273e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_PointSize = 1.0;\n"); 274e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" varColor = ATTRIB_color;\n"); 275e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" varTex0 = ATTRIB_texture0;\n"); 276e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("}\n"); 277e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 278e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk uint32_t tmp[6]; 279e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[0] = RS_PROGRAM_PARAM_CONSTANT; 280e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[1] = (uint32_t)inputType; 281e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[2] = RS_PROGRAM_PARAM_INPUT; 282e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[3] = (uint32_t)attrElem; 283e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[4] = RS_PROGRAM_PARAM_TEXTURE_COUNT; 284e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[5] = 0; 285e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 286e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk ProgramVertex *pv = new ProgramVertex(rsc, shaderString.string(), 287e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.length(), tmp, 6); 288e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk Allocation *alloc = new Allocation(rsc, inputType); 289383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pv->bindAllocation(rsc, alloc, 0); 290fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2918ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefaultAlloc.set(alloc); 2928ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefault.set(pv); 293cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams 294771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams updateSize(rsc); 295fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 296e18844a5f648071fcc3594f84bca1728644af41aJason Sams} 297e18844a5f648071fcc3594f84bca1728644af41aJason Sams 298771565f47fc44608444c00aa8fa3bda769ceaeceJason Samsvoid ProgramVertexState::updateSize(Context *rsc) 299e18844a5f648071fcc3594f84bca1728644af41aJason Sams{ 300e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk float *f = static_cast<float *>(mDefaultAlloc->getPtr()); 301e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 3028ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams Matrix m; 303771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams m.loadOrtho(0,rsc->getWidth(), rsc->getHeight(),0, -1,1); 304e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m.m, sizeof(m)); 305e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_MVP_OFFSET], m.m, sizeof(m)); 3068ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams 3078ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams m.loadIdentity(); 308e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m.m, sizeof(m)); 309e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m.m, sizeof(m)); 3108ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams} 311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 312f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Samsvoid ProgramVertexState::deinit(Context *rsc) 313f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{ 314f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefaultAlloc.clear(); 315f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefault.clear(); 316f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mLast.clear(); 317f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 318f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 320326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 321326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 323383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex SakhartchoukRsProgramVertex rsi_ProgramVertexCreate(Context *rsc, const char * shaderText, 3244815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t shaderLength, const uint32_t * params, 3254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t paramLength) 326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 3274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ProgramVertex *pv = new ProgramVertex(rsc, shaderText, shaderLength, params, paramLength); 3284815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams pv->incUserRef(); 3294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return pv; 330b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams} 331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 333326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 335