rsProgramFragment.cpp revision c19ff0177a7a0dadfc01b1990f822354fdc95991
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 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h" 18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsProgramFragment.h" 191aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 23f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason SamsProgramFragment::ProgramFragment(Context *rsc, const char * shaderText, 24f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams uint32_t shaderLength, const uint32_t * params, 25afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t paramLength) 26afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk : Program(rsc, shaderText, shaderLength, params, paramLength) { 276445e5210c6d7f8689e94be9026153d017c9545bJason Sams mConstantColor[0] = 1.f; 286445e5210c6d7f8689e94be9026153d017c9545bJason Sams mConstantColor[1] = 1.f; 296445e5210c6d7f8689e94be9026153d017c9545bJason Sams mConstantColor[2] = 1.f; 306445e5210c6d7f8689e94be9026153d017c9545bJason Sams mConstantColor[3] = 1.f; 316445e5210c6d7f8689e94be9026153d017c9545bJason Sams 32a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.fragment.init(mRSC, this, mUserShader.string(), mUserShader.length()); 33f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams} 34f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams 35afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramFragment::~ProgramFragment() { 36a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.fragment.destroy(mRSC, this); 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 39afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramFragment::setConstantColor(Context *rsc, float r, float g, float b, float a) { 40afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isUserProgram()) { 41383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Attempting to set fixed function emulation color on user program"); 42383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Cannot set fixed function emulation color on user program"); 43383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return; 44383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 45a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (mHal.state.constants[0].get() == NULL) { 46383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("Unable to set fixed function emulation color because allocation is missing"); 47383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "Unable to set fixed function emulation color because allocation is missing"); 48e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return; 49e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk } 506445e5210c6d7f8689e94be9026153d017c9545bJason Sams mConstantColor[0] = r; 516445e5210c6d7f8689e94be9026153d017c9545bJason Sams mConstantColor[1] = g; 526445e5210c6d7f8689e94be9026153d017c9545bJason Sams mConstantColor[2] = b; 536445e5210c6d7f8689e94be9026153d017c9545bJason Sams mConstantColor[3] = a; 54a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk memcpy(mHal.state.constants[0]->getPtr(), mConstantColor, 4*sizeof(float)); 556445e5210c6d7f8689e94be9026153d017c9545bJason Sams mDirty = true; 566445e5210c6d7f8689e94be9026153d017c9545bJason Sams} 57334fd9aeacd4221fc8cd1333b2a34fb3b26b3a0dJason Sams 58c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchoukvoid ProgramFragment::setup(Context *rsc, ProgramFragmentState *state) { 59c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if ((state->mLast.get() == this) && !mDirty) { 60e64c2f172516972abe581ca1b762302dd2ba1199Jason Sams return; 61c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 62c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams state->mLast.set(this); 63c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct=0; ct < mHal.state.texturesCount; ct++) { 65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (!mHal.state.textures[ct].get()) { 66383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGE("No texture bound for shader id %u, texture unit %u", (uint)this, ct); 67383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk rsc->setError(RS_ERROR_BAD_SHADER, "No texture bound"); 68c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams continue; 69c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 70a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.textures[ct]->uploadCheck(rsc); 71383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 726e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk 73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsc->mHal.funcs.fragment.setActive(rsc, this); 74c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 76afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramFragment::serialize(OStream *stream) const { 77fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 78fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 79afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramFragment *ProgramFragment::createFromStream(Context *rsc, IStream *stream) { 80fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 81fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 82fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 83afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramFragmentState::ProgramFragmentState() { 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mPF = NULL; 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 87afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramFragmentState::~ProgramFragmentState() { 88225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams ObjectBase::checkDelete(mPF); 89225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams mPF = NULL; 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 92afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramFragmentState::init(Context *rsc) { 93e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk String8 shaderString(RS_SHADER_INTERNAL); 94e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("varying lowp vec4 varColor;\n"); 957ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk shaderString.append("varying vec2 varTex0;\n"); 96e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("void main() {\n"); 97e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" lowp vec4 col = UNI_Color;\n"); 98e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append(" gl_FragColor = col;\n"); 99e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk shaderString.append("}\n"); 100e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 101e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *colorElem = Element::create(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4); 102e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderBegin(); 103e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk rsc->mStateElement.elementBuilderAdd(colorElem, "Color", 1); 104e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const Element *constInput = rsc->mStateElement.elementBuilderCreate(rsc); 105e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 106f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams Type *inputType = Type::getType(rsc, constInput, 1, 0, 0, false, false); 107e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 10884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk uint32_t tmp[2]; 109e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[0] = RS_PROGRAM_PARAM_CONSTANT; 110e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk tmp[1] = (uint32_t)inputType; 111e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 112366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Allocation *constAlloc = new Allocation(rsc, inputType, RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS); 113e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk ProgramFragment *pf = new ProgramFragment(rsc, shaderString.string(), 11484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk shaderString.length(), tmp, 2); 115383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->bindAllocation(rsc, constAlloc, 0); 116383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, 1.0f, 1.0f, 1.0f, 1.0f); 117e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 1188ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams mDefault.set(pf); 1198ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams} 120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 121afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramFragmentState::deinit(Context *rsc) { 122f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefault.clear(); 123f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mLast.clear(); 124f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 125f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 126326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 127326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 129383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex SakhartchoukRsProgramFragment rsi_ProgramFragmentCreate(Context *rsc, const char * shaderText, 130f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams uint32_t shaderLength, const uint32_t * params, 131afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t paramLength) { 132f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength, params, paramLength); 133f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams pf->incUserRef(); 134383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk //LOGE("rsi_ProgramFragmentCreate %p", pf); 135f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams return pf; 136f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams} 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 141