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