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