rsSampler.cpp revision 9397e30ce5fe3f6af9212a93b490836b04fdfffa
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include <GLES/gl.h>
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include <GLES/glext.h>
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h"
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsSampler.h"
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
231aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
28326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsSampler::Sampler()
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // Should not get called.
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(0);
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
34326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsSampler::Sampler(RsSamplerValue magFilter,
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                 RsSamplerValue minFilter,
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                 RsSamplerValue wrapS,
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                 RsSamplerValue wrapT,
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                 RsSamplerValue wrapR)
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mMagFilter = magFilter;
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mMinFilter = minFilter;
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mWrapS = wrapS;
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mWrapT = wrapT;
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mWrapR = wrapR;
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
47326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsSampler::~Sampler()
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Sampler::setupGL()
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
532f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams    GLenum trans[] = {
5439c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams        GL_NEAREST, //RS_SAMPLER_NEAREST,
5539c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams        GL_LINEAR, //RS_SAMPLER_LINEAR,
562f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams        GL_LINEAR_MIPMAP_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
572f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams        GL_REPEAT, //RS_SAMPLER_WRAP,
582f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams        GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP
5939c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams
602f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams    };
6139c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams
6239c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams
632f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, trans[mMinFilter]);
642f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, trans[mMagFilter]);
652f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, trans[mWrapS]);
662f2898ca6753c787484b3ab0e4323db410e0cd22Jason Sams    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, trans[mWrapT]);
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Sampler::bindToContext(SamplerState *ss, uint32_t slot)
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mSamplers[slot].set(this);
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mBoundSlot = slot;
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Sampler::unbindFromContext(SamplerState *ss)
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int32_t slot = mBoundSlot;
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mBoundSlot = -1;
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mSamplers[slot].clear();
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid SamplerState::setupGL()
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
8539c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams    for (uint32_t ct=0; ct < RS_MAX_SAMPLER_SLOT; ct++) {
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        Sampler *s = mSamplers[ct].get();
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        if (s) {
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            s->setupGL();
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        } else {
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            glBindTexture(GL_TEXTURE_2D, 0);
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams////////////////////////////////
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_SamplerBegin(Context *rsc)
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    SamplerState * ss = &rsc->mStateSampler;
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mMagFilter = RS_SAMPLER_LINEAR;
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mMinFilter = RS_SAMPLER_LINEAR;
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mWrapS = RS_SAMPLER_WRAP;
108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mWrapT = RS_SAMPLER_WRAP;
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mWrapR = RS_SAMPLER_WRAP;
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_SamplerSet(Context *rsc, RsSamplerParam param, RsSamplerValue value)
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    SamplerState * ss = &rsc->mStateSampler;
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    switch(param) {
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_SAMPLER_MAG_FILTER:
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ss->mMagFilter = value;
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_SAMPLER_MIN_FILTER:
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ss->mMinFilter = value;
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_SAMPLER_WRAP_S:
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ss->mWrapS = value;
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_SAMPLER_WRAP_T:
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ss->mWrapT = value;
128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_SAMPLER_WRAP_R:
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ss->mWrapR = value;
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
136326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsSampler rsi_SamplerCreate(Context *rsc)
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    SamplerState * ss = &rsc->mStateSampler;
139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
141707aaf341a4b068e6ccadf923af85acdd85fd775Jason Sams    Sampler * s = new Sampler(ss->mMagFilter,
142707aaf341a4b068e6ccadf923af85acdd85fd775Jason Sams                              ss->mMinFilter,
143707aaf341a4b068e6ccadf923af85acdd85fd775Jason Sams                              ss->mWrapS,
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                              ss->mWrapT,
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                              ss->mWrapR);
1469397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    s->incUserRef();
147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
15039c8bc7be5751ec52693d21abdf139c4dfd29a2cJason Sams
151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}}
152