Chromium Code Reviews| 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) { |