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
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
24721acc495b859c6d884725a4f9b5523583dd11c7Jason SamsProgramStore::ProgramStore(Context *rsc,
25721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams                           bool colorMaskR, bool colorMaskG, bool colorMaskB, bool colorMaskA,
26721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams                           bool depthMask, bool ditherEnable,
27721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams                           RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc,
287f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk                           RsDepthFunc depthFunc) : ProgramBase(rsc) {
298feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    memset(&mHal, 0, sizeof(mHal));
308feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
31721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.ditherEnable = ditherEnable;
328feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
33721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.colorRWriteEnable = colorMaskR;
34721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.colorGWriteEnable = colorMaskG;
35721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.colorBWriteEnable = colorMaskB;
36721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.colorAWriteEnable = colorMaskA;
37721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.blendSrc = srcFunc;
38721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.blendDst = destFunc;
398feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
40721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.depthWriteEnable = depthMask;
41721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    mHal.state.depthFunc = depthFunc;
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
44c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchoukvoid ProgramStore::preDestroy() const {
45b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    for (uint32_t ct = 0; ct < mRSC->mStateFragmentStore.mStorePrograms.size(); ct++) {
46b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni        if (mRSC->mStateFragmentStore.mStorePrograms[ct] == this) {
47b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni            mRSC->mStateFragmentStore.mStorePrograms.removeAt(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) {
58cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    if (state->mLast.get() == this) {
59cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams        return;
60cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    }
61cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    state->mLast.set(this);
62cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason 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();
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
112721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    ProgramStore *pfs = new ProgramStore(rsc,
113721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams                                         colorMaskR, colorMaskG, colorMaskB, colorMaskA,
114721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams                                         depthMask, ditherEnable,
115721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams                                         srcFunc, destFunc, depthFunc);
116c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    returnRef.set(pfs);
117c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
118c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    pfs->init();
119c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
120c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBase::asyncLock();
121b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    rsc->mStateFragmentStore.mStorePrograms.push(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
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
146721acc495b859c6d884725a4f9b5523583dd11c7Jason SamsRsProgramStore rsi_ProgramStoreCreate(Context *rsc,
147721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams                                      bool colorMaskR, bool colorMaskG, bool colorMaskB, bool colorMaskA,
148721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams                                      bool depthMask, bool ditherEnable,
149721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams                                      RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc,
150721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams                                      RsDepthFunc depthFunc) {
151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
152c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk
153c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<ProgramStore> ps = ProgramStore::getProgramStore(rsc,
154c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                                                   colorMaskR, colorMaskG,
155c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                                                   colorMaskB, colorMaskA,
156c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                                                   depthMask, ditherEnable,
157c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk                                                                   srcFunc, destFunc, depthFunc);
158c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ps->incUserRef();
159c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    return ps.get();
160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
164