rsSampler.cpp revision 4b962e57a9a1fa923283f2d76855c1c68449564f
1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/* 2d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Copyright (C) 2009 The Android Open Source Project 3d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * you may not use this file except in compliance with the License. 6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * You may obtain a copy of the License at 7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Unless required by applicable law or agreed to in writing, software 11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * See the License for the specific language governing permissions and 14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * limitations under the License. 15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams */ 16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <GLES/gl.h> 18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include <GLES/glext.h> 19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 20d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsContext.h" 21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsSampler.h" 22d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 234b962e57a9a1fa923283f2d76855c1c68449564fJason Sams 24d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android; 25d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android::renderscript; 26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 28d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsSampler::Sampler() 29d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 30d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams // Should not get called. 31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams rsAssert(0); 32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 34d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsSampler::Sampler(RsSamplerValue magFilter, 35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams RsSamplerValue minFilter, 36d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams RsSamplerValue wrapS, 37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams RsSamplerValue wrapT, 38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams RsSamplerValue wrapR) 39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 40d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mMagFilter = magFilter; 41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mMinFilter = minFilter; 42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mWrapS = wrapS; 43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mWrapT = wrapT; 44d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mWrapR = wrapR; 45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 47d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsSampler::~Sampler() 48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 51d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Sampler::setupGL() 52d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 53243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams GLenum trans[] = { 5402fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams GL_NEAREST, //RS_SAMPLER_NEAREST, 5502fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams GL_LINEAR, //RS_SAMPLER_LINEAR, 56243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams GL_LINEAR_MIPMAP_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR, 57243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams GL_REPEAT, //RS_SAMPLER_WRAP, 58243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP 5902fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams 60243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams }; 6102fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams 6202fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams 63243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]); 64243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, trans[mMagFilter]); 65243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, trans[mWrapS]); 66243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, trans[mWrapT]); 67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 68d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 70d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Sampler::bindToContext(SamplerState *ss, uint32_t slot) 71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 72d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mSamplers[slot].set(this); 73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mBoundSlot = slot; 74d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 76d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Sampler::unbindFromContext(SamplerState *ss) 77d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 78d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int32_t slot = mBoundSlot; 79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mBoundSlot = -1; 80d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mSamplers[slot].clear(); 81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 83d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid SamplerState::setupGL() 84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 8502fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams for (uint32_t ct=0; ct < RS_MAX_SAMPLER_SLOT; ct++) { 86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams Sampler *s = mSamplers[ct].get(); 87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (s) { 88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams s->setupGL(); 89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } else { 90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams glBindTexture(GL_TEXTURE_2D, 0); 91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 93d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams//////////////////////////////// 96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 97d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android { 98d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript { 99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 100d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 101d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_SamplerBegin(Context *rsc) 102d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 103d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams SamplerState * ss = &rsc->mStateSampler; 104d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mMagFilter = RS_SAMPLER_LINEAR; 106d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mMinFilter = RS_SAMPLER_LINEAR; 107d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapS = RS_SAMPLER_WRAP; 108d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapT = RS_SAMPLER_WRAP; 109d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapR = RS_SAMPLER_WRAP; 110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 112d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_SamplerSet(Context *rsc, RsSamplerParam param, RsSamplerValue value) 113d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 114d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams SamplerState * ss = &rsc->mStateSampler; 115d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 116d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams switch(param) { 117d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_SAMPLER_MAG_FILTER: 118d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mMagFilter = value; 119d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_SAMPLER_MIN_FILTER: 121d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mMinFilter = value; 122d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_SAMPLER_WRAP_S: 124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapS = value; 125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_SAMPLER_WRAP_T: 127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapT = value; 128d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 129d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_SAMPLER_WRAP_R: 130d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapR = value; 131d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 134d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 135d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 136d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsRsSampler rsi_SamplerCreate(Context *rsc) 137d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 138d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams SamplerState * ss = &rsc->mStateSampler; 139d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 140d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 141d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams Sampler * s = new Sampler(ss->mMagFilter, 142d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mMinFilter, 143d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapS, 144d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapT, 145d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapR); 146d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return s; 147d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 148d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 14902fb2cb531035779a25dbf9595e0628ea40585b0Jason Samsvoid rsi_SamplerDestroy(Context *rsc, RsSampler vs) 15002fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams{ 15102fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams Sampler * s = static_cast<Sampler *>(vs); 15202fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams s->decRef(); 15302fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams 15402fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams} 15502fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams 15602fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams 157d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}} 158