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