Line data Source code
1 : /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #include "WebGLSampler.h"
7 :
8 : #include "GLContext.h"
9 : #include "mozilla/dom/WebGL2RenderingContextBinding.h"
10 : #include "WebGLContext.h"
11 :
12 : namespace mozilla {
13 :
14 0 : WebGLSampler::WebGLSampler(WebGLContext* webgl, GLuint sampler)
15 : : WebGLRefCountedObject(webgl)
16 : , mGLName(sampler)
17 : , mMinFilter(LOCAL_GL_NEAREST_MIPMAP_LINEAR)
18 : , mMagFilter(LOCAL_GL_LINEAR)
19 : , mWrapS(LOCAL_GL_REPEAT)
20 : , mWrapT(LOCAL_GL_REPEAT)
21 : , mWrapR(LOCAL_GL_REPEAT)
22 : , mMinLod(-1000)
23 : , mMaxLod(1000)
24 : , mCompareMode(LOCAL_GL_NONE)
25 0 : , mCompareFunc(LOCAL_GL_LEQUAL)
26 : {
27 0 : mContext->mSamplers.insertBack(this);
28 0 : }
29 :
30 0 : WebGLSampler::~WebGLSampler()
31 : {
32 0 : DeleteOnce();
33 0 : }
34 :
35 : void
36 0 : WebGLSampler::Delete()
37 : {
38 0 : mContext->MakeContextCurrent();
39 0 : mContext->gl->fDeleteSamplers(1, &mGLName);
40 :
41 0 : removeFrom(mContext->mSamplers);
42 0 : }
43 :
44 : WebGLContext*
45 0 : WebGLSampler::GetParentObject() const
46 : {
47 0 : return mContext;
48 : }
49 :
50 : JSObject*
51 0 : WebGLSampler::WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto)
52 : {
53 0 : return dom::WebGLSamplerBinding::Wrap(cx, this, givenProto);
54 : }
55 :
56 : static bool
57 0 : ValidateSamplerParameterParams(WebGLContext* webgl, const char* funcName, GLenum pname,
58 : const FloatOrInt& param)
59 : {
60 0 : const auto& paramInt = param.i;
61 :
62 0 : switch (pname) {
63 : case LOCAL_GL_TEXTURE_MIN_FILTER:
64 0 : switch (paramInt) {
65 : case LOCAL_GL_NEAREST:
66 : case LOCAL_GL_LINEAR:
67 : case LOCAL_GL_NEAREST_MIPMAP_NEAREST:
68 : case LOCAL_GL_NEAREST_MIPMAP_LINEAR:
69 : case LOCAL_GL_LINEAR_MIPMAP_NEAREST:
70 : case LOCAL_GL_LINEAR_MIPMAP_LINEAR:
71 0 : return true;
72 :
73 : default:
74 0 : break;
75 : }
76 0 : break;
77 :
78 : case LOCAL_GL_TEXTURE_MAG_FILTER:
79 0 : switch (paramInt) {
80 : case LOCAL_GL_NEAREST:
81 : case LOCAL_GL_LINEAR:
82 0 : return true;
83 :
84 : default:
85 0 : break;
86 : }
87 0 : break;
88 :
89 : case LOCAL_GL_TEXTURE_WRAP_S:
90 : case LOCAL_GL_TEXTURE_WRAP_T:
91 : case LOCAL_GL_TEXTURE_WRAP_R:
92 0 : switch (paramInt) {
93 : case LOCAL_GL_CLAMP_TO_EDGE:
94 : case LOCAL_GL_REPEAT:
95 : case LOCAL_GL_MIRRORED_REPEAT:
96 0 : return true;
97 :
98 : default:
99 0 : break;
100 : }
101 0 : break;
102 :
103 : case LOCAL_GL_TEXTURE_MIN_LOD:
104 : case LOCAL_GL_TEXTURE_MAX_LOD:
105 0 : return true;
106 :
107 : case LOCAL_GL_TEXTURE_COMPARE_MODE:
108 0 : switch (paramInt) {
109 : case LOCAL_GL_NONE:
110 : case LOCAL_GL_COMPARE_REF_TO_TEXTURE:
111 0 : return true;
112 :
113 : default:
114 0 : break;
115 : }
116 0 : break;
117 :
118 : case LOCAL_GL_TEXTURE_COMPARE_FUNC:
119 0 : switch (paramInt) {
120 : case LOCAL_GL_LEQUAL:
121 : case LOCAL_GL_GEQUAL:
122 : case LOCAL_GL_LESS:
123 : case LOCAL_GL_GREATER:
124 : case LOCAL_GL_EQUAL:
125 : case LOCAL_GL_NOTEQUAL:
126 : case LOCAL_GL_ALWAYS:
127 : case LOCAL_GL_NEVER:
128 0 : return true;
129 :
130 : default:
131 0 : break;
132 : }
133 0 : break;
134 :
135 : default:
136 0 : webgl->ErrorInvalidEnumArg(funcName, "pname", pname);
137 0 : return false;
138 : }
139 :
140 0 : webgl->ErrorInvalidEnumArg(funcName, "param", paramInt);
141 0 : return false;
142 : }
143 :
144 : void
145 0 : WebGLSampler::SamplerParameter(const char* funcName, GLenum pname,
146 : const FloatOrInt& param)
147 : {
148 0 : if (!ValidateSamplerParameterParams(mContext, funcName, pname, param))
149 0 : return;
150 :
151 0 : switch (pname) {
152 : case LOCAL_GL_TEXTURE_MIN_FILTER:
153 0 : mMinFilter = param.i;
154 0 : break;
155 :
156 : case LOCAL_GL_TEXTURE_MAG_FILTER:
157 0 : mMagFilter = param.i;
158 0 : break;
159 :
160 : case LOCAL_GL_TEXTURE_WRAP_S:
161 0 : mWrapS = param.i;
162 0 : break;
163 :
164 : case LOCAL_GL_TEXTURE_WRAP_T:
165 0 : mWrapT = param.i;
166 0 : break;
167 :
168 : case LOCAL_GL_TEXTURE_WRAP_R:
169 0 : mWrapR = param.i;
170 0 : break;
171 :
172 : case LOCAL_GL_TEXTURE_COMPARE_MODE:
173 0 : mCompareMode = param.i;
174 0 : break;
175 :
176 : case LOCAL_GL_TEXTURE_COMPARE_FUNC:
177 0 : mCompareFunc = param.i;
178 0 : break;
179 :
180 : case LOCAL_GL_TEXTURE_MIN_LOD:
181 0 : mMinLod = param.f;
182 0 : break;
183 :
184 : case LOCAL_GL_TEXTURE_MAX_LOD:
185 0 : mMaxLod = param.f;
186 0 : break;
187 :
188 : default:
189 0 : MOZ_CRASH("GFX: Unhandled pname");
190 : break;
191 : }
192 :
193 0 : for (uint32_t i = 0; i < mContext->mBoundSamplers.Length(); ++i) {
194 0 : if (this == mContext->mBoundSamplers[i])
195 0 : mContext->InvalidateResolveCacheForTextureWithTexUnit(i);
196 : }
197 :
198 : ////
199 :
200 0 : mContext->gl->MakeCurrent();
201 0 : if (param.isFloat) {
202 0 : mContext->gl->fSamplerParameterf(mGLName, pname, param.f);
203 : } else {
204 0 : mContext->gl->fSamplerParameteri(mGLName, pname, param.i);
205 : }
206 : }
207 :
208 : ////
209 :
210 0 : NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(WebGLSampler)
211 0 : NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(WebGLSampler, AddRef)
212 0 : NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(WebGLSampler, Release)
213 :
214 : } // namespace mozilla
|