rsProgramStore.cpp revision f2649a961db2995e9e24a6c98f8a419f1496c1b7
1/* 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" 18#include "rsProgramFragmentStore.h" 19 20#include <GLES/gl.h> 21#include <GLES/glext.h> 22 23using namespace android; 24using namespace android::renderscript; 25 26 27ProgramFragmentStore::ProgramFragmentStore(Context *rsc, Element *in, Element *out) : 28 Program(rsc, in, out) 29{ 30 mAllocFile = __FILE__; 31 mAllocLine = __LINE__; 32 mDitherEnable = true; 33 mBlendEnable = false; 34 mColorRWriteEnable = true; 35 mColorGWriteEnable = true; 36 mColorBWriteEnable = true; 37 mColorAWriteEnable = true; 38 mBlendSrc = GL_ONE; 39 mBlendDst = GL_ZERO; 40 41 42 mDepthTestEnable = false; 43 mDepthWriteEnable = true; 44 mDepthFunc = GL_LESS; 45 46 47} 48 49ProgramFragmentStore::~ProgramFragmentStore() 50{ 51} 52 53void ProgramFragmentStore::setupGL(const Context *rsc, ProgramFragmentStoreState *state) 54{ 55 if (state->mLast.get() == this) { 56 return; 57 } 58 state->mLast.set(this); 59 60 glColorMask(mColorRWriteEnable, 61 mColorGWriteEnable, 62 mColorBWriteEnable, 63 mColorAWriteEnable); 64 if (mBlendEnable) { 65 glEnable(GL_BLEND); 66 glBlendFunc(mBlendSrc, mBlendDst); 67 } else { 68 glDisable(GL_BLEND); 69 } 70 71 //LOGE("pfs %i, %i, %x", mDepthWriteEnable, mDepthTestEnable, mDepthFunc); 72 73 glDepthMask(mDepthWriteEnable); 74 if(mDepthTestEnable || mDepthWriteEnable) { 75 glEnable(GL_DEPTH_TEST); 76 glDepthFunc(mDepthFunc); 77 } else { 78 glDisable(GL_DEPTH_TEST); 79 } 80 81 if (mDitherEnable) { 82 glEnable(GL_DITHER); 83 } else { 84 glDisable(GL_DITHER); 85 } 86 87 88} 89 90void ProgramFragmentStore::setDitherEnable(bool enable) 91{ 92 mDitherEnable = enable; 93} 94 95void ProgramFragmentStore::setDepthFunc(RsDepthFunc func) 96{ 97 mDepthTestEnable = true; 98 99 switch(func) { 100 case RS_DEPTH_FUNC_ALWAYS: 101 mDepthTestEnable = false; 102 mDepthFunc = GL_ALWAYS; 103 break; 104 case RS_DEPTH_FUNC_LESS: 105 mDepthFunc = GL_LESS; 106 break; 107 case RS_DEPTH_FUNC_LEQUAL: 108 mDepthFunc = GL_LEQUAL; 109 break; 110 case RS_DEPTH_FUNC_GREATER: 111 mDepthFunc = GL_GREATER; 112 break; 113 case RS_DEPTH_FUNC_GEQUAL: 114 mDepthFunc = GL_GEQUAL; 115 break; 116 case RS_DEPTH_FUNC_EQUAL: 117 mDepthFunc = GL_EQUAL; 118 break; 119 case RS_DEPTH_FUNC_NOTEQUAL: 120 mDepthFunc = GL_NOTEQUAL; 121 break; 122 } 123} 124 125void ProgramFragmentStore::setDepthMask(bool mask) 126{ 127 mDepthWriteEnable = mask; 128} 129 130void ProgramFragmentStore::setBlendFunc(RsBlendSrcFunc src, RsBlendDstFunc dst) 131{ 132 mBlendEnable = true; 133 if ((src == RS_BLEND_SRC_ONE) && 134 (dst == RS_BLEND_DST_ZERO)) { 135 mBlendEnable = false; 136 } 137 138 switch(src) { 139 case RS_BLEND_SRC_ZERO: 140 mBlendSrc = GL_ZERO; 141 break; 142 case RS_BLEND_SRC_ONE: 143 mBlendSrc = GL_ONE; 144 break; 145 case RS_BLEND_SRC_DST_COLOR: 146 mBlendSrc = GL_DST_COLOR; 147 break; 148 case RS_BLEND_SRC_ONE_MINUS_DST_COLOR: 149 mBlendSrc = GL_ONE_MINUS_DST_COLOR; 150 break; 151 case RS_BLEND_SRC_SRC_ALPHA: 152 mBlendSrc = GL_SRC_ALPHA; 153 break; 154 case RS_BLEND_SRC_ONE_MINUS_SRC_ALPHA: 155 mBlendSrc = GL_ONE_MINUS_SRC_ALPHA; 156 break; 157 case RS_BLEND_SRC_DST_ALPHA: 158 mBlendSrc = GL_DST_ALPHA; 159 break; 160 case RS_BLEND_SRC_ONE_MINUS_DST_ALPHA: 161 mBlendSrc = GL_ONE_MINUS_DST_ALPHA; 162 break; 163 case RS_BLEND_SRC_SRC_ALPHA_SATURATE: 164 mBlendSrc = GL_SRC_ALPHA_SATURATE; 165 break; 166 } 167 168 switch(dst) { 169 case RS_BLEND_DST_ZERO: 170 mBlendDst = GL_ZERO; 171 break; 172 case RS_BLEND_DST_ONE: 173 mBlendDst = GL_ONE; 174 break; 175 case RS_BLEND_DST_SRC_COLOR: 176 mBlendDst = GL_SRC_COLOR; 177 break; 178 case RS_BLEND_DST_ONE_MINUS_SRC_COLOR: 179 mBlendDst = GL_ONE_MINUS_SRC_COLOR; 180 break; 181 case RS_BLEND_DST_SRC_ALPHA: 182 mBlendDst = GL_SRC_ALPHA; 183 break; 184 case RS_BLEND_DST_ONE_MINUS_SRC_ALPHA: 185 mBlendDst = GL_ONE_MINUS_SRC_ALPHA; 186 break; 187 case RS_BLEND_DST_DST_ALPHA: 188 mBlendDst = GL_DST_ALPHA; 189 break; 190 case RS_BLEND_DST_ONE_MINUS_DST_ALPHA: 191 mBlendDst = GL_ONE_MINUS_DST_ALPHA; 192 break; 193 } 194} 195 196void ProgramFragmentStore::setColorMask(bool r, bool g, bool b, bool a) 197{ 198 mColorRWriteEnable = r; 199 mColorGWriteEnable = g; 200 mColorBWriteEnable = b; 201 mColorAWriteEnable = a; 202} 203 204 205ProgramFragmentStoreState::ProgramFragmentStoreState() 206{ 207 mPFS = NULL; 208} 209 210ProgramFragmentStoreState::~ProgramFragmentStoreState() 211{ 212 delete mPFS; 213 214} 215 216void ProgramFragmentStoreState::init(Context *rsc, int32_t w, int32_t h) 217{ 218 ProgramFragmentStore *pfs = new ProgramFragmentStore(rsc, NULL, NULL); 219 mDefault.set(pfs); 220} 221 222void ProgramFragmentStoreState::deinit(Context *rsc) 223{ 224 mDefault.clear(); 225 mLast.clear(); 226} 227 228 229namespace android { 230namespace renderscript { 231 232void rsi_ProgramFragmentStoreBegin(Context * rsc, RsElement in, RsElement out) 233{ 234 delete rsc->mStateFragmentStore.mPFS; 235 rsc->mStateFragmentStore.mPFS = new ProgramFragmentStore(rsc, (Element *)in, (Element *)out); 236 237} 238 239void rsi_ProgramFragmentStoreDepthFunc(Context *rsc, RsDepthFunc func) 240{ 241 rsc->mStateFragmentStore.mPFS->setDepthFunc(func); 242} 243 244void rsi_ProgramFragmentStoreDepthMask(Context *rsc, bool mask) 245{ 246 rsc->mStateFragmentStore.mPFS->setDepthMask(mask); 247} 248 249void rsi_ProgramFragmentStoreColorMask(Context *rsc, bool r, bool g, bool b, bool a) 250{ 251 rsc->mStateFragmentStore.mPFS->setColorMask(r, g, b, a); 252} 253 254void rsi_ProgramFragmentStoreBlendFunc(Context *rsc, RsBlendSrcFunc src, RsBlendDstFunc dst) 255{ 256 rsc->mStateFragmentStore.mPFS->setBlendFunc(src, dst); 257} 258 259RsProgramFragmentStore rsi_ProgramFragmentStoreCreate(Context *rsc) 260{ 261 ProgramFragmentStore *pfs = rsc->mStateFragmentStore.mPFS; 262 pfs->incUserRef(); 263 rsc->mStateFragmentStore.mPFS = 0; 264 return pfs; 265} 266 267void rsi_ProgramFragmentStoreDither(Context *rsc, bool enable) 268{ 269 rsc->mStateFragmentStore.mPFS->setDitherEnable(enable); 270} 271 272 273} 274} 275