rsSampler.cpp revision f9954c7eabfcbcae113a1efb8d3c525a725273b1
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 28a9e7a05b84470257637c97d65f6562aa832c66efJason SamsSampler::Sampler(Context *rsc) : ObjectBase(rsc) 29d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 3061f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844Jason Sams mAllocFile = __FILE__; 3161f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844Jason Sams mAllocLine = __LINE__; 32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams // Should not get called. 33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams rsAssert(0); 34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 36a9e7a05b84470257637c97d65f6562aa832c66efJason SamsSampler::Sampler(Context *rsc, 37a9e7a05b84470257637c97d65f6562aa832c66efJason Sams RsSamplerValue magFilter, 38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams RsSamplerValue minFilter, 39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams RsSamplerValue wrapS, 40d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams RsSamplerValue wrapT, 41a9e7a05b84470257637c97d65f6562aa832c66efJason Sams RsSamplerValue wrapR) : ObjectBase(rsc) 42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 4361f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844Jason Sams mAllocFile = __FILE__; 4461f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844Jason Sams mAllocLine = __LINE__; 45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mMagFilter = magFilter; 46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mMinFilter = minFilter; 47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mWrapS = wrapS; 48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mWrapT = wrapT; 49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mWrapR = wrapR; 50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 52d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsSampler::~Sampler() 53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 54d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 55d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 562978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Samsvoid Sampler::setupGL(const Context *rsc, bool npot) 57d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 58243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams GLenum trans[] = { 5902fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams GL_NEAREST, //RS_SAMPLER_NEAREST, 6002fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams GL_LINEAR, //RS_SAMPLER_LINEAR, 61243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams GL_LINEAR_MIPMAP_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR, 62243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams GL_REPEAT, //RS_SAMPLER_WRAP, 63243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP 6402fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams 65243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams }; 6602fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams 672978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams bool forceNonMip = false; 682978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams if (!rsc->ext_OES_texture_npot() && npot) { 692978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams forceNonMip = true; 702978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams } 712978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams 722978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams if ((mMinFilter == RS_SAMPLER_LINEAR_MIP_LINEAR) && forceNonMip) { 73f9954c7eabfcbcae113a1efb8d3c525a725273b1Mathias Agopian if (rsc->ext_GL_IMG_texture_npot()) { 74f9954c7eabfcbcae113a1efb8d3c525a725273b1Mathias Agopian glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 75f9954c7eabfcbcae113a1efb8d3c525a725273b1Mathias Agopian } else { 76f9954c7eabfcbcae113a1efb8d3c525a725273b1Mathias Agopian glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 77f9954c7eabfcbcae113a1efb8d3c525a725273b1Mathias Agopian } 782978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams } else { 792978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]); 802978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams } 81243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, trans[mMagFilter]); 82243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, trans[mWrapS]); 83243e3fbcf710115c5b4b61e1112e61cc2268478aJason Sams glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, trans[mWrapT]); 84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 852978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams 865dbfe93b3f15f3a837836d024958635fd8f9ad14Jason Sams rsc->checkError("ProgramFragment::setupGL2 tex env"); 87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 89d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Sampler::bindToContext(SamplerState *ss, uint32_t slot) 90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mSamplers[slot].set(this); 92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mBoundSlot = slot; 93d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 95d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Sampler::unbindFromContext(SamplerState *ss) 96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int32_t slot = mBoundSlot; 98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mBoundSlot = -1; 99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mSamplers[slot].clear(); 100d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 1015dbfe93b3f15f3a837836d024958635fd8f9ad14Jason Sams/* 102d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid SamplerState::setupGL() 103d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 10402fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams for (uint32_t ct=0; ct < RS_MAX_SAMPLER_SLOT; ct++) { 105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams Sampler *s = mSamplers[ct].get(); 106d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (s) { 1075dbfe93b3f15f3a837836d024958635fd8f9ad14Jason Sams s->setupGL(rsc); 108d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } else { 109d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams glBindTexture(GL_TEXTURE_2D, 0); 110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 1125dbfe93b3f15f3a837836d024958635fd8f9ad14Jason Sams}*/ 113d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 114d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams//////////////////////////////// 115d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 116d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android { 117d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript { 118d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 119d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 120d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_SamplerBegin(Context *rsc) 121d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 122d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams SamplerState * ss = &rsc->mStateSampler; 123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mMagFilter = RS_SAMPLER_LINEAR; 125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mMinFilter = RS_SAMPLER_LINEAR; 126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapS = RS_SAMPLER_WRAP; 127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapT = RS_SAMPLER_WRAP; 128d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapR = RS_SAMPLER_WRAP; 129d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 130d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 131d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_SamplerSet(Context *rsc, RsSamplerParam param, RsSamplerValue value) 132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams SamplerState * ss = &rsc->mStateSampler; 134d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 135d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams switch(param) { 136d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_SAMPLER_MAG_FILTER: 137d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mMagFilter = value; 138d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 139d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_SAMPLER_MIN_FILTER: 140d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mMinFilter = value; 141d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 142d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_SAMPLER_WRAP_S: 143d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapS = value; 144d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 145d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_SAMPLER_WRAP_T: 146d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapT = value; 147d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 148d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case RS_SAMPLER_WRAP_R: 149d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapR = value; 150d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 151d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 152d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 153d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 154d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 155d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsRsSampler rsi_SamplerCreate(Context *rsc) 156d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{ 157d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams SamplerState * ss = &rsc->mStateSampler; 158d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 159d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 160a9e7a05b84470257637c97d65f6562aa832c66efJason Sams Sampler * s = new Sampler(rsc, 161a9e7a05b84470257637c97d65f6562aa832c66efJason Sams ss->mMagFilter, 1627ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams ss->mMinFilter, 1637ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams ss->mWrapS, 164d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapT, 165d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ss->mWrapR); 16607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams s->incUserRef(); 167d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return s; 168d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 169d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 17002fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams 171d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}} 172