15fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams/*
25fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams * Copyright (C) 2009 The Android Open Source Project
35fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams *
45fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
55fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams * you may not use this file except in compliance with the License.
65fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams * You may obtain a copy of the License at
75fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams *
85fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
95fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams *
105fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams * Unless required by applicable law or agreed to in writing, software
115fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
125fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams * See the License for the specific language governing permissions and
145fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams * limitations under the License.
155fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams */
165fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
175fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams#include "rsContext.h"
18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsProgramRaster.h"
195fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
205fd09d847586f9680b4f495413b6ca5fbb69af6eJason Samsusing namespace android;
215fd09d847586f9680b4f495413b6ca5fbb69af6eJason Samsusing namespace android::renderscript;
225fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
235fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
245b9f3e2e5fe85e6defb424c6f96ddeab1581222cJason SamsProgramRaster::ProgramRaster(Context *rsc, bool pointSprite, RsCullMode cull)
257f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk    : ProgramBase(rsc) {
26afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
27721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    memset(&mHal, 0, sizeof(mHal));
28721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.pointSprite = pointSprite;
29721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.cull = cull;
30721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    rsc->mHal.funcs.raster.init(rsc, this);
31d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk}
32d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk
33c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid ProgramRaster::preDestroy() const {
34c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    for (uint32_t ct = 0; ct < mRSC->mStateRaster.mRasterPrograms.size(); ct++) {
35c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        if (mRSC->mStateRaster.mRasterPrograms[ct] == this) {
36c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            mRSC->mStateRaster.mRasterPrograms.removeAt(ct);
37c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk            break;
38c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        }
39c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    }
40c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk}
41c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
42721acc495b859c6d884725a4f9b5523583dd11c7Jason SamsProgramRaster::~ProgramRaster() {
43721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mRSC->mHal.funcs.raster.destroy(mRSC, this);
445fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams}
455fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
46721acc495b859c6d884725a4f9b5523583dd11c7Jason Samsvoid ProgramRaster::setup(const Context *rsc, ProgramRasterState *state) {
47d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    if (state->mLast.get() == this && !mDirty) {
48c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        return;
49c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
50c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    state->mLast.set(this);
51d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    mDirty = false;
52d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk
53721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    rsc->mHal.funcs.raster.setActive(rsc, this);
54c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
55c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
56e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid ProgramRaster::serialize(Context *rsc, OStream *stream) const {
57fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
585fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
59afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramRaster *ProgramRaster::createFromStream(Context *rsc, IStream *stream) {
60fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return NULL;
61fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
625fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
63afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramRasterState::ProgramRasterState() {
645fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams}
655fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
66afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramRasterState::~ProgramRasterState() {
675fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams}
685fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
69afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramRasterState::init(Context *rsc) {
705b9f3e2e5fe85e6defb424c6f96ddeab1581222cJason Sams    mDefault.set(ProgramRaster::getProgramRaster(rsc, false, RS_CULL_BACK).get());
715fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams}
725fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
73afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramRasterState::deinit(Context *rsc) {
74f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mDefault.clear();
75f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mLast.clear();
76f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams}
77f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
78c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<ProgramRaster> ProgramRaster::getProgramRaster(Context *rsc,
79c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                                             bool pointSprite,
80c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                                             RsCullMode cull) {
81c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<ProgramRaster> returnRef;
82c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
83c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    for (uint32_t ct = 0; ct < rsc->mStateRaster.mRasterPrograms.size(); ct++) {
84c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        ProgramRaster *existing = rsc->mStateRaster.mRasterPrograms[ct];
85c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        if (existing->mHal.state.pointSprite != pointSprite) continue;
86c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        if (existing->mHal.state.cull != cull) continue;
87c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        returnRef.set(existing);
88c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        ObjectBase::asyncUnlock();
89c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk        return returnRef;
90c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    }
91c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
925fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
935b9f3e2e5fe85e6defb424c6f96ddeab1581222cJason Sams    ProgramRaster *pr = new ProgramRaster(rsc, pointSprite, cull);
94c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    returnRef.set(pr);
95c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
96c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
97c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    rsc->mStateRaster.mRasterPrograms.push(pr);
98c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
99c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
100c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return returnRef;
101c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk}
102c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
103c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouknamespace android {
104c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouknamespace renderscript {
105c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
1065b9f3e2e5fe85e6defb424c6f96ddeab1581222cJason SamsRsProgramRaster rsi_ProgramRasterCreate(Context * rsc, bool pointSprite, RsCullMode cull) {
1075b9f3e2e5fe85e6defb424c6f96ddeab1581222cJason Sams    ObjectBaseRef<ProgramRaster> pr = ProgramRaster::getProgramRaster(rsc, pointSprite, cull);
1085fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams    pr->incUserRef();
109c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return pr.get();
1105fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams}
1115fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
1125fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams}
1135fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams}
1145fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
115