| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| ===================================================================
|
| --- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 134729)
|
| +++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy)
|
| @@ -36,6 +36,7 @@
|
| #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h"
|
| #include "gpu/command_buffer/service/gles2_cmd_validation.h"
|
| #include "gpu/command_buffer/service/gpu_switches.h"
|
| +#include "gpu/command_buffer/service/mailbox_manager.h"
|
| #include "gpu/command_buffer/service/program_manager.h"
|
| #include "gpu/command_buffer/service/query_manager.h"
|
| #include "gpu/command_buffer/service/renderbuffer_manager.h"
|
| @@ -43,6 +44,7 @@
|
| #include "gpu/command_buffer/service/shader_translator.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 "ui/gfx/gl/gl_context.h"
|
| @@ -509,6 +511,9 @@
|
| // Sets DEPTH_TEST, STENCIL_TEST and color mask for the current framebuffer.
|
| void ApplyDirtyState();
|
|
|
| + // Reapply the texture parameters to the given texture.
|
| + void BindAndApplyTextureParameters(TextureManager::TextureInfo* info);
|
| +
|
| // These check the state of the currently bound framebuffer or the
|
| // backbuffer if no framebuffer is bound.
|
| bool BoundFramebufferHasColorAttachmentWithAlpha();
|
| @@ -619,6 +624,10 @@
|
| return group_->texture_manager();
|
| }
|
|
|
| + MailboxManager* mailbox_manager() {
|
| + return group_->mailbox_manager();
|
| + }
|
| +
|
| bool IsOffscreenBufferMultisampled() const {
|
| return offscreen_target_samples_ > 1;
|
| }
|
| @@ -742,6 +751,9 @@
|
| GLsizei width,
|
| GLsizei height);
|
|
|
| + void DoProduceTextureCHROMIUM(GLenum target, const GLbyte* key);
|
| + void DoConsumeTextureCHROMIUM(GLenum target, const GLbyte* key);
|
| +
|
| // Creates a ProgramInfo for the given program.
|
| ProgramManager::ProgramInfo* CreateProgramInfo(
|
| GLuint client_id, GLuint service_id) {
|
| @@ -3265,6 +3277,15 @@
|
| }
|
| }
|
|
|
| +void GLES2DecoderImpl::BindAndApplyTextureParameters(
|
| + TextureManager::TextureInfo* info) {
|
| + glBindTexture(info->target(), info->service_id());
|
| + glTexParameteri(info->target(), GL_TEXTURE_MIN_FILTER, info->min_filter());
|
| + glTexParameteri(info->target(), GL_TEXTURE_MAG_FILTER, info->mag_filter());
|
| + glTexParameteri(info->target(), GL_TEXTURE_WRAP_S, info->wrap_s());
|
| + glTexParameteri(info->target(), GL_TEXTURE_WRAP_T, info->wrap_t());
|
| +}
|
| +
|
| GLuint GLES2DecoderImpl::GetBackbufferServiceId() {
|
| return (offscreen_target_frame_buffer_.get()) ?
|
| offscreen_target_frame_buffer_->id() :
|
| @@ -8507,6 +8528,78 @@
|
| }
|
| }
|
|
|
| +error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM(
|
| + uint32 immediate_data_size, const gles2::GenMailboxCHROMIUM& c) {
|
| + MailboxName name;
|
| + mailbox_manager()->GenerateMailboxName(&name);
|
| + uint32 bucket_id = static_cast<uint32>(c.bucket_id);
|
| + Bucket* bucket = CreateBucket(bucket_id);
|
| +
|
| + bucket->SetSize(GL_MAILBOX_SIZE_CHROMIUM);
|
| + bucket->SetData(&name, 0, GL_MAILBOX_SIZE_CHROMIUM);
|
| +
|
| + return error::kNoError;
|
| +}
|
| +
|
| +void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target,
|
| + const GLbyte* mailbox) {
|
| + TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
|
| + if (!info) {
|
| + SetGLError(GL_INVALID_OPERATION,
|
| + "glProduceTextureCHROMIUM: unknown texture for target");
|
| + return;
|
| + }
|
| +
|
| + TextureDefinition* definition = texture_manager()->Save(info);
|
| + if (!definition) {
|
| + SetGLError(GL_INVALID_OPERATION,
|
| + "glProduceTextureCHROMIUM: invalid texture");
|
| + return;
|
| + }
|
| +
|
| + if (!group_->mailbox_manager()->ProduceTexture(
|
| + target,
|
| + *reinterpret_cast<const MailboxName*>(mailbox),
|
| + definition,
|
| + texture_manager())) {
|
| + bool success = texture_manager()->Restore(info, definition);
|
| + DCHECK(success);
|
| + SetGLError(GL_INVALID_OPERATION,
|
| + "glProduceTextureCHROMIUM: invalid mailbox name");
|
| + return;
|
| + }
|
| +
|
| + BindAndApplyTextureParameters(info);
|
| +}
|
| +
|
| +void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target,
|
| + const GLbyte* mailbox) {
|
| + TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
|
| + if (!info) {
|
| + SetGLError(GL_INVALID_OPERATION,
|
| + "glConsumeTextureCHROMIUM: unknown texture for target");
|
| + return;
|
| + }
|
| +
|
| + scoped_ptr<TextureDefinition> definition(
|
| + group_->mailbox_manager()->ConsumeTexture(
|
| + target,
|
| + *reinterpret_cast<const MailboxName*>(mailbox)));
|
| + if (!definition.get()) {
|
| + SetGLError(GL_INVALID_OPERATION,
|
| + "glConsumeTextureCHROMIUM: invalid mailbox name");
|
| + return;
|
| + }
|
| +
|
| + if (!texture_manager()->Restore(info, definition.release())) {
|
| + SetGLError(GL_INVALID_OPERATION,
|
| + "glConsumeTextureCHROMIUM: invalid texture");
|
| + return;
|
| + }
|
| +
|
| + BindAndApplyTextureParameters(info);
|
| +}
|
| +
|
| // Include the auto-generated part of this file. We split this because it means
|
| // we can easily edit the non-auto generated parts right here in this file
|
| // instead of having to edit some template or the code generator.
|
|
|