rsProgramVertex.cpp revision e3150cfb3edb028407669e4a65e087eae77e718c
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" 194edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsMatrix4x4.h" 201aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 25748eb07e805b93c2bf79340d4937963ab739d17cAlex SakhartchoukProgramVertex::ProgramVertex(Context *rsc, const char * shaderText, size_t shaderLength, 26748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char** textureNames, size_t textureNamesCount, const size_t *textureNamesLength, 27748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk 28748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const uint32_t * params, size_t paramLength) 29afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk : Program(rsc, shaderText, shaderLength, params, paramLength) { 30748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk mRSC->mHal.funcs.vertex.init(mRSC, this, mUserShader.string(), mUserShader.length(), 31748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk textureNames, textureNamesCount, textureNamesLength); 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 34afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertex::~ProgramVertex() { 35a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.vertex.destroy(mRSC, this); 36c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 37c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 38c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchoukvoid ProgramVertex::setup(Context *rsc, ProgramVertexState *state) { 39c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if ((state->mLast.get() == this) && !mDirty) { 40e64c2f172516972abe581ca1b762302dd2ba1199Jason Sams return; 41c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 42c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 43afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!isUserProgram()) { 44064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.constants[0] == NULL) { 4587319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 4687319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Unable to set fixed function emulation matrices because allocation is missing"); 470bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk return; 480bd3c8621aeaab8d616ebf7644f9da3cce4bbde8Alex Sakhartchouk } 49a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 5087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams Matrix4x4 mvp; 51e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mvp.load(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); 5287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams Matrix4x4 t; 53e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk t.load(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]); 54e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mvp.multiply(&t); 55afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < 16; i ++) { 56e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk f[RS_PROGRAM_VERTEX_MVP_OFFSET + i] = mvp.m[i]; 57e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 58c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 59c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 60c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams state->mLast.set(this); 61a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 62a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsc->mHal.funcs.vertex.setActive(rsc, this); 63c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 64c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 65afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::setProjectionMatrix(Context *rsc, const rsc_Matrix *m) const { 66afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 6787319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 6887319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Attempting to set fixed function emulation matrix projection on user program"); 69383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 70383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 71064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.constants[0] == NULL) { 7287319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 7387319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Unable to set fixed function emulation matrix projection because allocation is missing"); 74e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 75e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 76a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 77c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m, sizeof(rsc_Matrix)); 78cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 79c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 80c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 81afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::setModelviewMatrix(Context *rsc, const rsc_Matrix *m) const { 82afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 8387319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 8487319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Attempting to set fixed function emulation matrix modelview on user program"); 85383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 86383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 87064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.constants[0] == NULL) { 8887319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 8987319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Unable to set fixed function emulation matrix modelview because allocation is missing"); 90e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 91e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 92a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 93c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m, sizeof(rsc_Matrix)); 94cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 95c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 96c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 97afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::setTextureMatrix(Context *rsc, const rsc_Matrix *m) const { 98afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 9987319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 10087319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Attempting to set fixed function emulation matrix texture on user program"); 101383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 102383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 103064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.constants[0] == NULL) { 10487319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 10587319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Unable to set fixed function emulation matrix texture because allocation is missing"); 106e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 107e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 108a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 109c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m, sizeof(rsc_Matrix)); 110cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mDirty = true; 111c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams} 112c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 113afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::getProjectionMatrix(Context *rsc, rsc_Matrix *m) const { 114afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 11587319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 11687319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Attempting to get fixed function emulation matrix projection on user program"); 117383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 118383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 119064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.constants[0] == NULL) { 12087319de2b16a185cf360827c96a42cf1fcaae744Jason Sams rsc->setError(RS_ERROR_FATAL_UNKNOWN, 12187319de2b16a185cf360827c96a42cf1fcaae744Jason Sams "Unable to get fixed function emulation matrix projection because allocation is missing"); 122e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 123e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 124a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 12595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk memcpy(m, &f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], sizeof(rsc_Matrix)); 12695333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 12795333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 128afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertex::transformToScreen(Context *rsc, float *v4out, const float *v3in) const { 129afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 130e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 131e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 132a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk float *f = static_cast<float *>(mHal.state.constants[0]->getPtr()); 13387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams Matrix4x4 mvp; 13487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams mvp.loadMultiply((Matrix4x4 *)&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], 13587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams (Matrix4x4 *)&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]); 1363a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams mvp.vectorMultiply(v4out, v3in); 1373a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams} 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 139e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid ProgramVertex::serialize(Context *rsc, OStream *stream) const { 140fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 141fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 142afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertex *ProgramVertex::createFromStream(Context *rsc, IStream *stream) { 143fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 144fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 145fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1464815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 147c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams/////////////////////////////////////////////////////////////////////// 148c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 149afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertexState::ProgramVertexState() { 150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 152afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramVertexState::~ProgramVertexState() { 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 155afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertexState::init(Context *rsc) { 156c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> matrixElem = Element::createRef(rsc, RS_TYPE_MATRIX_4X4, 157c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RS_KIND_USER, false, 1); 158c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> f2Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32, 159c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RS_KIND_USER, false, 2); 160c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> f3Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32, 161c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RS_KIND_USER, false, 3); 162c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> f4Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32, 163c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RS_KIND_USER, false, 4); 164c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 165c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Element::Builder constBuilder; 166c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk constBuilder.add(matrixElem.get(), "MV", 1); 167c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk constBuilder.add(matrixElem.get(), "P", 1); 168c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk constBuilder.add(matrixElem.get(), "TexMatrix", 1); 169c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk constBuilder.add(matrixElem.get(), "MVP", 1); 170c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> constInput = constBuilder.create(rsc); 171c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 172c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Element::Builder inputBuilder; 173c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk inputBuilder.add(f4Elem.get(), "position", 1); 174c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk inputBuilder.add(f4Elem.get(), "color", 1); 175c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk inputBuilder.add(f3Elem.get(), "normal", 1); 176c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk inputBuilder.add(f2Elem.get(), "texture0", 1); 177c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<const Element> attrElem = inputBuilder.create(rsc); 178c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 179c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<Type> inputType = Type::getTypeRef(rsc, constInput.get(), 1, 0, 0, false, false); 180e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 181e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk String8 shaderString(RS_SHADER_INTERNAL); 182e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("varying vec4 varColor;\n"); 1837ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk shaderString.append("varying vec2 varTex0;\n"); 184e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("void main() {\n"); 185e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_Position = UNI_MVP * ATTRIB_position;\n"); 186e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_PointSize = 1.0;\n"); 187e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" varColor = ATTRIB_color;\n"); 188e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" varTex0 = ATTRIB_texture0;\n"); 189e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("}\n"); 190e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 19184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk uint32_t tmp[4]; 192e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[0] = RS_PROGRAM_PARAM_CONSTANT; 193c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk tmp[1] = (uint32_t)inputType.get(); 194e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[2] = RS_PROGRAM_PARAM_INPUT; 195c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk tmp[3] = (uint32_t)attrElem.get(); 196e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 197748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk ProgramVertex *pv = new ProgramVertex(rsc, shaderString.string(), shaderString.length(), 198748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk NULL, 0, NULL, tmp, 4); 199c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk Allocation *alloc = Allocation::createAllocation(rsc, inputType.get(), 200eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS); 201383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pv->bindAllocation(rsc, alloc, 0); 202fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2038ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefaultAlloc.set(alloc); 2048ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefault.set(pv); 205cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams 206771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams updateSize(rsc); 207e18844a5f648071fcc3594f84bca1728644af41aJason Sams} 208e18844a5f648071fcc3594f84bca1728644af41aJason Sams 209afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertexState::updateSize(Context *rsc) { 210e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk float *f = static_cast<float *>(mDefaultAlloc->getPtr()); 211e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 212a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk float surfaceWidth = (float)rsc->getCurrentSurfaceWidth(); 213a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk float surfaceHeight = (float)rsc->getCurrentSurfaceHeight(); 214a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk 21587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams Matrix4x4 m; 216a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk m.loadOrtho(0, surfaceWidth, surfaceHeight, 0, -1, 1); 217e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m.m, sizeof(m)); 218e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_MVP_OFFSET], m.m, sizeof(m)); 2198ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams 2208ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams m.loadIdentity(); 221e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m.m, sizeof(m)); 222e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m.m, sizeof(m)); 2238ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams} 224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 225afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramVertexState::deinit(Context *rsc) { 226f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefaultAlloc.clear(); 227f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefault.clear(); 228f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mLast.clear(); 229f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 230f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 231326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 232326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 233326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 235748eb07e805b93c2bf79340d4937963ab739d17cAlex SakhartchoukRsProgramVertex rsi_ProgramVertexCreate(Context *rsc, const char * shaderText, size_t shaderLength, 236748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char** textureNames, size_t textureNamesCount, 237748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const size_t *textureNamesLength, 238748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const uint32_t * params, size_t paramLength) { 239748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk ProgramVertex *pv = new ProgramVertex(rsc, shaderText, shaderLength, 240748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk textureNames, textureNamesCount, textureNamesLength, 241748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk params, paramLength); 2424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams pv->incUserRef(); 2434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return pv; 244b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams} 245326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 248