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

Unified Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 723343002: Update from https://crrev.com/304121 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 1 month 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/client/gles2_implementation.cc
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 66d8c2bb13c288a9342e8ee2f9094bacdf1f66bf..e7118e8736a9b0c9702b79a9388f597a6845b6aa 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -49,21 +49,6 @@ GLES2Implementation::GLStaticState::GLStaticState() {
GLES2Implementation::GLStaticState::~GLStaticState() {
}
-GLES2Implementation::GLStaticState::IntState::IntState()
- : max_combined_texture_image_units(0),
- max_cube_map_texture_size(0),
- max_fragment_uniform_vectors(0),
- max_renderbuffer_size(0),
- max_texture_image_units(0),
- max_texture_size(0),
- max_varying_vectors(0),
- max_vertex_attribs(0),
- max_vertex_texture_image_units(0),
- max_vertex_uniform_vectors(0),
- num_compressed_texture_formats(0),
- num_shader_binary_formats(0),
- bind_generates_resource_chromium(0) {}
-
GLES2Implementation::SingleThreadChecker::SingleThreadChecker(
GLES2Implementation* gles2_implementation)
: gles2_implementation_(gles2_implementation) {
@@ -99,6 +84,7 @@ GLES2Implementation::GLES2Implementation(
bound_framebuffer_(0),
bound_read_framebuffer_(0),
bound_renderbuffer_(0),
+ bound_valuebuffer_(0),
current_program_(0),
bound_array_buffer_id_(0),
bound_pixel_pack_transfer_buffer_id_(0),
@@ -173,17 +159,22 @@ bool GLES2Implementation::Initialize(
}
mapped_memory_->set_chunk_size_multiple(chunk_size);
- if (!QueryAndCacheStaticState())
- return false;
+ GLStaticState::ShaderPrecisionMap* shader_precisions =
+ &static_state_.shader_precisions;
+ capabilities_.VisitPrecisions([shader_precisions](
+ GLenum shader, GLenum type, Capabilities::ShaderPrecision* result) {
+ const GLStaticState::ShaderPrecisionKey key(shader, type);
+ cmds::GetShaderPrecisionFormat::Result cached_result = {
+ true, result->min_range, result->max_range, result->precision};
+ shader_precisions->insert(std::make_pair(key, cached_result));
+ });
util_.set_num_compressed_texture_formats(
- static_state_.int_state.num_compressed_texture_formats);
- util_.set_num_shader_binary_formats(
- static_state_.int_state.num_shader_binary_formats);
+ capabilities_.num_compressed_texture_formats);
+ util_.set_num_shader_binary_formats(capabilities_.num_shader_binary_formats);
texture_units_.reset(
- new TextureUnit[
- static_state_.int_state.max_combined_texture_image_units]);
+ new TextureUnit[capabilities_.max_combined_texture_image_units]);
query_tracker_.reset(new QueryTracker(mapped_memory_.get()));
buffer_tracker_.reset(new BufferTracker(mapped_memory_.get()));
@@ -195,14 +186,12 @@ bool GLES2Implementation::Initialize(
}
vertex_array_object_manager_.reset(new VertexArrayObjectManager(
- static_state_.int_state.max_vertex_attribs,
- reserved_ids_[0],
- reserved_ids_[1],
+ capabilities_.max_vertex_attribs, reserved_ids_[0], reserved_ids_[1],
support_client_side_arrays_));
// GL_BIND_GENERATES_RESOURCE_CHROMIUM state must be the same
// on Client & Service.
- if (static_state_.int_state.bind_generates_resource_chromium !=
+ if (capabilities_.bind_generates_resource_chromium !=
(share_group_->bind_generates_resource() ? 1 : 0)) {
SetGLError(GL_INVALID_OPERATION,
"Initialize",
@@ -213,80 +202,6 @@ bool GLES2Implementation::Initialize(
return true;
}
-bool GLES2Implementation::QueryAndCacheStaticState() {
- TRACE_EVENT0("gpu", "GLES2Implementation::QueryAndCacheStaticState");
- // Setup query for multiple GetIntegerv's
- static const GLenum pnames[] = {
- GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,
- GL_MAX_CUBE_MAP_TEXTURE_SIZE,
- GL_MAX_FRAGMENT_UNIFORM_VECTORS,
- GL_MAX_RENDERBUFFER_SIZE,
- GL_MAX_TEXTURE_IMAGE_UNITS,
- GL_MAX_TEXTURE_SIZE,
- GL_MAX_VARYING_VECTORS,
- GL_MAX_VERTEX_ATTRIBS,
- GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS,
- GL_MAX_VERTEX_UNIFORM_VECTORS,
- GL_NUM_COMPRESSED_TEXTURE_FORMATS,
- GL_NUM_SHADER_BINARY_FORMATS,
- GL_BIND_GENERATES_RESOURCE_CHROMIUM,
- };
-
- GetMultipleIntegervState integerv_state(
- pnames, arraysize(pnames),
- &static_state_.int_state.max_combined_texture_image_units,
- sizeof(static_state_.int_state));
- if (!GetMultipleIntegervSetup(&integerv_state)) {
- return false;
- }
-
- // Setup query for multiple GetShaderPrecisionFormat's
- static const GLenum precision_params[][2] = {
- { GL_VERTEX_SHADER, GL_LOW_INT },
- { GL_VERTEX_SHADER, GL_MEDIUM_INT },
- { GL_VERTEX_SHADER, GL_HIGH_INT },
- { GL_VERTEX_SHADER, GL_LOW_FLOAT },
- { GL_VERTEX_SHADER, GL_MEDIUM_FLOAT },
- { GL_VERTEX_SHADER, GL_HIGH_FLOAT },
- { GL_FRAGMENT_SHADER, GL_LOW_INT },
- { GL_FRAGMENT_SHADER, GL_MEDIUM_INT },
- { GL_FRAGMENT_SHADER, GL_HIGH_INT },
- { GL_FRAGMENT_SHADER, GL_LOW_FLOAT },
- { GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT },
- { GL_FRAGMENT_SHADER, GL_HIGH_FLOAT },
- };
-
- GetAllShaderPrecisionFormatsState precision_state(
- precision_params, arraysize(precision_params));
- GetAllShaderPrecisionFormatsSetup(&precision_state);
-
- // Allocate and partition transfer buffer for all requests
- void* buffer = transfer_buffer_->Alloc(
- integerv_state.transfer_buffer_size_needed +
- precision_state.transfer_buffer_size_needed);
- if (!buffer) {
- SetGLError(GL_OUT_OF_MEMORY, "QueryAndCacheStaticState",
- "Transfer buffer allocation failed.");
- return false;
- }
- integerv_state.buffer = buffer;
- precision_state.results_buffer =
- static_cast<char*>(buffer) + integerv_state.transfer_buffer_size_needed;
-
- // Make all the requests and wait once for all the results.
- GetMultipleIntegervRequest(&integerv_state);
- GetAllShaderPrecisionFormatsRequest(&precision_state);
- WaitForCmd();
- GetMultipleIntegervOnCompleted(&integerv_state);
- GetAllShaderPrecisionFormatsOnCompleted(&precision_state);
-
- // TODO(gman): We should be able to free without a token.
- transfer_buffer_->FreePendingToken(buffer, helper_->InsertToken());
- CheckGLError();
-
- return true;
-}
-
GLES2Implementation::~GLES2Implementation() {
// Make sure the queries are finished otherwise we'll delete the
// shared memory (mapped_memory_) which will free the memory used
@@ -683,40 +598,40 @@ GLboolean GLES2Implementation::IsEnabled(GLenum cap) {
bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) {
switch (pname) {
case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
- *params = static_state_.int_state.max_combined_texture_image_units;
+ *params = capabilities_.max_combined_texture_image_units;
return true;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
- *params = static_state_.int_state.max_cube_map_texture_size;
+ *params = capabilities_.max_cube_map_texture_size;
return true;
case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
- *params = static_state_.int_state.max_fragment_uniform_vectors;
+ *params = capabilities_.max_fragment_uniform_vectors;
return true;
case GL_MAX_RENDERBUFFER_SIZE:
- *params = static_state_.int_state.max_renderbuffer_size;
+ *params = capabilities_.max_renderbuffer_size;
return true;
case GL_MAX_TEXTURE_IMAGE_UNITS:
- *params = static_state_.int_state.max_texture_image_units;
+ *params = capabilities_.max_texture_image_units;
return true;
case GL_MAX_TEXTURE_SIZE:
- *params = static_state_.int_state.max_texture_size;
+ *params = capabilities_.max_texture_size;
return true;
case GL_MAX_VARYING_VECTORS:
- *params = static_state_.int_state.max_varying_vectors;
+ *params = capabilities_.max_varying_vectors;
return true;
case GL_MAX_VERTEX_ATTRIBS:
- *params = static_state_.int_state.max_vertex_attribs;
+ *params = capabilities_.max_vertex_attribs;
return true;
case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
- *params = static_state_.int_state.max_vertex_texture_image_units;
+ *params = capabilities_.max_vertex_texture_image_units;
return true;
case GL_MAX_VERTEX_UNIFORM_VECTORS:
- *params = static_state_.int_state.max_vertex_uniform_vectors;
+ *params = capabilities_.max_vertex_uniform_vectors;
return true;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
- *params = static_state_.int_state.num_compressed_texture_formats;
+ *params = capabilities_.num_compressed_texture_formats;
return true;
case GL_NUM_SHADER_BINARY_FORMATS:
- *params = static_state_.int_state.num_shader_binary_formats;
+ *params = capabilities_.num_shader_binary_formats;
return true;
case GL_ARRAY_BUFFER_BINDING:
if (share_group_->bind_generates_resource()) {
@@ -2327,8 +2242,8 @@ void GLES2Implementation::ActiveTexture(GLenum texture) {
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glActiveTexture("
<< GLES2Util::GetStringEnum(texture) << ")");
GLuint texture_index = texture - GL_TEXTURE0;
- if (texture_index >= static_cast<GLuint>(
- static_state_.int_state.max_combined_texture_image_units)) {
+ if (texture_index >=
+ static_cast<GLuint>(capabilities_.max_combined_texture_image_units)) {
SetGLErrorInvalidEnum(
"glActiveTexture", texture, "texture");
return;
@@ -2364,6 +2279,11 @@ void GLES2Implementation::GenQueriesEXTHelper(
GLsizei /* n */, const GLuint* /* queries */) {
}
+void GLES2Implementation::GenValuebuffersCHROMIUMHelper(
+ GLsizei /* n */,
+ const GLuint* /* valuebuffers */) {
+}
+
// NOTE #1: On old versions of OpenGL, calling glBindXXX with an unused id
// generates a new resource. On newer versions of OpenGL they don't. The code
// related to binding below will need to change if we switch to the new OpenGL
@@ -2513,6 +2433,26 @@ bool GLES2Implementation::BindVertexArrayOESHelper(GLuint array) {
return changed;
}
+bool GLES2Implementation::BindValuebufferCHROMIUMHelper(GLenum target,
+ GLuint valuebuffer) {
+ bool changed = false;
+ switch (target) {
+ case GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM:
+ if (bound_valuebuffer_ != valuebuffer) {
+ bound_valuebuffer_ = valuebuffer;
+ changed = true;
+ }
+ break;
+ default:
+ changed = true;
+ break;
+ }
+ // TODO(gman): There's a bug here. If the target is invalid the ID will not be
+ // used even though it's marked it as used here.
+ GetIdHandler(id_namespaces::kValuebuffers)->MarkAsUsedForBind(valuebuffer);
+ return changed;
+}
+
bool GLES2Implementation::UseProgramHelper(GLuint program) {
bool changed = false;
if (current_program_ != program) {
@@ -2612,8 +2552,7 @@ void GLES2Implementation::DeleteTexturesHelper(
return;
}
for (GLsizei ii = 0; ii < n; ++ii) {
- for (GLint tt = 0;
- tt < static_state_.int_state.max_combined_texture_image_units;
+ for (GLint tt = 0; tt < capabilities_.max_combined_texture_image_units;
++tt) {
TextureUnit& unit = texture_units_[tt];
if (textures[ii] == unit.bound_texture_2d) {
@@ -2629,6 +2568,11 @@ void GLES2Implementation::DeleteTexturesHelper(
}
}
+void GLES2Implementation::DeleteTexturesStub(GLsizei n,
+ const GLuint* textures) {
+ helper_->DeleteTexturesImmediate(n, textures);
+}
+
void GLES2Implementation::DeleteVertexArraysOESHelper(
GLsizei n, const GLuint* arrays) {
vertex_array_object_manager_->DeleteVertexArrays(n, arrays);
@@ -2646,9 +2590,27 @@ void GLES2Implementation::DeleteVertexArraysOESStub(
helper_->DeleteVertexArraysOESImmediate(n, arrays);
}
-void GLES2Implementation::DeleteTexturesStub(
- GLsizei n, const GLuint* textures) {
- helper_->DeleteTexturesImmediate(n, textures);
+void GLES2Implementation::DeleteValuebuffersCHROMIUMHelper(
+ GLsizei n,
+ const GLuint* valuebuffers) {
+ if (!GetIdHandler(id_namespaces::kValuebuffers)
+ ->FreeIds(this, n, valuebuffers,
+ &GLES2Implementation::DeleteValuebuffersCHROMIUMStub)) {
+ SetGLError(GL_INVALID_VALUE, "glDeleteValuebuffersCHROMIUM",
+ "id not created by this context.");
+ return;
+ }
+ for (GLsizei ii = 0; ii < n; ++ii) {
+ if (valuebuffers[ii] == bound_valuebuffer_) {
+ bound_valuebuffer_ = 0;
+ }
+ }
+}
+
+void GLES2Implementation::DeleteValuebuffersCHROMIUMStub(
+ GLsizei n,
+ const GLuint* valuebuffers) {
+ helper_->DeleteValuebuffersCHROMIUMImmediate(n, valuebuffers);
}
void GLES2Implementation::DisableVertexAttribArray(GLuint index) {
@@ -3034,134 +2996,6 @@ void GLES2Implementation::RateLimitOffscreenContextCHROMIUM() {
rate_limit_tokens_.push(helper_->InsertToken());
}
-void GLES2Implementation::GetMultipleIntegervCHROMIUM(
- const GLenum* pnames, GLuint count, GLint* results, GLsizeiptr size) {
- GPU_CLIENT_SINGLE_THREAD_CHECK();
- GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetMultipleIntegervCHROMIUM("
- << static_cast<const void*>(pnames) << ", "
- << count << ", " << results << ", "
- << size << ")");
- GPU_CLIENT_LOG_CODE_BLOCK({
- for (GLuint i = 0; i < count; ++i) {
- GPU_CLIENT_LOG(
- " " << i << ": " << GLES2Util::GetStringGLState(pnames[i]));
- }
- });
- DCHECK(size >= 0 && FitInt32NonNegative<GLsizeiptr>(size));
-
- GetMultipleIntegervState state(pnames, count, results, size);
- if (!GetMultipleIntegervSetup(&state)) {
- return;
- }
- state.buffer = transfer_buffer_->Alloc(state.transfer_buffer_size_needed);
- if (!state.buffer) {
- SetGLError(GL_OUT_OF_MEMORY, "glGetMultipleIntegervCHROMIUM",
- "Transfer buffer allocation failed.");
- return;
- }
- GetMultipleIntegervRequest(&state);
- WaitForCmd();
- GetMultipleIntegervOnCompleted(&state);
-
- GPU_CLIENT_LOG(" returned");
- GPU_CLIENT_LOG_CODE_BLOCK({
- for (int i = 0; i < state.num_results; ++i) {
- GPU_CLIENT_LOG(" " << i << ": " << (results[i]));
- }
- });
-
- // TODO(gman): We should be able to free without a token.
- transfer_buffer_->FreePendingToken(state.buffer, helper_->InsertToken());
- CheckGLError();
-}
-
-bool GLES2Implementation::GetMultipleIntegervSetup(
- GetMultipleIntegervState* state) {
- state->num_results = 0;
- for (GLuint ii = 0; ii < state->pnames_count; ++ii) {
- int num = util_.GLGetNumValuesReturned(state->pnames[ii]);
- if (!num) {
- SetGLErrorInvalidEnum(
- "glGetMultipleIntegervCHROMIUM", state->pnames[ii], "pname");
- return false;
- }
- state->num_results += num;
- }
- if (static_cast<size_t>(state->results_size) !=
- state->num_results * sizeof(GLint)) {
- SetGLError(GL_INVALID_VALUE, "glGetMultipleIntegervCHROMIUM", "bad size");
- return false;
- }
- for (int ii = 0; ii < state->num_results; ++ii) {
- if (state->results[ii] != 0) {
- SetGLError(GL_INVALID_VALUE,
- "glGetMultipleIntegervCHROMIUM", "results not set to zero.");
- return false;
- }
- }
- state->transfer_buffer_size_needed =
- state->pnames_count * sizeof(state->pnames[0]) +
- state->num_results * sizeof(state->results[0]);
- return true;
-}
-
-void GLES2Implementation::GetMultipleIntegervRequest(
- GetMultipleIntegervState* state) {
- GLenum* pnames_buffer = static_cast<GLenum*>(state->buffer);
- state->results_buffer = pnames_buffer + state->pnames_count;
- memcpy(pnames_buffer, state->pnames, state->pnames_count * sizeof(GLenum));
- memset(state->results_buffer, 0, state->num_results * sizeof(GLint));
- helper_->GetMultipleIntegervCHROMIUM(
- transfer_buffer_->GetShmId(),
- transfer_buffer_->GetOffset(pnames_buffer),
- state->pnames_count,
- transfer_buffer_->GetShmId(),
- transfer_buffer_->GetOffset(state->results_buffer),
- state->results_size);
-}
-
-void GLES2Implementation::GetMultipleIntegervOnCompleted(
- GetMultipleIntegervState* state) {
- memcpy(state->results, state->results_buffer, state->results_size);;
-}
-
-void GLES2Implementation::GetAllShaderPrecisionFormatsSetup(
- GetAllShaderPrecisionFormatsState* state) {
- state->transfer_buffer_size_needed =
- state->precision_params_count *
- sizeof(cmds::GetShaderPrecisionFormat::Result);
-}
-
-void GLES2Implementation::GetAllShaderPrecisionFormatsRequest(
- GetAllShaderPrecisionFormatsState* state) {
- typedef cmds::GetShaderPrecisionFormat::Result Result;
- Result* result = static_cast<Result*>(state->results_buffer);
-
- for (int i = 0; i < state->precision_params_count; i++) {
- result->success = false;
- helper_->GetShaderPrecisionFormat(state->precision_params[i][0],
- state->precision_params[i][1],
- transfer_buffer_->GetShmId(),
- transfer_buffer_->GetOffset(result));
- result++;
- }
-}
-
-void GLES2Implementation::GetAllShaderPrecisionFormatsOnCompleted(
- GetAllShaderPrecisionFormatsState* state) {
- typedef cmds::GetShaderPrecisionFormat::Result Result;
- Result* result = static_cast<Result*>(state->results_buffer);
-
- for (int i = 0; i < state->precision_params_count; i++) {
- if (result->success) {
- const GLStaticState::ShaderPrecisionKey key(
- state->precision_params[i][0], state->precision_params[i][1]);
- static_state_.shader_precisions[key] = *result;
- }
- result++;
- }
-}
-
void GLES2Implementation::GetProgramInfoCHROMIUMHelper(
GLuint program, std::vector<int8>* result) {
DCHECK(result);
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation.h ('k') | gpu/command_buffer/client/gles2_implementation_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698