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

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

Issue 2163493002: Break glScheduleCALayerCHROMIUM into smaller functions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@temp37_cleanup_calayeroverlay
Patch Set: Rebase. Created 4 years, 5 months 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 6c45faae237d0a9c487f800282684d3e7b7b6c2b..dd94955c67c6bf543a43430b3ecca1bf84942da3 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -2286,6 +2286,16 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient {
SamplerState default_sampler_state_;
+ struct CALayerSharedState{
+ float opacity;
+ bool is_clipped;
+ gfx::Rect clip_rect;
+ int sorting_context_id;
+ gfx::Transform transform;
+ };
+
+ std::unique_ptr<CALayerSharedState> ca_layer_shared_state_;
+
DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl);
};
@@ -10733,6 +10743,39 @@ error::Error GLES2DecoderImpl::HandleScheduleOverlayPlaneCHROMIUM(
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleScheduleCALayerSharedStateCHROMIUM(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ const gles2::cmds::ScheduleCALayerSharedStateCHROMIUM& c =
+ *static_cast<const gles2::cmds::ScheduleCALayerSharedStateCHROMIUM*>(
+ cmd_data);
+
+ const GLfloat* mem = GetSharedMemoryAs<const GLfloat*>(c.shm_id, c.shm_offset,
+ 20 * sizeof(GLfloat));
+ if (!mem) {
+ return error::kOutOfBounds;
+ }
+ gfx::RectF clip_rect(mem[0], mem[1], mem[2], mem[3]);
+ gfx::Transform transform(mem[4], mem[8], mem[12], mem[16],
+ mem[5], mem[9], mem[13], mem[17],
+ mem[6], mem[10], mem[14], mem[18],
+ mem[7], mem[11], mem[15], mem[19]);
+ ca_layer_shared_state_.reset(new CALayerSharedState);
+ ca_layer_shared_state_->opacity = c.opacity;
+ ca_layer_shared_state_->is_clipped = c.is_clipped ? true : false;
+ ca_layer_shared_state_->clip_rect = gfx::ToEnclosingRect(clip_rect);
+ ca_layer_shared_state_->sorting_context_id = c.sorting_context_id;
+ ca_layer_shared_state_->transform = transform;
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleUnscheduleCALayerSharedStateCHROMIUM(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ ca_layer_shared_state_.reset();
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleScheduleCALayerCHROMIUM(
uint32_t immediate_data_size,
const void* cmd_data) {
@@ -10745,6 +10788,13 @@ error::Error GLES2DecoderImpl::HandleScheduleCALayerCHROMIUM(
return error::kNoError;
}
+ if (!ca_layer_shared_state_) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_VALUE, "glScheduleCALayerCHROMIUM",
+ "glScheduleCALayerSharedStateCHROMIUM has not been called");
+ return error::kNoError;
+ }
+
gl::GLImage* image = nullptr;
GLuint contents_texture_id = c.contents_texture_id;
if (contents_texture_id) {
@@ -10765,23 +10815,19 @@ error::Error GLES2DecoderImpl::HandleScheduleCALayerCHROMIUM(
}
const GLfloat* mem = GetSharedMemoryAs<const GLfloat*>(c.shm_id, c.shm_offset,
- 28 * sizeof(GLfloat));
+ 8 * sizeof(GLfloat));
if (!mem) {
return error::kOutOfBounds;
}
gfx::RectF contents_rect(mem[0], mem[1], mem[2], mem[3]);
gfx::RectF bounds_rect(mem[4], mem[5], mem[6], mem[7]);
- gfx::RectF clip_rect(mem[8], mem[9], mem[10], mem[11]);
- gfx::Transform transform(mem[12], mem[16], mem[20], mem[24],
- mem[13], mem[17], mem[21], mem[25],
- mem[14], mem[18], mem[22], mem[26],
- mem[15], mem[19], mem[23], mem[27]);
ui::CARendererLayerParams params = ui::CARendererLayerParams(
- c.is_clipped ? true : false, gfx::ToEnclosingRect(clip_rect),
- c.sorting_context_id, transform, image, contents_rect,
+ ca_layer_shared_state_->is_clipped, ca_layer_shared_state_->clip_rect,
+ ca_layer_shared_state_->sorting_context_id,
+ ca_layer_shared_state_->transform, image, contents_rect,
gfx::ToEnclosingRect(bounds_rect), c.background_color, c.edge_aa_mask,
- c.opacity, filter);
+ ca_layer_shared_state_->opacity, filter);
if (!surface_->ScheduleCALayer(params)) {
LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glScheduleCALayerCHROMIUM",
"failed to schedule CALayer");

Powered by Google App Engine
This is Rietveld 408576698