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 "rsProgramStore.h" 191aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 2011496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace android { 2111496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace renderscript { 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 23721acc495b859c6d884725a4f9b5523583dd11c7Jason SamsProgramStore::ProgramStore(Context *rsc, 24721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams bool colorMaskR, bool colorMaskG, bool colorMaskB, bool colorMaskA, 25721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams bool depthMask, bool ditherEnable, 26721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc, 277f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk RsDepthFunc depthFunc) : ProgramBase(rsc) { 288feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams memset(&mHal, 0, sizeof(mHal)); 298feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams 30721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams mHal.state.ditherEnable = ditherEnable; 318feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams 32721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams mHal.state.colorRWriteEnable = colorMaskR; 33721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams mHal.state.colorGWriteEnable = colorMaskG; 34721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams mHal.state.colorBWriteEnable = colorMaskB; 35721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams mHal.state.colorAWriteEnable = colorMaskA; 36721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams mHal.state.blendSrc = srcFunc; 37721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams mHal.state.blendDst = destFunc; 388feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams 39721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams mHal.state.depthWriteEnable = depthMask; 40721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams mHal.state.depthFunc = depthFunc; 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 43c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid ProgramStore::preDestroy() const { 4482e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang auto& storePrograms = mRSC->mStateFragmentStore.mStorePrograms; 4582e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang for (uint32_t ct = 0; ct < storePrograms.size(); ct++) { 4682e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang if (storePrograms[ct] == this) { 4782e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang storePrograms.erase(storePrograms.begin() + ct); 48b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni break; 49c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 50c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 51c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk} 52c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 53afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramStore::~ProgramStore() { 548feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams mRSC->mHal.funcs.store.destroy(mRSC, this); 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 57721acc495b859c6d884725a4f9b5523583dd11c7Jason Samsvoid ProgramStore::setup(const Context *rsc, ProgramStoreState *state) { 58c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams if (state->mLast.get() == this) { 59c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams return; 60c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams } 61c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams state->mLast.set(this); 62c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 638feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams rsc->mHal.funcs.store.setActive(rsc, this); 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 66e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid ProgramStore::serialize(Context *rsc, OStream *stream) const { 67fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 68fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 69afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramStore *ProgramStore::createFromStream(Context *rsc, IStream *stream) { 7044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 71fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 72fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 738feea4e0dec48ea03bd6d32706d058b86dddc5baJason Samsvoid ProgramStore::init() { 748feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams mRSC->mHal.funcs.store.init(mRSC, this); 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 77afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramStoreState::ProgramStoreState() { 78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 80afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukProgramStoreState::~ProgramStoreState() { 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 83c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex SakhartchoukObjectBaseRef<ProgramStore> ProgramStore::getProgramStore(Context *rsc, 84c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool colorMaskR, 85c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool colorMaskG, 86c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool colorMaskB, 87c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool colorMaskA, 88c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk bool depthMask, bool ditherEnable, 89c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsBlendSrcFunc srcFunc, 90c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsBlendDstFunc destFunc, 91c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RsDepthFunc depthFunc) { 92c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<ProgramStore> returnRef; 93c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 94c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk for (uint32_t ct = 0; ct < rsc->mStateFragmentStore.mStorePrograms.size(); ct++) { 95c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ProgramStore *existing = rsc->mStateFragmentStore.mStorePrograms[ct]; 96c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.ditherEnable != ditherEnable) continue; 97c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.colorRWriteEnable != colorMaskR) continue; 98c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.colorGWriteEnable != colorMaskG) continue; 99c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.colorBWriteEnable != colorMaskB) continue; 100c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.colorAWriteEnable != colorMaskA) continue; 101c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.blendSrc != srcFunc) continue; 102c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.blendDst != destFunc) continue; 103c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.depthWriteEnable != depthMask) continue; 104c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk if (existing->mHal.state.depthFunc != depthFunc) continue; 105c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 106c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(existing); 107c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 108c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 109c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk } 110c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 111c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 112c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ProgramStore *pfs = new ProgramStore(rsc, 113c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk colorMaskR, colorMaskG, colorMaskB, colorMaskA, 114c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk depthMask, ditherEnable, 115c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk srcFunc, destFunc, depthFunc); 116c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk returnRef.set(pfs); 117c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 118c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk pfs->init(); 119c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 120c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncLock(); 12182e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang rsc->mStateFragmentStore.mStorePrograms.push_back(pfs); 122c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBase::asyncUnlock(); 123c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 124c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return returnRef; 125c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk} 126c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 127c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 128c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 129afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramStoreState::init(Context *rsc) { 130c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk mDefault.set(ProgramStore::getProgramStore(rsc, 131c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk true, true, true, true, 132c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk true, true, 133c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RS_BLEND_SRC_ONE, RS_BLEND_DST_ZERO, 134c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk RS_DEPTH_FUNC_LESS).get()); 1358ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams} 1368ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams 137afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid ProgramStoreState::deinit(Context *rsc) { 138f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mDefault.clear(); 139f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mLast.clear(); 140f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams} 141f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams 1428feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams 143721acc495b859c6d884725a4f9b5523583dd11c7Jason SamsRsProgramStore rsi_ProgramStoreCreate(Context *rsc, 144721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams bool colorMaskR, bool colorMaskG, bool colorMaskB, bool colorMaskA, 145721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams bool depthMask, bool ditherEnable, 146721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc, 147721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams RsDepthFunc depthFunc) { 148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 149c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk 150c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<ProgramStore> ps = ProgramStore::getProgramStore(rsc, 151c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk colorMaskR, colorMaskG, 152c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk colorMaskB, colorMaskA, 153c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk depthMask, ditherEnable, 154c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk srcFunc, destFunc, depthFunc); 155c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ps->incUserRef(); 156c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk return ps.get(); 157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 15911496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace renderscript 16011496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace android 161