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 0bcdbd4a006d35702d96d3a24c7d114161ae144d..693f924ab81d83d41380c7bac546ed54faafa95b 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -1077,6 +1077,9 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
void DoMatrixLoadfCHROMIUM(GLenum matrix_mode, const GLfloat* matrix); |
void DoMatrixLoadIdentityCHROMIUM(GLenum matrix_mode); |
+ void DoScheduleCALayerFilterEffectsCHROMIUM( |
+ GLsizei count, |
+ const GLCALayerFilterEffect* filter_effects); |
void DoScheduleCALayerInUseQueryCHROMIUM(GLsizei count, |
const GLuint* textures); |
@@ -2039,6 +2042,10 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
// using GL_RGBA and glColorMask. |
bool ChromiumImageNeedsRGBEmulation(); |
+ // The GL_CHROMIUM_schedule_ca_layer extension requires that SwapBuffers and |
+ // equivalent functions reset shared state. |
+ void ClearScheduleCALayerState(); |
+ |
bool InitializeCopyTexImageBlitter(const char* function_name); |
bool InitializeCopyTextureCHROMIUM(const char* function_name); |
// Generate a member function prototype for each command in an automated and |
@@ -2299,6 +2306,7 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
}; |
std::unique_ptr<CALayerSharedState> ca_layer_shared_state_; |
+ std::vector<ui::CARendererLayerParams::FilterEffect> ca_layer_filter_effects_; |
DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl); |
}; |
@@ -10762,9 +10770,7 @@ error::Error GLES2DecoderImpl::HandlePostSubBufferCHROMIUM( |
is_offscreen ? offscreen_size_ : surface_->GetSize()); |
} |
- // The GL_CHROMIUM_schedule_ca_layer extension requires that SwapBuffers and |
- // equivalent functions reset shared state. |
- ca_layer_shared_state_.reset(); |
+ ClearScheduleCALayerState(); |
if (supports_async_swap_) { |
TRACE_EVENT_ASYNC_BEGIN0("cc", "GLES2DecoderImpl::AsyncSwapBuffers", this); |
@@ -10892,6 +10898,8 @@ error::Error GLES2DecoderImpl::HandleScheduleCALayerCHROMIUM( |
gfx::RectF contents_rect(mem[0], mem[1], mem[2], mem[3]); |
gfx::RectF bounds_rect(mem[4], mem[5], mem[6], mem[7]); |
+ // TODO(erikchen): Pass through filter effects. https://crbug.com/581526. |
+ ca_layer_filter_effects_.clear(); |
ui::CARendererLayerParams params = ui::CARendererLayerParams( |
ca_layer_shared_state_->is_clipped, ca_layer_shared_state_->clip_rect, |
ca_layer_shared_state_->sorting_context_id, |
@@ -10905,6 +10913,39 @@ error::Error GLES2DecoderImpl::HandleScheduleCALayerCHROMIUM( |
return error::kNoError; |
} |
+void GLES2DecoderImpl::DoScheduleCALayerFilterEffectsCHROMIUM( |
+ GLsizei count, |
+ const GLCALayerFilterEffect* filter_effects) { |
+ std::vector<ui::CARendererLayerParams::FilterEffect> effects; |
+ effects.reserve(count); |
+ for (GLsizei i = 0; i < count; ++i) { |
+ const GLCALayerFilterEffect& filter_effect = filter_effects[i]; |
+ ui::CARendererLayerParams::FilterEffectType filter_type = |
+ static_cast<ui::CARendererLayerParams::FilterEffectType>( |
+ filter_effect.type); |
+ if (filter_type < ui::CARendererLayerParams::FilterEffectType::MIN || |
+ filter_type > ui::CARendererLayerParams::FilterEffectType::MAX) { |
piman
2016/07/23 00:39:58
Could you do the check on filter_effect.type, befo
erikchen
2016/07/23 14:18:15
ah good point. done.
|
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, |
+ "glScheduleCALayerFilterEffectsCHROMIUM", |
+ "Invalid filter type."); |
+ return; |
+ } |
+ |
+ ui::CARendererLayerParams::FilterEffect& effect = effects[i]; |
+ effect.type = filter_type; |
+ effect.amount = filter_effect.amount; |
+ effect.drop_shadow_offset = gfx::Point(filter_effect.drop_shadow_offset_x, |
+ filter_effect.drop_shadow_offset_y); |
+ |
+ static_assert(sizeof(GLuint) == sizeof(SkColor), |
+ "GLuint and SkColor must have the same size."); |
+ effect.drop_shadow_color = |
+ static_cast<SkColor>(filter_effect.drop_shadow_color); |
+ } |
+ |
+ ca_layer_filter_effects_.swap(effects); |
+} |
+ |
void GLES2DecoderImpl::DoScheduleCALayerInUseQueryCHROMIUM( |
GLsizei count, |
const GLuint* textures) { |
@@ -13827,9 +13868,7 @@ void GLES2DecoderImpl::DoSwapBuffers() { |
is_offscreen ? offscreen_size_ : surface_->GetSize()); |
} |
- // The GL_CHROMIUM_schedule_ca_layer extension requires that SwapBuffers and |
- // equivalent functions reset shared state. |
- ca_layer_shared_state_.reset(); |
+ ClearScheduleCALayerState(); |
// If offscreen then don't actually SwapBuffers to the display. Just copy |
// the rendered frame to another frame buffer. |
@@ -13949,9 +13988,7 @@ void GLES2DecoderImpl::DoCommitOverlayPlanes() { |
"command not supported by surface"); |
return; |
} |
- // The GL_CHROMIUM_schedule_ca_layer extension requires that SwapBuffers and |
- // equivalent functions reset shared state. |
- ca_layer_shared_state_.reset(); |
+ ClearScheduleCALayerState(); |
if (supports_async_swap_) { |
surface_->CommitOverlayPlanesAsync(base::Bind( |
&GLES2DecoderImpl::FinishSwapBuffers, base::AsWeakPtr(this))); |
@@ -17386,6 +17423,11 @@ bool GLES2DecoderImpl::ChromiumImageNeedsRGBEmulation() { |
return factory ? !factory->SupportsFormatRGB() : false; |
} |
+void GLES2DecoderImpl::ClearScheduleCALayerState() { |
+ ca_layer_shared_state_.reset(); |
+ ca_layer_filter_effects_.clear(); |
+} |
+ |
error::Error GLES2DecoderImpl::HandleBindFragmentInputLocationCHROMIUMBucket( |
uint32_t immediate_data_size, |
const void* cmd_data) { |