rsProgramFragment.cpp revision 064aa7ed76db9564b041afcd4b75da5b3d12faba
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    }
45064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    if (mHal.state.constants[0] == 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++) {
65064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk        if (!mHal.state.textures[ct]) {
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        }
70383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
716e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk
72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    rsc->mHal.funcs.fragment.setActive(rsc, this);
73c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
75afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramFragment::serialize(OStream *stream) const {
76fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
77fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
78afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramFragment *ProgramFragment::createFromStream(Context *rsc, IStream *stream) {
79fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return NULL;
80fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
81fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
82afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramFragmentState::ProgramFragmentState() {
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPF = NULL;
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
86afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramFragmentState::~ProgramFragmentState() {
87225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    ObjectBase::checkDelete(mPF);
88225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    mPF = NULL;
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
91afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramFragmentState::init(Context *rsc) {
92e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    String8 shaderString(RS_SHADER_INTERNAL);
93e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    shaderString.append("varying lowp vec4 varColor;\n");
947ffcaf20cbb115326f3d72a983835d6c314a4cefAlex Sakhartchouk    shaderString.append("varying vec2 varTex0;\n");
95e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    shaderString.append("void main() {\n");
96e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    shaderString.append("  lowp vec4 col = UNI_Color;\n");
97e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    shaderString.append("  gl_FragColor = col;\n");
98e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    shaderString.append("}\n");
99e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
100c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<const Element> colorElem = Element::createRef(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4);
101c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    Element::Builder builder;
102c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    builder.add(colorElem.get(), "Color", 1);
103c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<const Element> constInput = builder.create(rsc);
104e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
105c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<Type> inputType = Type::getTypeRef(rsc, constInput.get(), 1, 0, 0, false, false);
106e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
10784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    uint32_t tmp[2];
108e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk    tmp[0] = RS_PROGRAM_PARAM_CONSTANT;
109c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    tmp[1] = (uint32_t)inputType.get();
110e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk
111c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    Allocation *constAlloc = Allocation::createAllocation(rsc, inputType.get(),
112eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams                              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,
130b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk                             size_t shaderLength, const uint32_t * params,
131b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk                             size_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