rsProgramVertex.cpp revision a04e30dbb5ab11592b03666bb3d102070759c58e
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 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" 18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsProgramVertex.h" 191aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 244815c0d121310cfcd6a8aba4eab77a9910af53acJason SamsProgramVertex::ProgramVertex(Context *rsc, const char * shaderText, 254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t shaderLength, const uint32_t * params, 26afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t paramLength) 27afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk : Program(rsc, shaderText, shaderLength, params, paramLength) { 28a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.vertex.init(mRSC, this, mUserShader.string(), mUserShader.length()); 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 31afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertex::~ProgramVertex() { 32a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.vertex.destroy(mRSC, this); 33c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 34c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 35a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid ProgramVertex::setupGL2(Context *rsc, ProgramVertexState *state) { 36c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if ((state->mLast.get() == this) && !mDirty) { 37e64c2f172516972abe581ca1b762302dd2ba1199Jason Sams return; 38c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 39c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 403eb28f07ab726a2e73063b95729abc191103b432Jason Sams rsc->checkError("ProgramVertex::setupGL2 start"); 41e9ed6cc76bbff93f681cf4a72d9cfc2bc2d00ae9Jason Sams 42afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!isUserProgram()) { 43a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (mHal.state.constants[0].get() == NULL) { 4487319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 4587319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Unable to set fixed function emulation matrices because allocation is missing"); 460bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk return; 470bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk } 48a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 4987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams Matrix4x4 mvp; 50e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mvp.load(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); 5187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams Matrix4x4 t; 52e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk t.load(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]); 53e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mvp.multiply(&t); 54afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < 16; i ++) { 55e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk f[RS_PROGRAM_VERTEX_MVP_OFFSET + i] = mvp.m[i]; 56e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 57c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 58c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 59c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams state->mLast.set(this); 60a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 61a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsc->mHal.funcs.vertex.setActive(rsc, this); 62a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 63433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams rsc->checkError("ProgramVertex::setupGL2"); 64c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 65c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 66afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::setProjectionMatrix(Context *rsc, const rsc_Matrix *m) const { 67afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 6887319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 6987319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Attempting to set fixed function emulation matrix projection on user program"); 70383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 71383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (mHal.state.constants[0].get() == NULL) { 7387319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 7487319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Unable to set fixed function emulation matrix projection because allocation is missing"); 75e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 76e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 77a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 78c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m, sizeof(rsc_Matrix)); 79cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 80c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 81c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 82afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::setModelviewMatrix(Context *rsc, const rsc_Matrix *m) const { 83afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 8487319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 8587319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Attempting to set fixed function emulation matrix modelview on user program"); 86383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 87383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 88a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (mHal.state.constants[0].get() == NULL) { 8987319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 9087319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Unable to set fixed function emulation matrix modelview because allocation is missing"); 91e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 92e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 93a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 94c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m, sizeof(rsc_Matrix)); 95cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 96c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 97c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 98afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::setTextureMatrix(Context *rsc, const rsc_Matrix *m) const { 99afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 10087319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 10187319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Attempting to set fixed function emulation matrix texture on user program"); 102383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 103383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 104a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (mHal.state.constants[0].get() == NULL) { 10587319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 10687319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Unable to set fixed function emulation matrix texture because allocation is missing"); 107e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 108e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 109a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 110c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m, sizeof(rsc_Matrix)); 111cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 112c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 113c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 114afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::getProjectionMatrix(Context *rsc, rsc_Matrix *m) const { 115afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 11687319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 11787319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Attempting to get fixed function emulation matrix projection on user program"); 118383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 119383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 120a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (mHal.state.constants[0].get() == NULL) { 12187319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 12287319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Unable to get fixed function emulation matrix projection because allocation is missing"); 123e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 124e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 125a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 12695333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk memcpy(m, &f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], sizeof(rsc_Matrix)); 12795333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 12895333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 129afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::transformToScreen(Context *rsc, float *v4out, const float *v3in) const { 130afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 131e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 132e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 133a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 13487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams Matrix4x4 mvp; 13587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams mvp.loadMultiply((Matrix4x4 *)&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], 13687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams (Matrix4x4 *)&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); 1373a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams mvp.vectorMultiply(v4out, v3in); 1383a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams} 139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 140afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::serialize(OStream *stream) const { 141fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 142fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 143afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertex *ProgramVertex::createFromStream(Context *rsc, IStream *stream) { 144fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 145fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 146fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1474815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 148c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams/////////////////////////////////////////////////////////////////////// 149c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 150afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertexState::ProgramVertexState() { 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 153afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertexState::~ProgramVertexState() { 154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 156afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertexState::init(Context *rsc) { 157e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *matrixElem = Element::create(rsc, RS_TYPE_MATRIX_4X4, RS_KIND_USER, false, 1); 1587ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk const Element *f2Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 2); 159e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *f3Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 3); 160e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *f4Elem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4); 161e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 162e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderBegin(); 163e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "MV", 1); 164e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "P", 1); 165e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "TexMatrix", 1); 166e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(matrixElem, "MVP", 1); 167e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *constInput = rsc->mStateElement.elementBuilderCreate(rsc); 168e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 169e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderBegin(); 170e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f4Elem, "position", 1); 171e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f4Elem, "color", 1); 172e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f3Elem, "normal", 1); 1737ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(f2Elem, "texture0", 1); 174e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *attrElem = rsc->mStateElement.elementBuilderCreate(rsc); 175e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 176f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams Type *inputType = Type::getType(rsc, constInput, 1, 0, 0, false, false); 177e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 178e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk String8 shaderString(RS_SHADER_INTERNAL); 179e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("varying vec4 varColor;\n"); 1807ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk shaderString.append("varying vec2 varTex0;\n"); 181e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("void main() {\n"); 182e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_Position = UNI_MVP * ATTRIB_position;\n"); 183e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_PointSize = 1.0;\n"); 184e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" varColor = ATTRIB_color;\n"); 185e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" varTex0 = ATTRIB_texture0;\n"); 186e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("}\n"); 187e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 18884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk uint32_t tmp[4]; 189e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[0] = RS_PROGRAM_PARAM_CONSTANT; 190e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[1] = (uint32_t)inputType; 191e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[2] = RS_PROGRAM_PARAM_INPUT; 192e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[3] = (uint32_t)attrElem; 193e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 194e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk ProgramVertex *pv = new ProgramVertex(rsc, shaderString.string(), 19584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk shaderString.length(), tmp, 4); 196366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Allocation *alloc = new Allocation(rsc, inputType, RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS); 197383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pv->bindAllocation(rsc, alloc, 0); 198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1998ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefaultAlloc.set(alloc); 2008ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefault.set(pv); 201cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams 202771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams updateSize(rsc); 203e18844a5f648071fcc3594f84bca1728644af41aJason Sams} 204e18844a5f648071fcc3594f84bca1728644af41aJason Sams 205afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertexState::updateSize(Context *rsc) { 206e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk float *f = static_cast<float *>(mDefaultAlloc->getPtr()); 207e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 20887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams Matrix4x4 m; 209771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams m.loadOrtho(0,rsc->getWidth(), rsc->getHeight(),0, -1,1); 210e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m.m, sizeof(m)); 211e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_MVP_OFFSET], m.m, sizeof(m)); 2128ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams 2138ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams m.loadIdentity(); 214e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m.m, sizeof(m)); 215e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m.m, sizeof(m)); 2168ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams} 217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 218afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertexState::deinit(Context *rsc) { 219f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefaultAlloc.clear(); 220f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefault.clear(); 221f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mLast.clear(); 222f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 223f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 225326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 226326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 228383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex SakhartchoukRsProgramVertex rsi_ProgramVertexCreate(Context *rsc, const char * shaderText, 2294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t shaderLength, const uint32_t * params, 230afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t paramLength) { 2314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ProgramVertex *pv = new ProgramVertex(rsc, shaderText, shaderLength, params, paramLength); 2324815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams pv->incUserRef(); 2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return pv; 234b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams} 235326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 238