Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 1498033003: Implement SamplerManager in the command buffer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed unnessecary state initialization Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/context_state.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 1dec5cf2002c7dfcdf9db9099edbdfd5c3b84b1b..d1235e10afbd322cd34b837d507b76bcb738bc19 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -50,6 +50,7 @@
#include "gpu/command_buffer/service/program_manager.h"
#include "gpu/command_buffer/service/query_manager.h"
#include "gpu/command_buffer/service/renderbuffer_manager.h"
+#include "gpu/command_buffer/service/sampler_manager.h"
#include "gpu/command_buffer/service/shader_manager.h"
#include "gpu/command_buffer/service/shader_translator.h"
#include "gpu/command_buffer/service/texture_manager.h"
@@ -708,6 +709,8 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids);
bool GenPathsCHROMIUMHelper(GLuint first_client_id, GLsizei range);
bool DeletePathsCHROMIUMHelper(GLuint first_client_id, GLsizei range);
+ bool GenSamplersHelper(GLsizei n, const GLuint* client_ids);
+ void DeleteSamplersHelper(GLsizei n, const GLuint* client_ids);
// Workarounds
void OnFboChanged() const;
@@ -737,6 +740,10 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
return group_->program_manager();
}
+ SamplerManager* sampler_manager() {
+ return group_->sampler_manager();
+ }
+
ShaderManager* shader_manager() {
return group_->shader_manager();
}
@@ -795,6 +802,22 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
texture_manager()->RemoveTexture(client_id);
}
+ // Creates a Sampler for the given sampler.
+ Sampler* CreateSampler(
+ GLuint client_id, GLuint service_id) {
+ return sampler_manager()->CreateSampler(client_id, service_id);
+ }
+
+ // Gets the sampler info for the given sampler. Returns NULL if none exists.
+ Sampler* GetSampler(GLuint client_id) {
+ return sampler_manager()->GetSampler(client_id);
+ }
+
+ // Deletes the sampler info for the given sampler.
+ void RemoveSampler(GLuint client_id) {
+ sampler_manager()->RemoveSampler(client_id);
+ }
+
// Get the size (in pixels) of the currently bound frame buffer (either FBO
// or regular back buffer).
gfx::Size GetBoundReadFrameBufferSize();
@@ -1373,6 +1396,9 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
// Wrapper for glBindTexture since we need to track the current targets.
void DoBindTexture(GLenum target, GLuint texture);
+ // Wrapper for glBindSampler since we need to track the current targets.
+ void DoBindSampler(GLuint unit, GLuint sampler);
+
// Wrapper for glBindVertexArrayOES
void DoBindVertexArrayOES(GLuint array);
void EmulateVertexArrayState();
@@ -1504,6 +1530,10 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
void DoGetRenderbufferParameteriv(
GLenum target, GLenum pname, GLint* params);
+ // Wrappers for glGetSamplerParameter.
+ void DoGetSamplerParameterfv(GLuint client_id, GLenum pname, GLfloat* params);
+ void DoGetSamplerParameteriv(GLuint client_id, GLenum pname, GLint* params);
+
// Wrapper for glGetShaderiv
void DoGetShaderiv(GLuint shader, GLenum pname, GLint* params);
@@ -1528,6 +1558,7 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
bool DoIsRenderbuffer(GLuint client_id);
bool DoIsShader(GLuint client_id);
bool DoIsTexture(GLuint client_id);
+ bool DoIsSampler(GLuint client_id);
bool DoIsVertexArrayOES(GLuint client_id);
bool DoIsPathCHROMIUM(GLuint client_id);
@@ -1569,10 +1600,13 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
// Wrapper for glReleaseShaderCompiler.
void DoReleaseShaderCompiler() { }
- // Wrappers for glSamplerParameter*v functions.
+ // Wrappers for glSamplerParameter functions.
+ void DoSamplerParameterf(GLuint client_id, GLenum pname, GLfloat param);
+ void DoSamplerParameteri(GLuint client_id, GLenum pname, GLint param);
void DoSamplerParameterfv(
- GLuint sampler, GLenum pname, const GLfloat* params);
- void DoSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* params);
+ GLuint client_id, GLenum pname, const GLfloat* params);
+ void DoSamplerParameteriv(
+ GLuint client_id, GLenum pname, const GLint* params);
// Wrappers for glTexParameter functions.
void DoTexParameterf(GLenum target, GLenum pname, GLfloat param);
@@ -2708,6 +2742,7 @@ bool GLES2DecoderImpl::Initialize(
glGenBuffersARB(1, &fixed_attrib_buffer_id_);
state_.texture_units.resize(group_->max_texture_units());
+ state_.sampler_units.resize(group_->max_texture_units());
for (uint32 tt = 0; tt < state_.texture_units.size(); ++tt) {
glActiveTexture(GL_TEXTURE0 + tt);
// We want the last bind to be 2D.
@@ -3376,6 +3411,20 @@ bool GLES2DecoderImpl::GenTexturesHelper(GLsizei n, const GLuint* client_ids) {
return true;
}
+bool GLES2DecoderImpl::GenSamplersHelper(GLsizei n, const GLuint* client_ids) {
+ for (GLsizei ii = 0; ii < n; ++ii) {
+ if (GetSampler(client_ids[ii])) {
+ return false;
+ }
+ }
+ scoped_ptr<GLuint[]> service_ids(new GLuint[n]);
+ glGenSamplers(n, service_ids.get());
+ for (GLsizei ii = 0; ii < n; ++ii) {
+ CreateSampler(client_ids[ii], service_ids[ii]);
+ }
+ return true;
+}
+
bool GLES2DecoderImpl::GenPathsCHROMIUMHelper(GLuint first_client_id,
GLsizei range) {
GLuint last_client_id;
@@ -3545,6 +3594,19 @@ void GLES2DecoderImpl::DeleteTexturesHelper(
}
}
+void GLES2DecoderImpl::DeleteSamplersHelper(
+ GLsizei n, const GLuint* client_ids) {
+ for (GLsizei ii = 0; ii < n; ++ii) {
+ Sampler* sampler = GetSampler(client_ids[ii]);
+ if (sampler && !sampler->IsDeleted()) {
+ // Unbind from current sampler units.
+ state_.UnbindSampler(sampler);
+
+ RemoveSampler(client_ids[ii]);
+ }
+ }
+}
+
// } // anonymous namespace
bool GLES2DecoderImpl::MakeCurrent() {
@@ -3988,6 +4050,7 @@ void GLES2DecoderImpl::Destroy(bool have_context) {
state_.vertex_attrib_manager = NULL;
state_.default_vertex_attrib_manager = NULL;
state_.texture_units.clear();
+ state_.sampler_units.clear();
state_.bound_array_buffer = NULL;
state_.bound_copy_read_buffer = NULL;
state_.bound_copy_write_buffer = NULL;
@@ -4890,6 +4953,29 @@ void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) {
}
}
+void GLES2DecoderImpl::DoBindSampler(GLuint unit, GLuint client_id) {
+ Sampler* sampler = nullptr;
+ if (client_id != 0) {
+ sampler = GetSampler(client_id);
+ if (!sampler) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
+ "glBindSampler",
+ "id not generated by glGenSamplers");
+ return;
+ }
+ }
+
+ // Check the sampler exists
+ if (sampler) {
+ LogClientServiceForInfo(sampler, client_id, "glBindSampler");
+ glBindSampler(unit, sampler->service_id());
+ } else {
+ glBindSampler(unit, 0);
+ }
+
+ state_.sampler_units[unit] = sampler;
+}
+
void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) {
if (state_.vertex_attrib_manager->Enable(index, false)) {
if (index != 0 ||
@@ -6850,16 +6936,54 @@ void GLES2DecoderImpl::DoReadBuffer(GLenum src) {
glReadBuffer(src);
}
+void GLES2DecoderImpl::DoSamplerParameterf(
+ GLuint client_id, GLenum pname, GLfloat param) {
+ Sampler* sampler = GetSampler(client_id);
+ if (!sampler) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_VALUE, "glSamplerParameterf", "unknown sampler");
+ return;
+ }
+ sampler_manager()->SetParameterf(
+ "glSamplerParameterf", GetErrorState(), sampler, pname, param);
+}
+
+void GLES2DecoderImpl::DoSamplerParameteri(
+ GLuint client_id, GLenum pname, GLint param) {
+ Sampler* sampler = GetSampler(client_id);
+ if (!sampler) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_VALUE, "glSamplerParameteri", "unknown sampler");
+ return;
+ }
+ sampler_manager()->SetParameteri(
+ "glSamplerParameteri", GetErrorState(), sampler, pname, param);
+}
+
void GLES2DecoderImpl::DoSamplerParameterfv(
- GLuint sampler, GLenum pname, const GLfloat* params) {
+ GLuint client_id, GLenum pname, const GLfloat* params) {
DCHECK(params);
- glSamplerParameterf(sampler, pname, params[0]);
+ Sampler* sampler = GetSampler(client_id);
+ if (!sampler) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_VALUE, "glSamplerParameterfv", "unknown sampler");
+ return;
+ }
+ sampler_manager()->SetParameterf(
+ "glSamplerParameterfv", GetErrorState(), sampler, pname, params[0]);
}
void GLES2DecoderImpl::DoSamplerParameteriv(
- GLuint sampler, GLenum pname, const GLint* params) {
+ GLuint client_id, GLenum pname, const GLint* params) {
DCHECK(params);
- glSamplerParameteri(sampler, pname, params[0]);
+ Sampler* sampler = GetSampler(client_id);
+ if (!sampler) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_VALUE, "glSamplerParameteriv", "unknown sampler");
+ return;
+ }
+ sampler_manager()->SetParameteri(
+ "glSamplerParameteriv", GetErrorState(), sampler, pname, params[0]);
}
void GLES2DecoderImpl::DoTexParameterf(
@@ -8399,6 +8523,11 @@ bool GLES2DecoderImpl::DoIsTexture(GLuint client_id) {
return texture_ref && texture_ref->texture()->IsValid();
}
+bool GLES2DecoderImpl::DoIsSampler(GLuint client_id) {
+ const Sampler* sampler = GetSampler(client_id);
+ return sampler && !sampler->IsDeleted();
+}
+
void GLES2DecoderImpl::DoAttachShader(
GLuint program_client_id, GLint shader_client_id) {
Program* program = GetProgramInfoNotShader(
@@ -8489,6 +8618,28 @@ void GLES2DecoderImpl::GetVertexAttribHelper(
}
}
+void GLES2DecoderImpl::DoGetSamplerParameterfv(
+ GLuint client_id, GLenum pname, GLfloat* params) {
+ Sampler* sampler = GetSampler(client_id);
+ if (!sampler) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION, "glGetSamplerParamterfv", "unknown sampler");
+ return;
+ }
+ glGetSamplerParameterfv(sampler->service_id(), pname, params);
+}
+
+void GLES2DecoderImpl::DoGetSamplerParameteriv(
+ GLuint client_id, GLenum pname, GLint* params) {
+ Sampler* sampler = GetSampler(client_id);
+ if (!sampler) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION, "glGetSamplerParamteriv", "unknown sampler");
+ return;
+ }
+ glGetSamplerParameteriv(sampler->service_id(), pname, params);
+}
+
void GLES2DecoderImpl::DoGetTexParameterfv(
GLenum target, GLenum pname, GLfloat* params) {
InitTextureMaxAnisotropyIfNeeded(target, pname);
« no previous file with comments | « gpu/command_buffer/service/context_state.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698