| Index: gpu/command_buffer/service/sampler_manager.cc
|
| diff --git a/gpu/command_buffer/service/sampler_manager.cc b/gpu/command_buffer/service/sampler_manager.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4d4c07cb3467ca7e39c7c4364e9126eec190218c
|
| --- /dev/null
|
| +++ b/gpu/command_buffer/service/sampler_manager.cc
|
| @@ -0,0 +1,206 @@
|
| +// Copyright (c) 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "gpu/command_buffer/service/sampler_manager.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/logging.h"
|
| +#include "gpu/command_buffer/common/gles2_cmd_format.h"
|
| +#include "gpu/command_buffer/service/error_state.h"
|
| +#include "gpu/command_buffer/service/feature_info.h"
|
| +#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
|
| +#include "ui/gl/gl_bindings.h"
|
| +#include "ui/gl/gl_context.h"
|
| +#include "ui/gl/gl_fence.h"
|
| +#include "ui/gl/gpu_timing.h"
|
| +
|
| +namespace gpu {
|
| +namespace gles2 {
|
| +
|
| +Sampler::Sampler(SamplerManager* manager, GLuint service_id)
|
| + : manager_(manager),
|
| + service_id_(service_id),
|
| + min_filter_(GL_NEAREST_MIPMAP_LINEAR),
|
| + mag_filter_(GL_LINEAR),
|
| + wrap_r_(GL_REPEAT),
|
| + wrap_s_(GL_REPEAT),
|
| + wrap_t_(GL_REPEAT),
|
| + compare_func_(GL_LEQUAL),
|
| + compare_mode_(GL_NONE),
|
| + max_lod_(1000.0f),
|
| + min_lod_(-1000.0f),
|
| + deleted_(false) {
|
| + DCHECK(manager);
|
| +}
|
| +
|
| +Sampler::~Sampler() {
|
| + if (manager_->have_context_) {
|
| + glDeleteSamplers(1, &service_id_);
|
| + }
|
| +}
|
| +
|
| +GLenum Sampler::SetParameteri(
|
| + const FeatureInfo* feature_info, GLenum pname, GLint param) {
|
| + DCHECK(feature_info);
|
| +
|
| + switch (pname) {
|
| + case GL_TEXTURE_MIN_LOD:
|
| + case GL_TEXTURE_MAX_LOD: {
|
| + GLfloat fparam = static_cast<GLfloat>(param);
|
| + return SetParameterf(feature_info, pname, fparam);
|
| + }
|
| + case GL_TEXTURE_MIN_FILTER:
|
| + if (!feature_info->validators()->texture_min_filter_mode.IsValid(param)) {
|
| + return GL_INVALID_ENUM;
|
| + }
|
| + min_filter_ = param;
|
| + break;
|
| + case GL_TEXTURE_MAG_FILTER:
|
| + if (!feature_info->validators()->texture_mag_filter_mode.IsValid(param)) {
|
| + return GL_INVALID_ENUM;
|
| + }
|
| + mag_filter_ = param;
|
| + break;
|
| + case GL_TEXTURE_WRAP_R:
|
| + if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) {
|
| + return GL_INVALID_ENUM;
|
| + }
|
| + wrap_r_ = param;
|
| + break;
|
| + case GL_TEXTURE_WRAP_S:
|
| + if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) {
|
| + return GL_INVALID_ENUM;
|
| + }
|
| + wrap_s_ = param;
|
| + break;
|
| + case GL_TEXTURE_WRAP_T:
|
| + if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) {
|
| + return GL_INVALID_ENUM;
|
| + }
|
| + wrap_t_ = param;
|
| + break;
|
| + case GL_TEXTURE_COMPARE_FUNC:
|
| + if (!feature_info->validators()->texture_compare_func.IsValid(param)) {
|
| + return GL_INVALID_ENUM;
|
| + }
|
| + compare_func_ = param;
|
| + break;
|
| + case GL_TEXTURE_COMPARE_MODE:
|
| + if (!feature_info->validators()->texture_compare_mode.IsValid(param)) {
|
| + return GL_INVALID_ENUM;
|
| + }
|
| + compare_mode_ = param;
|
| + break;
|
| + default:
|
| + return GL_INVALID_ENUM;
|
| + }
|
| + return GL_NO_ERROR;
|
| +}
|
| +
|
| +GLenum Sampler::SetParameterf(
|
| + const FeatureInfo* feature_info, GLenum pname, GLfloat param) {
|
| + switch (pname) {
|
| + case GL_TEXTURE_MIN_FILTER:
|
| + case GL_TEXTURE_MAG_FILTER:
|
| + case GL_TEXTURE_WRAP_R:
|
| + case GL_TEXTURE_WRAP_S:
|
| + case GL_TEXTURE_WRAP_T:
|
| + case GL_TEXTURE_COMPARE_FUNC:
|
| + case GL_TEXTURE_COMPARE_MODE: {
|
| + GLint iparam = static_cast<GLint>(param);
|
| + return SetParameteri(feature_info, pname, iparam);
|
| + }
|
| + case GL_TEXTURE_MIN_LOD:
|
| + min_lod_ = param;
|
| + break;
|
| + case GL_TEXTURE_MAX_LOD:
|
| + max_lod_ = param;
|
| + break;
|
| + default:
|
| + return GL_INVALID_ENUM;
|
| + }
|
| + return GL_NO_ERROR;
|
| +}
|
| +
|
| +SamplerManager::SamplerManager(FeatureInfo* feature_info)
|
| + : feature_info_(feature_info),
|
| + have_context_(true) {
|
| +}
|
| +
|
| +SamplerManager::~SamplerManager() {
|
| + DCHECK(samplers_.empty());
|
| +}
|
| +
|
| +void SamplerManager::Destroy(bool have_context) {
|
| + have_context_ = have_context;
|
| + while (!samplers_.empty()) {
|
| + Sampler* sampler = samplers_.begin()->second.get();
|
| + sampler->MarkAsDeleted();
|
| + samplers_.erase(samplers_.begin());
|
| + }
|
| +}
|
| +
|
| +Sampler* SamplerManager::CreateSampler(GLuint client_id, GLuint service_id) {
|
| + DCHECK_NE(0u, service_id);
|
| + auto result = samplers_.insert(std::make_pair(client_id,
|
| + scoped_refptr<Sampler>(new Sampler(this, service_id))));
|
| + DCHECK(result.second);
|
| + return result.first->second.get();
|
| +}
|
| +
|
| +Sampler* SamplerManager::GetSampler(GLuint client_id) {
|
| + SamplerMap::iterator it = samplers_.find(client_id);
|
| + return it != samplers_.end() ? it->second.get() : nullptr;
|
| +}
|
| +
|
| +void SamplerManager::RemoveSampler(GLuint client_id) {
|
| + SamplerMap::iterator it = samplers_.find(client_id);
|
| + if (it != samplers_.end()) {
|
| + Sampler* sampler = it->second.get();
|
| +
|
| + sampler->MarkAsDeleted();
|
| + samplers_.erase(it);
|
| + }
|
| +}
|
| +
|
| +void SamplerManager::SetParameteri(
|
| + const char* function_name, ErrorState* error_state,
|
| + Sampler* sampler, GLenum pname, GLint param) {
|
| + DCHECK(error_state);
|
| + DCHECK(sampler);
|
| + GLenum result = sampler->SetParameteri(feature_info_.get(), pname, param);
|
| + if (result != GL_NO_ERROR) {
|
| + if (result == GL_INVALID_ENUM) {
|
| + ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(
|
| + error_state, function_name, param, "param");
|
| + } else {
|
| + ERRORSTATE_SET_GL_ERROR_INVALID_PARAMI(
|
| + error_state, result, function_name, pname, param);
|
| + }
|
| + } else {
|
| + glSamplerParameteri(sampler->service_id(), pname, param);
|
| + }
|
| +}
|
| +
|
| +void SamplerManager::SetParameterf(
|
| + const char* function_name, ErrorState* error_state,
|
| + Sampler* sampler, GLenum pname, GLfloat param) {
|
| + DCHECK(error_state);
|
| + DCHECK(sampler);
|
| + GLenum result = sampler->SetParameterf(feature_info_.get(), pname, param);
|
| + if (result != GL_NO_ERROR) {
|
| + if (result == GL_INVALID_ENUM) {
|
| + ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(
|
| + error_state, function_name, param, "param");
|
| + } else {
|
| + ERRORSTATE_SET_GL_ERROR_INVALID_PARAMI(
|
| + error_state, result, function_name, pname, param);
|
| + }
|
| + } else {
|
| + glSamplerParameterf(sampler->service_id(), pname, param);
|
| + }
|
| +}
|
| +
|
| +} // namespace gles2
|
| +} // namespace gpu
|
|
|