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

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: One more tweak from zmo@'s feedback 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
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 34ddc02171a0ff5e89669900151afc3dc263bb35..aaa44039a289dbe072095ccbcb6df7fdbbed22a4 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"
@@ -711,6 +712,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;
@@ -740,6 +743,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();
}
@@ -798,6 +805,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();
@@ -1358,6 +1381,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();
@@ -1489,6 +1515,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);
@@ -1513,6 +1543,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);
@@ -1554,10 +1585,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);
@@ -2692,6 +2726,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.
@@ -2714,6 +2749,9 @@ bool GLES2DecoderImpl::Initialize(
ref = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D);
state_.texture_units[tt].bound_texture_2d = ref;
glBindTexture(GL_TEXTURE_2D, ref ? ref->service_id() : 0);
+
+ if (features().enable_samplers)
+ glBindSampler(tt, 0);
piman 2015/12/05 02:45:19 nit: is it needed? it's the default state.
piman 2015/12/07 19:35:59 ping
}
glActiveTexture(GL_TEXTURE0);
CHECK_GL_ERROR();
@@ -3357,6 +3395,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;
@@ -3526,6 +3578,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() {
@@ -3969,6 +4034,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;
@@ -4871,6 +4937,37 @@ void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) {
}
}
+void GLES2DecoderImpl::DoBindSampler(GLuint unit, GLuint client_id) {
+ Sampler* sampler = NULL;
+ GLuint service_id = 0;
+ if (client_id != 0) {
+ sampler = GetSampler(client_id);
+ if (!sampler) {
+ if (!group_->bind_generates_resource()) {
piman 2015/12/05 02:45:19 Unlike textures or buffers, samplers are not impli
+ LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
+ "glBindSampler",
+ "id not generated by glGenSamplers");
+ return;
+ }
+
+ // It's a new id so make a texture texture for it.
+ glGenSamplers(1, &service_id);
+ DCHECK_NE(0u, service_id);
+ sampler = CreateSampler(client_id, service_id);
+ }
+ }
+
+ // 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 ||
@@ -6722,16 +6819,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(
@@ -8271,6 +8406,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(
@@ -8361,6 +8501,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);

Powered by Google App Engine
This is Rietveld 408576698