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
2011496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace android {
2111496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace renderscript {
225fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
235b9f3e2e5fe85e6defb424c6f96ddeab1581222cJason SamsProgramRaster::ProgramRaster(Context *rsc, bool pointSprite, RsCullMode cull)
247f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk    : ProgramBase(rsc) {
25afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
26721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    memset(&mHal, 0, sizeof(mHal));
27721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.pointSprite = pointSprite;
28721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.cull = cull;
29721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    rsc->mHal.funcs.raster.init(rsc, this);
30d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk}
31d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk
32c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid ProgramRaster::preDestroy() const {
3382e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang    auto& rasterPrograms = mRSC->mStateRaster.mRasterPrograms;
3482e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang    for (uint32_t ct = 0; ct < rasterPrograms.size(); ct++) {
3582e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang        if (rasterPrograms[ct] == this) {
3682e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang            rasterPrograms.erase(rasterPrograms.begin() + ct);
37b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni            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) {
6044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    return nullptr;
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();
9782e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang    rsc->mStateRaster.mRasterPrograms.push_back(pr);
98c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncUnlock();
99c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
100c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return returnRef;
101c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk}
102c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
1035b9f3e2e5fe85e6defb424c6f96ddeab1581222cJason SamsRsProgramRaster rsi_ProgramRasterCreate(Context * rsc, bool pointSprite, RsCullMode cull) {
1045b9f3e2e5fe85e6defb424c6f96ddeab1581222cJason Sams    ObjectBaseRef<ProgramRaster> pr = ProgramRaster::getProgramRaster(rsc, pointSprite, cull);
1055fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams    pr->incUserRef();
106c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return pr.get();
1075fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams}
1085fd09d847586f9680b4f495413b6ca5fbb69af6eJason Sams
10911496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace renderscript
11011496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace android
111