blob: 945b5eca68fddb629a15a5d017733050c2ae9b3c [file] [log] [blame]
Jason Sams5fd09d82009-09-23 13:57:02 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "rsContext.h"
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070018#include "rsProgramRaster.h"
Jason Sams5fd09d82009-09-23 13:57:02 -070019
20using namespace android;
21using namespace android::renderscript;
22
23
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080024ProgramRaster::ProgramRaster(Context *rsc, bool pointSmooth,
Jason Sams721acc42011-04-06 11:23:54 -070025 bool lineSmooth, bool pointSprite,
26 float lineWidth, RsCullMode cull)
Alex Sakhartchouk7f126c72011-05-05 16:56:27 -070027 : ProgramBase(rsc) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080028
Jason Sams721acc42011-04-06 11:23:54 -070029 memset(&mHal, 0, sizeof(mHal));
30
31 mHal.state.pointSmooth = pointSmooth;
32 mHal.state.lineSmooth = lineSmooth;
33 mHal.state.pointSprite = pointSprite;
34 mHal.state.lineWidth = lineWidth;
35 mHal.state.cull = cull;
36
37 rsc->mHal.funcs.raster.init(rsc, this);
Jason Sams5fd09d82009-09-23 13:57:02 -070038}
39
Alex Sakhartchoukc700e642011-08-16 13:09:46 -070040void ProgramRaster::preDestroy() const {
41 for (uint32_t ct = 0; ct < mRSC->mStateRaster.mRasterPrograms.size(); ct++) {
42 if (mRSC->mStateRaster.mRasterPrograms[ct] == this) {
43 mRSC->mStateRaster.mRasterPrograms.removeAt(ct);
44 break;
45 }
46 }
47}
48
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080049ProgramRaster::~ProgramRaster() {
Jason Sams721acc42011-04-06 11:23:54 -070050 mRSC->mHal.funcs.raster.destroy(mRSC, this);
Jason Sams5fd09d82009-09-23 13:57:02 -070051}
52
Jason Sams721acc42011-04-06 11:23:54 -070053void ProgramRaster::setup(const Context *rsc, ProgramRasterState *state) {
Alex Sakhartchoukd18c7442010-07-12 15:50:32 -070054 if (state->mLast.get() == this && !mDirty) {
Jason Samsc460e552009-11-25 13:22:07 -080055 return;
56 }
57 state->mLast.set(this);
Alex Sakhartchoukd18c7442010-07-12 15:50:32 -070058 mDirty = false;
59
Jason Sams721acc42011-04-06 11:23:54 -070060 rsc->mHal.funcs.raster.setActive(rsc, this);
Jason Samsc460e552009-11-25 13:22:07 -080061}
62
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080063void ProgramRaster::serialize(OStream *stream) const {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070064}
Jason Sams5fd09d82009-09-23 13:57:02 -070065
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080066ProgramRaster *ProgramRaster::createFromStream(Context *rsc, IStream *stream) {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070067 return NULL;
68}
Jason Sams5fd09d82009-09-23 13:57:02 -070069
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080070ProgramRasterState::ProgramRasterState() {
Jason Sams5fd09d82009-09-23 13:57:02 -070071}
72
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080073ProgramRasterState::~ProgramRasterState() {
Jason Sams5fd09d82009-09-23 13:57:02 -070074}
75
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080076void ProgramRasterState::init(Context *rsc) {
Alex Sakhartchoukc700e642011-08-16 13:09:46 -070077 mDefault.set(ProgramRaster::getProgramRaster(rsc, false, false,
78 false, 1.f, RS_CULL_BACK).get());
Jason Sams5fd09d82009-09-23 13:57:02 -070079}
80
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080081void ProgramRasterState::deinit(Context *rsc) {
Jason Samsf2649a92009-09-25 16:37:33 -070082 mDefault.clear();
83 mLast.clear();
84}
85
Alex Sakhartchoukc700e642011-08-16 13:09:46 -070086ObjectBaseRef<ProgramRaster> ProgramRaster::getProgramRaster(Context *rsc,
87 bool pointSmooth,
88 bool lineSmooth,
89 bool pointSprite,
90 float lineWidth,
91 RsCullMode cull) {
92 ObjectBaseRef<ProgramRaster> returnRef;
93 ObjectBase::asyncLock();
94 for (uint32_t ct = 0; ct < rsc->mStateRaster.mRasterPrograms.size(); ct++) {
95 ProgramRaster *existing = rsc->mStateRaster.mRasterPrograms[ct];
96 if (existing->mHal.state.pointSmooth != pointSmooth) continue;
97 if (existing->mHal.state.lineSmooth != lineSmooth) continue;
98 if (existing->mHal.state.pointSprite != pointSprite) continue;
99 if (existing->mHal.state.lineWidth != lineWidth) continue;
100 if (existing->mHal.state.cull != cull) continue;
101 returnRef.set(existing);
102 ObjectBase::asyncUnlock();
103 return returnRef;
104 }
105 ObjectBase::asyncUnlock();
106
107 ProgramRaster *pr = new ProgramRaster(rsc, pointSmooth,
108 lineSmooth, pointSprite, lineWidth, cull);
109 returnRef.set(pr);
110
111 ObjectBase::asyncLock();
112 rsc->mStateRaster.mRasterPrograms.push(pr);
113 ObjectBase::asyncUnlock();
114
115 return returnRef;
116}
117
Jason Sams5fd09d82009-09-23 13:57:02 -0700118namespace android {
119namespace renderscript {
120
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700121RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, bool pointSmooth, bool lineSmooth,
122 bool pointSprite, float lineWidth, RsCullMode cull) {
123 ObjectBaseRef<ProgramRaster> pr = ProgramRaster::getProgramRaster(rsc, pointSmooth, lineSmooth,
124 pointSprite, lineWidth, cull);
Jason Sams5fd09d82009-09-23 13:57:02 -0700125 pr->incUserRef();
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700126 return pr.get();
Jason Sams5fd09d82009-09-23 13:57:02 -0700127}
128
Jason Sams5fd09d82009-09-23 13:57:02 -0700129}
130}
131