summaryrefslogtreecommitdiffstats
path: root/dom/canvas/WebGL2ContextSamplers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/canvas/WebGL2ContextSamplers.cpp')
-rw-r--r--dom/canvas/WebGL2ContextSamplers.cpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/dom/canvas/WebGL2ContextSamplers.cpp b/dom/canvas/WebGL2ContextSamplers.cpp
new file mode 100644
index 000000000..bf5e04779
--- /dev/null
+++ b/dom/canvas/WebGL2ContextSamplers.cpp
@@ -0,0 +1,147 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "WebGL2Context.h"
+#include "WebGLSampler.h"
+#include "GLContext.h"
+
+namespace mozilla {
+
+already_AddRefed<WebGLSampler>
+WebGL2Context::CreateSampler()
+{
+ if (IsContextLost())
+ return nullptr;
+
+ GLuint sampler;
+ MakeContextCurrent();
+ gl->fGenSamplers(1, &sampler);
+
+ RefPtr<WebGLSampler> globj = new WebGLSampler(this, sampler);
+ return globj.forget();
+}
+
+void
+WebGL2Context::DeleteSampler(WebGLSampler* sampler)
+{
+ if (!ValidateDeleteObject("deleteSampler", sampler))
+ return;
+
+ for (int n = 0; n < mGLMaxTextureUnits; n++) {
+ if (mBoundSamplers[n] == sampler) {
+ mBoundSamplers[n] = nullptr;
+
+ InvalidateResolveCacheForTextureWithTexUnit(n);
+ }
+ }
+
+ sampler->RequestDelete();
+}
+
+bool
+WebGL2Context::IsSampler(const WebGLSampler* sampler)
+{
+ if (!ValidateIsObject("isSampler", sampler))
+ return false;
+
+ MakeContextCurrent();
+ return gl->fIsSampler(sampler->mGLName);
+}
+
+void
+WebGL2Context::BindSampler(GLuint unit, WebGLSampler* sampler)
+{
+ if (IsContextLost())
+ return;
+
+ if (sampler && !ValidateObject("bindSampler", *sampler))
+ return;
+
+ if (GLint(unit) >= mGLMaxTextureUnits)
+ return ErrorInvalidValue("bindSampler: unit must be < %d", mGLMaxTextureUnits);
+
+ ////
+
+ gl->MakeCurrent();
+ gl->fBindSampler(unit, sampler ? sampler->mGLName : 0);
+
+ InvalidateResolveCacheForTextureWithTexUnit(unit);
+ mBoundSamplers[unit] = sampler;
+}
+
+void
+WebGL2Context::SamplerParameteri(WebGLSampler& sampler, GLenum pname, GLint param)
+{
+ const char funcName[] = "samplerParameteri";
+ if (IsContextLost())
+ return;
+
+ if (!ValidateObject(funcName, sampler))
+ return;
+
+ sampler.SamplerParameter(funcName, pname, FloatOrInt(param));
+}
+
+void
+WebGL2Context::SamplerParameterf(WebGLSampler& sampler, GLenum pname, GLfloat param)
+{
+ const char funcName[] = "samplerParameterf";
+ if (IsContextLost())
+ return;
+
+ if (!ValidateObject(funcName, sampler))
+ return;
+
+ sampler.SamplerParameter(funcName, pname, FloatOrInt(param));
+}
+
+void
+WebGL2Context::GetSamplerParameter(JSContext*, const WebGLSampler& sampler, GLenum pname,
+ JS::MutableHandleValue retval)
+{
+ const char funcName[] = "getSamplerParameter";
+ retval.setNull();
+
+ if (IsContextLost())
+ return;
+
+ if (!ValidateObject(funcName, sampler))
+ return;
+
+ ////
+
+ gl->MakeCurrent();
+
+ switch (pname) {
+ case LOCAL_GL_TEXTURE_MIN_FILTER:
+ case LOCAL_GL_TEXTURE_MAG_FILTER:
+ case LOCAL_GL_TEXTURE_WRAP_S:
+ case LOCAL_GL_TEXTURE_WRAP_T:
+ case LOCAL_GL_TEXTURE_WRAP_R:
+ case LOCAL_GL_TEXTURE_COMPARE_MODE:
+ case LOCAL_GL_TEXTURE_COMPARE_FUNC:
+ {
+ GLint param = 0;
+ gl->fGetSamplerParameteriv(sampler.mGLName, pname, &param);
+ retval.set(JS::Int32Value(param));
+ }
+ return;
+
+ case LOCAL_GL_TEXTURE_MIN_LOD:
+ case LOCAL_GL_TEXTURE_MAX_LOD:
+ {
+ GLfloat param = 0;
+ gl->fGetSamplerParameterfv(sampler.mGLName, pname, &param);
+ retval.set(JS::Float32Value(param));
+ }
+ return;
+
+ default:
+ ErrorInvalidEnumArg(funcName, "pname", pname);
+ return;
+ }
+}
+
+} // namespace mozilla