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