| Index: gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
|
| index f3a19dc7527d93446ccadc38cbbb9e8ac4fbca2c..36ad16d4ed2326fbba50900c8f673697b2603aee 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
|
| @@ -11,6 +11,52 @@
|
| namespace gpu {
|
| namespace gles2 {
|
|
|
| +namespace {
|
| +template <typename ClientType, typename ServiceType, typename DeleteFunction>
|
| +void DeleteServiceObjects(ClientServiceMap<ClientType, ServiceType>* id_map,
|
| + bool have_context,
|
| + DeleteFunction delete_function) {
|
| + if (have_context) {
|
| + for (auto client_service_id_pair : *id_map) {
|
| + delete_function(client_service_id_pair.second);
|
| + }
|
| + }
|
| +
|
| + id_map->Clear();
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +
|
| +PassthroughResources::PassthroughResources() {}
|
| +
|
| +PassthroughResources::~PassthroughResources() {}
|
| +
|
| +void PassthroughResources::Destroy(bool have_context) {
|
| + DeleteServiceObjects(&texture_id_map, have_context,
|
| + [](GLuint texture) { glDeleteTextures(1, &texture); });
|
| + DeleteServiceObjects(&buffer_id_map, have_context,
|
| + [](GLuint buffer) { glDeleteBuffersARB(1, &buffer); });
|
| + DeleteServiceObjects(
|
| + &renderbuffer_id_map, have_context,
|
| + [](GLuint renderbuffer) { glDeleteRenderbuffersEXT(1, &renderbuffer); });
|
| + DeleteServiceObjects(&sampler_id_map, have_context,
|
| + [](GLuint sampler) { glDeleteSamplers(1, &sampler); });
|
| + DeleteServiceObjects(&program_id_map, have_context,
|
| + [](GLuint program) { glDeleteProgram(program); });
|
| + DeleteServiceObjects(&shader_id_map, have_context,
|
| + [](GLuint shader) { glDeleteShader(shader); });
|
| + DeleteServiceObjects(&sync_id_map, have_context, [](uintptr_t sync) {
|
| + glDeleteSync(reinterpret_cast<GLsync>(sync));
|
| + });
|
| +
|
| + if (!have_context) {
|
| + for (auto passthrough_texture : texture_object_map) {
|
| + passthrough_texture.second->MarkContextLost();
|
| + }
|
| + }
|
| + texture_object_map.clear();
|
| +}
|
| +
|
| GLES2DecoderPassthroughImpl::GLES2DecoderPassthroughImpl(ContextGroup* group)
|
| : commands_to_process_(0),
|
| debug_marker_manager_(),
|
| @@ -113,6 +159,19 @@ bool GLES2DecoderPassthroughImpl::Initialize(
|
|
|
| image_manager_.reset(new ImageManager());
|
|
|
| + bind_generates_resource_ = group_->bind_generates_resource();
|
| +
|
| + resources_ = group_->passthrough_resources();
|
| +
|
| + mailbox_manager_ = group_->mailbox_manager();
|
| +
|
| + // Query information about the texture units
|
| + GLint num_texture_units = 0;
|
| + glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &num_texture_units);
|
| +
|
| + active_texture_unit_ = 0;
|
| + bound_textures_.resize(num_texture_units, 0);
|
| +
|
| set_initialized();
|
| return true;
|
| }
|
| @@ -122,6 +181,24 @@ void GLES2DecoderPassthroughImpl::Destroy(bool have_context) {
|
| image_manager_->Destroy(have_context);
|
| image_manager_.reset();
|
| }
|
| +
|
| + DeleteServiceObjects(
|
| + &framebuffer_id_map_, have_context,
|
| + [](GLuint framebuffer) { glDeleteFramebuffersEXT(1, &framebuffer); });
|
| + DeleteServiceObjects(&transform_feedback_id_map_, have_context,
|
| + [](GLuint transform_feedback) {
|
| + glDeleteTransformFeedbacks(1, &transform_feedback);
|
| + });
|
| + DeleteServiceObjects(&query_id_map_, have_context,
|
| + [](GLuint query) { glDeleteQueries(1, &query); });
|
| + DeleteServiceObjects(
|
| + &vertex_array_id_map_, have_context,
|
| + [](GLuint vertex_array) { glDeleteVertexArraysOES(1, &vertex_array); });
|
| +
|
| + if (group_) {
|
| + group_->Destroy(this, have_context);
|
| + group_ = nullptr;
|
| + }
|
| }
|
|
|
| void GLES2DecoderPassthroughImpl::SetSurface(
|
| @@ -175,11 +252,11 @@ gl::GLContext* GLES2DecoderPassthroughImpl::GetGLContext() {
|
| }
|
|
|
| gpu::gles2::ContextGroup* GLES2DecoderPassthroughImpl::GetContextGroup() {
|
| - return nullptr;
|
| + return group_.get();
|
| }
|
|
|
| const FeatureInfo* GLES2DecoderPassthroughImpl::GetFeatureInfo() const {
|
| - return nullptr;
|
| + return group_->feature_info();
|
| }
|
|
|
| gpu::Capabilities GLES2DecoderPassthroughImpl::GetCapabilities() {
|
| @@ -294,10 +371,14 @@ size_t GLES2DecoderPassthroughImpl::GetCreatedBackTextureCountForTest() {
|
| }
|
|
|
| void GLES2DecoderPassthroughImpl::SetFenceSyncReleaseCallback(
|
| - const FenceSyncReleaseCallback& callback) {}
|
| + const FenceSyncReleaseCallback& callback) {
|
| + fence_sync_release_callback_ = callback;
|
| +}
|
|
|
| void GLES2DecoderPassthroughImpl::SetWaitFenceSyncCallback(
|
| - const WaitFenceSyncCallback& callback) {}
|
| + const WaitFenceSyncCallback& callback) {
|
| + wait_fence_sync_callback_ = callback;
|
| +}
|
|
|
| void GLES2DecoderPassthroughImpl::SetDescheduleUntilFinishedCallback(
|
| const NoParamCallback& callback) {}
|
| @@ -344,7 +425,8 @@ void GLES2DecoderPassthroughImpl::PerformPollingWork() {}
|
| bool GLES2DecoderPassthroughImpl::GetServiceTextureId(
|
| uint32_t client_texture_id,
|
| uint32_t* service_texture_id) {
|
| - return false;
|
| + return resources_->texture_id_map.GetServiceID(client_texture_id,
|
| + service_texture_id);
|
| }
|
|
|
| gpu::error::ContextLostReason
|
|
|