diff options
Diffstat (limited to 'dom/canvas/WebGL2ContextSamplers.cpp')
-rw-r--r-- | dom/canvas/WebGL2ContextSamplers.cpp | 147 |
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, ¶m); + 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, ¶m); + retval.set(JS::Float32Value(param)); + } + return; + + default: + ErrorInvalidEnumArg(funcName, "pname", pname); + return; + } +} + +} // namespace mozilla |