DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (c584e29f6ac2)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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() {
  const FuncScope funcScope(*this, "createSampler");
  if (IsContextLost()) return nullptr;

  RefPtr<WebGLSampler> globj = new WebGLSampler(this);
  return globj.forget();
}

void WebGL2Context::DeleteSampler(WebGLSampler* sampler) {
  const FuncScope funcScope(*this, "deleteSampler");
  if (!ValidateDeleteObject(sampler)) return;

  for (uint32_t n = 0; n < mGLMaxTextureUnits; n++) {
    if (mBoundSamplers[n] == sampler) {
      mBoundSamplers[n] = nullptr;
    }
  }

  sampler->RequestDelete();
}

bool WebGL2Context::IsSampler(const WebGLSampler* const obj) {
  const FuncScope funcScope(*this, "isSampler");
  if (!ValidateIsObject(obj)) return false;

  if (obj->IsDeleteRequested()) return false;

  return true;
}

void WebGL2Context::BindSampler(GLuint unit, WebGLSampler* sampler) {
  const FuncScope funcScope(*this, "bindSampler");
  if (IsContextLost()) return;

  if (sampler && !ValidateObject("sampler", *sampler)) return;

  if (unit >= mGLMaxTextureUnits)
    return ErrorInvalidValue("unit must be < %u", mGLMaxTextureUnits);

  ////

  gl->fBindSampler(unit, sampler ? sampler->mGLName : 0);

  mBoundSamplers[unit] = sampler;
}

void WebGL2Context::SamplerParameteri(WebGLSampler& sampler, GLenum pname,
                                      GLint param) {
  const FuncScope funcScope(*this, "samplerParameteri");
  if (IsContextLost()) return;

  if (!ValidateObject("sampler", sampler)) return;

  sampler.SamplerParameter(pname, FloatOrInt(param));
}

void WebGL2Context::SamplerParameterf(WebGLSampler& sampler, GLenum pname,
                                      GLfloat param) {
  const FuncScope funcScope(*this, "samplerParameterf");
  if (IsContextLost()) return;

  if (!ValidateObject("sampler", sampler)) return;

  sampler.SamplerParameter(pname, FloatOrInt(param));
}

void WebGL2Context::GetSamplerParameter(JSContext*, const WebGLSampler& sampler,
                                        GLenum pname,
                                        JS::MutableHandleValue retval) {
  const FuncScope funcScope(*this, "getSamplerParameter");
  retval.setNull();

  if (IsContextLost()) return;

  if (!ValidateObject("sampler", sampler)) return;

  ////

  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:
      ErrorInvalidEnumInfo("pname", pname);
      return;
  }
}

}  // namespace mozilla