| 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 2fad0053b50fcf7c655d36c7efde44a5f0034b62..28d3b576ef2fd9940ab0a360ea18ea879efa9fd8 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -52,7 +52,6 @@
|
| #include "gpu/command_buffer/service/shader_translator_cache.h"
|
| #include "gpu/command_buffer/service/stream_texture.h"
|
| #include "gpu/command_buffer/service/stream_texture_manager.h"
|
| -#include "gpu/command_buffer/service/texture_definition.h"
|
| #include "gpu/command_buffer/service/texture_manager.h"
|
| #include "gpu/command_buffer/service/vertex_attrib_manager.h"
|
| #include "gpu/command_buffer/service/vertex_array_manager.h"
|
| @@ -2261,25 +2260,6 @@ bool GLES2DecoderImpl::Initialize(
|
| if (!attrib_parser.Parse(attribs))
|
| return false;
|
|
|
| - // These are NOT if the back buffer has these proprorties. They are
|
| - // if we want the command buffer to enforce them regardless of what
|
| - // the real backbuffer is assuming the real back buffer gives us more than
|
| - // we ask for. In other words, if we ask for RGB and we get RGBA then we'll
|
| - // make it appear RGB. If on the other hand we ask for RGBA nd get RGB we
|
| - // can't do anything about that.
|
| -
|
| - GLint v = 0;
|
| - glGetIntegerv(GL_ALPHA_BITS, &v);
|
| - // This checks if the user requested RGBA and we have RGBA then RGBA. If the
|
| - // user requested RGB then RGB. If the user did not specify a preference than
|
| - // use whatever we were given. Same for DEPTH and STENCIL.
|
| - back_buffer_color_format_ =
|
| - (attrib_parser.alpha_size_ != 0 && v > 0) ? GL_RGBA : GL_RGB;
|
| - glGetIntegerv(GL_DEPTH_BITS, &v);
|
| - back_buffer_has_depth_ = attrib_parser.depth_size_ != 0 && v > 0;
|
| - glGetIntegerv(GL_STENCIL_BITS, &v);
|
| - back_buffer_has_stencil_ = attrib_parser.stencil_size_ != 0 && v > 0;
|
| -
|
| if (offscreen) {
|
| if (attrib_parser.samples_ > 0 && attrib_parser.sample_buffers_ > 0 &&
|
| features().chromium_framebuffer_multisample) {
|
| @@ -2408,6 +2388,26 @@ bool GLES2DecoderImpl::Initialize(
|
| // Bind to the new default frame buffer (the offscreen target frame buffer).
|
| // This should now be associated with ID zero.
|
| DoBindFramebuffer(GL_FRAMEBUFFER, 0);
|
| + } else {
|
| + glBindFramebufferEXT(GL_FRAMEBUFFER, GetBackbufferServiceId());
|
| + // These are NOT if the back buffer has these proprorties. They are
|
| + // if we want the command buffer to enforce them regardless of what
|
| + // the real backbuffer is assuming the real back buffer gives us more than
|
| + // we ask for. In other words, if we ask for RGB and we get RGBA then we'll
|
| + // make it appear RGB. If on the other hand we ask for RGBA nd get RGB we
|
| + // can't do anything about that.
|
| +
|
| + GLint v = 0;
|
| + glGetIntegerv(GL_ALPHA_BITS, &v);
|
| + // This checks if the user requested RGBA and we have RGBA then RGBA. If the
|
| + // user requested RGB then RGB. If the user did not specify a preference
|
| + // than use whatever we were given. Same for DEPTH and STENCIL.
|
| + back_buffer_color_format_ =
|
| + (attrib_parser.alpha_size_ != 0 && v > 0) ? GL_RGBA : GL_RGB;
|
| + glGetIntegerv(GL_DEPTH_BITS, &v);
|
| + back_buffer_has_depth_ = attrib_parser.depth_size_ != 0 && v > 0;
|
| + glGetIntegerv(GL_STENCIL_BITS, &v);
|
| + back_buffer_has_stencil_ = attrib_parser.stencil_size_ != 0 && v > 0;
|
| }
|
|
|
| // OpenGL ES 2.0 implicitly enables the desktop GL capability
|
| @@ -3234,10 +3234,10 @@ bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent,
|
| parent_->children_.erase(it);
|
| // First check the texture has been mapped into the parent. This might not
|
| // be the case if initialization failed midway through.
|
| - GLuint service_id = offscreen_saved_color_texture_->id();
|
| - GLuint client_id = 0;
|
| - if (parent_->texture_manager()->GetClientId(service_id, &client_id)) {
|
| - parent_->texture_manager()->RemoveTexture(client_id);
|
| + if (offscreen_saved_color_texture_info_ &&
|
| + offscreen_saved_color_texture_info_->client_id()) {
|
| + parent_->texture_manager()->RemoveTexture(
|
| + offscreen_saved_color_texture_info_->client_id());
|
| }
|
| }
|
|
|
| @@ -3704,9 +3704,8 @@ void GLES2DecoderImpl::RestoreFramebufferBindings() const {
|
| }
|
|
|
| void GLES2DecoderImpl::RestoreTextureState(unsigned service_id) const {
|
| - GLuint client_id = 0;
|
| - if (texture_manager()->GetClientId(service_id, &client_id)) {
|
| - Texture* texture = GetTexture(client_id)->texture();
|
| + Texture* texture = texture_manager()->GetTextureForServiceId(service_id);
|
| + if (texture) {
|
| GLenum target = texture->target();
|
| glBindTexture(target, service_id);
|
| glTexParameteri(
|
| @@ -4213,10 +4212,7 @@ bool GLES2DecoderImpl::GetHelper(
|
| Renderbuffer* renderbuffer =
|
| GetRenderbufferInfoForTarget(GL_RENDERBUFFER);
|
| if (renderbuffer) {
|
| - GLuint client_id = 0;
|
| - renderbuffer_manager()->GetClientId(
|
| - renderbuffer->service_id(), &client_id);
|
| - *params = client_id;
|
| + *params = renderbuffer->client_id();
|
| } else {
|
| *params = 0;
|
| }
|
| @@ -4253,10 +4249,7 @@ bool GLES2DecoderImpl::GetHelper(
|
| if (params) {
|
| TextureUnit& unit = state_.texture_units[state_.active_texture_unit];
|
| if (unit.bound_texture_2d) {
|
| - GLuint client_id = 0;
|
| - texture_manager()->GetClientId(
|
| - unit.bound_texture_2d->service_id(), &client_id);
|
| - *params = client_id;
|
| + *params = unit.bound_texture_2d->client_id();
|
| } else {
|
| *params = 0;
|
| }
|
| @@ -4267,10 +4260,7 @@ bool GLES2DecoderImpl::GetHelper(
|
| if (params) {
|
| TextureUnit& unit = state_.texture_units[state_.active_texture_unit];
|
| if (unit.bound_texture_cube_map) {
|
| - GLuint client_id = 0;
|
| - texture_manager()->GetClientId(
|
| - unit.bound_texture_cube_map->service_id(), &client_id);
|
| - *params = client_id;
|
| + *params = unit.bound_texture_cube_map->client_id();
|
| } else {
|
| *params = 0;
|
| }
|
| @@ -4281,10 +4271,7 @@ bool GLES2DecoderImpl::GetHelper(
|
| if (params) {
|
| TextureUnit& unit = state_.texture_units[state_.active_texture_unit];
|
| if (unit.bound_texture_external_oes) {
|
| - GLuint client_id = 0;
|
| - texture_manager()->GetClientId(
|
| - unit.bound_texture_external_oes->service_id(), &client_id);
|
| - *params = client_id;
|
| + *params = unit.bound_texture_external_oes->client_id();
|
| } else {
|
| *params = 0;
|
| }
|
| @@ -4295,10 +4282,7 @@ bool GLES2DecoderImpl::GetHelper(
|
| if (params) {
|
| TextureUnit& unit = state_.texture_units[state_.active_texture_unit];
|
| if (unit.bound_texture_rectangle_arb) {
|
| - GLuint client_id = 0;
|
| - texture_manager()->GetClientId(
|
| - unit.bound_texture_rectangle_arb->service_id(), &client_id);
|
| - *params = client_id;
|
| + *params = unit.bound_texture_rectangle_arb->client_id();
|
| } else {
|
| *params = 0;
|
| }
|
| @@ -4932,25 +4916,12 @@ void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv(
|
| "glFramebufferAttachmentParameteriv", "no framebuffer bound");
|
| return;
|
| }
|
| - glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params);
|
| if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) {
|
| - GLint type = 0;
|
| - GLuint client_id = 0;
|
| - glGetFramebufferAttachmentParameterivEXT(
|
| - target, attachment, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type);
|
| - switch (type) {
|
| - case GL_RENDERBUFFER: {
|
| - renderbuffer_manager()->GetClientId(*params, &client_id);
|
| - break;
|
| - }
|
| - case GL_TEXTURE: {
|
| - texture_manager()->GetClientId(*params, &client_id);
|
| - break;
|
| - }
|
| - default:
|
| - break;
|
| - }
|
| - *params = client_id;
|
| + const Framebuffer::Attachment* attachment_object =
|
| + framebuffer->GetAttachment(attachment);
|
| + *params = attachment_object ? attachment_object->object_name() : 0;
|
| + } else {
|
| + glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params);
|
| }
|
| }
|
|
|
| @@ -9858,8 +9829,8 @@ void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target,
|
| return;
|
| }
|
|
|
| - TextureDefinition* definition = texture_manager()->Save(texture_ref);
|
| - if (!definition) {
|
| + Texture* produced = texture_manager()->Produce(texture_ref);
|
| + if (!produced) {
|
| LOCAL_SET_GL_ERROR(
|
| GL_INVALID_OPERATION,
|
| "glProduceTextureCHROMIUM", "invalid texture");
|
| @@ -9869,18 +9840,12 @@ void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target,
|
| if (!group_->mailbox_manager()->ProduceTexture(
|
| target,
|
| *reinterpret_cast<const MailboxName*>(mailbox),
|
| - definition,
|
| - texture_manager())) {
|
| - bool success = texture_manager()->Restore(
|
| - "glProductTextureCHROMIUM", this, texture_ref, definition);
|
| - DCHECK(success);
|
| + produced)) {
|
| LOCAL_SET_GL_ERROR(
|
| GL_INVALID_OPERATION,
|
| "glProduceTextureCHROMIUM", "invalid mailbox name");
|
| return;
|
| }
|
| -
|
| - glBindTexture(texture_ref->texture()->target(), texture_ref->service_id());
|
| }
|
|
|
| void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target,
|
| @@ -9889,32 +9854,61 @@ void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target,
|
| "context", logger_.GetLogPrefix(),
|
| "mailbox[0]", static_cast<unsigned char>(mailbox[0]));
|
|
|
| - TextureRef* texture_ref = GetTextureInfoForTarget(target);
|
| + scoped_refptr<TextureRef> texture_ref =
|
| + GetTextureInfoForTargetUnlessDefault(target);
|
| if (!texture_ref) {
|
| LOCAL_SET_GL_ERROR(
|
| GL_INVALID_OPERATION,
|
| "glConsumeTextureCHROMIUM", "unknown texture for target");
|
| return;
|
| }
|
| -
|
| - scoped_ptr<TextureDefinition> definition(
|
| + GLuint client_id = texture_ref->client_id();
|
| + if (!client_id) {
|
| + LOCAL_SET_GL_ERROR(
|
| + GL_INVALID_OPERATION,
|
| + "glConsumeTextureCHROMIUM", "unknown texture for target");
|
| + return;
|
| + }
|
| + Texture* texture =
|
| group_->mailbox_manager()->ConsumeTexture(
|
| target,
|
| - *reinterpret_cast<const MailboxName*>(mailbox)));
|
| - if (!definition.get()) {
|
| + *reinterpret_cast<const MailboxName*>(mailbox));
|
| + if (!texture) {
|
| LOCAL_SET_GL_ERROR(
|
| GL_INVALID_OPERATION,
|
| "glConsumeTextureCHROMIUM", "invalid mailbox name");
|
| return;
|
| }
|
| -
|
| - if (!texture_manager()->Restore(
|
| - "glConsumeTextureCHROMIUM", this, texture_ref, definition.release())) {
|
| + if (texture->target() != target) {
|
| LOCAL_SET_GL_ERROR(
|
| GL_INVALID_OPERATION,
|
| - "glConsumeTextureCHROMIUM", "invalid texture");
|
| + "glConsumeTextureCHROMIUM", "invalid target");
|
| return;
|
| }
|
| +
|
| + DeleteTexturesHelper(1, &client_id);
|
| + texture_ref = texture_manager()->Consume(client_id, texture);
|
| + glBindTexture(target, texture_ref->service_id());
|
| +
|
| + TextureUnit& unit = state_.texture_units[state_.active_texture_unit];
|
| + unit.bind_target = target;
|
| + switch (target) {
|
| + case GL_TEXTURE_2D:
|
| + unit.bound_texture_2d = texture_ref;
|
| + break;
|
| + case GL_TEXTURE_CUBE_MAP:
|
| + unit.bound_texture_cube_map = texture_ref;
|
| + break;
|
| + case GL_TEXTURE_EXTERNAL_OES:
|
| + unit.bound_texture_external_oes = texture_ref;
|
| + break;
|
| + case GL_TEXTURE_RECTANGLE_ARB:
|
| + unit.bound_texture_rectangle_arb = texture_ref;
|
| + break;
|
| + default:
|
| + NOTREACHED(); // Validation should prevent us getting here.
|
| + break;
|
| + }
|
| }
|
|
|
| void GLES2DecoderImpl::DoInsertEventMarkerEXT(
|
|
|