Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
=================================================================== |
--- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 128216) |
+++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy) |
@@ -33,6 +33,7 @@ |
#include "gpu/command_buffer/service/feature_info.h" |
#include "gpu/command_buffer/service/framebuffer_manager.h" |
#include "gpu/command_buffer/service/gl_utils.h" |
+#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/program_manager.h" |
@@ -821,6 +822,12 @@ |
GLuint io_surface_id, |
GLuint plane); |
+ void DoCopyTextureCHROMIUM( |
+ GLenum target, |
+ GLuint source_id, |
+ GLuint target_id, |
+ GLint level); |
+ |
// Wrapper for TexStorage2DEXT. |
void DoTexStorage2DEXT( |
GLenum target, |
@@ -1227,6 +1234,9 @@ |
void DoVertexAttrib3fv(GLuint index, const GLfloat *v); |
void DoVertexAttrib4fv(GLuint index, const GLfloat *v); |
+ // Wrapper for glViewport |
+ void DoViewport(GLint x, GLint y, GLsizei width, GLsizei height); |
+ |
// Wrapper for glUseProgram |
void DoUseProgram(GLuint program); |
@@ -1427,6 +1437,12 @@ |
// unpack alignment as last set by glPixelStorei |
GLint unpack_alignment_; |
+ // unpack flip y as last set by glPixelStorei |
+ bool unpack_flip_y_; |
+ |
+ // unpack premultiply alpha as last set by glPixelStorei |
+ bool unpack_premultiply_alpha_; |
+ |
// The currently bound array buffer. If this is 0 it is illegal to call |
// glVertexAttribPointer. |
BufferManager::BufferInfo::Ref bound_array_buffer_; |
@@ -1479,6 +1495,7 @@ |
GLuint mask_stencil_back_; |
GLclampf clear_depth_; |
GLboolean mask_depth_; |
+ bool enable_cull_face_; |
bool enable_scissor_test_; |
bool enable_depth_test_; |
bool enable_stencil_test_; |
@@ -1582,6 +1599,12 @@ |
typedef std::vector<GLES2DecoderImpl*> ChildList; |
ChildList children_; |
+ scoped_ptr<CopyTextureCHROMIUMResourceManager> copy_texture_CHROMIUM_; |
+ |
+ // Cached values of the currently assigned viewport dimensions. |
+ GLint viewport_x_, viewport_y_; |
+ GLsizei viewport_width_, viewport_height_; |
+ |
DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl); |
}; |
@@ -1924,6 +1947,8 @@ |
error_bits_(0), |
pack_alignment_(4), |
unpack_alignment_(4), |
+ unpack_flip_y_(false), |
+ unpack_premultiply_alpha_(false), |
attrib_0_buffer_id_(0), |
attrib_0_buffer_matches_value_(true), |
attrib_0_size_(0), |
@@ -1943,6 +1968,7 @@ |
mask_stencil_back_(-1), |
clear_depth_(1.0f), |
mask_depth_(true), |
+ enable_cull_face_(false), |
enable_scissor_test_(false), |
enable_depth_test_(false), |
enable_stencil_test_(false), |
@@ -1971,7 +1997,11 @@ |
needs_glsl_built_in_function_emulation_(false), |
force_webgl_glsl_validation_(false), |
derivatives_explicitly_enabled_(false), |
- compile_shader_always_succeeds_(false) { |
+ compile_shader_always_succeeds_(false), |
+ viewport_x_(0), |
+ viewport_y_(0), |
+ viewport_width_(0), |
+ viewport_height_(0) { |
DCHECK(group); |
attrib_0_value_.v[0] = 0.0f; |
@@ -2046,8 +2076,12 @@ |
Destroy(); |
return false; |
} |
+ CHECK_GL_ERROR(); |
+ copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); |
+ copy_texture_CHROMIUM_->Initialize(); |
CHECK_GL_ERROR(); |
+ |
disallowed_features_ = disallowed_features; |
vertex_attrib_manager_.reset(new VertexAttribManager()); |
@@ -2270,6 +2304,13 @@ |
return false; |
} |
+ GLint viewport_params[4]; |
+ glGetIntegerv(GL_VIEWPORT, viewport_params); |
+ viewport_x_ = viewport_params[0]; |
+ viewport_y_ = viewport_params[1]; |
+ viewport_width_ = viewport_params[2]; |
+ viewport_height_ = viewport_params[3]; |
+ |
return true; |
} |
@@ -3295,6 +3336,8 @@ |
glStencilMaskSeparate(GL_FRONT, have_stencil ? mask_stencil_front_ : 0); |
glStencilMaskSeparate(GL_BACK, have_stencil ? mask_stencil_back_ : 0); |
EnableDisable(GL_STENCIL_TEST, enable_stencil_test_ && have_stencil); |
+ EnableDisable(GL_CULL_FACE, enable_cull_face_); |
+ EnableDisable(GL_SCISSOR_TEST, enable_scissor_test_); |
state_dirty_ = false; |
} |
} |
@@ -4097,6 +4140,9 @@ |
bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) { |
switch (cap) { |
+ case GL_CULL_FACE: |
+ enable_cull_face_ = enabled; |
+ return true; |
case GL_SCISSOR_TEST: |
enable_scissor_test_ = enabled; |
return true; |
@@ -6020,6 +6066,15 @@ |
return error::kNoError; |
} |
+void GLES2DecoderImpl::DoViewport(GLint x, GLint y, GLsizei width, |
+ GLsizei height) { |
+ viewport_x_ = x; |
greggman
2012/04/04 20:12:24
The viewport will be clipped to the max size and I
Jeff Timanus
2012/04/04 22:34:14
The arguments are validated against 0 in the auto-
|
+ viewport_y_ = y; |
+ viewport_width_ = width; |
+ viewport_height_ = height; |
+ glViewport(x, y, width, height); |
+} |
+ |
error::Error GLES2DecoderImpl::HandleVertexAttribDivisorANGLE( |
uint32 immediate_data_size, const gles2::VertexAttribDivisorANGLE& c) { |
if (!feature_info_->feature_flags().angle_instanced_arrays) { |
@@ -6232,6 +6287,12 @@ |
case GL_UNPACK_ALIGNMENT: |
unpack_alignment_ = param; |
break; |
+ case GL_UNPACK_FLIP_Y_CHROMIUM: |
+ unpack_flip_y_ = (param != 0); |
+ break; |
+ case GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM: |
+ unpack_premultiply_alpha_ = (param != 0); |
+ break; |
default: |
// Validation should have prevented us from getting here. |
NOTREACHED(); |
@@ -8311,6 +8372,61 @@ |
} |
} |
+void GLES2DecoderImpl::DoCopyTextureCHROMIUM( |
+ GLenum target, GLuint source_id, GLuint dest_id, GLint level) { |
+ TextureManager::TextureInfo* dest_info = GetTextureInfo(dest_id); |
+ TextureManager::TextureInfo* source_info = GetTextureInfo(source_id); |
+ |
+ if (!source_info || !dest_info) { |
+ SetGLError(GL_INVALID_VALUE, ""); |
greggman
2012/04/04 20:12:24
Do you mind filling out the "" here and below?
Jeff Timanus
2012/04/04 22:34:14
Done.
|
+ return; |
+ } |
+ |
+ if (GL_TEXTURE_2D != target) { |
+ SetGLError(GL_INVALID_VALUE, ""); |
+ return; |
+ } |
+ |
+ int source_width, source_height, dest_width, dest_height; |
+ if (!source_info->GetLevelSize(GL_TEXTURE_2D, level, &source_width, |
+ &source_height)) { |
+ SetGLError(GL_INVALID_VALUE, ""); |
+ return; |
+ } |
+ |
+ if (!dest_info->GetLevelSize(GL_TEXTURE_2D, level, &dest_width, |
+ &dest_height)) { |
+ SetGLError(GL_INVALID_VALUE, ""); |
+ return; |
+ } |
+ |
+ if (dest_width != source_width && dest_height != source_height) { |
greggman
2012/04/04 20:12:24
Should it be ok to copy to a new size? CopyTexImag
Jeff Timanus
2012/04/04 22:34:14
It should be ok to copy to a new size. I'm lookin
|
+ SetGLError(GL_INVALID_VALUE, ""); |
+ return; |
+ } |
+ |
+ state_dirty_ = true; |
+ glViewport(0, 0, dest_width, dest_height); |
+ copy_texture_CHROMIUM_->DoCopyTexture(target, source_info->service_id(), |
+ dest_info->service_id(), level, |
+ unpack_flip_y_, |
+ unpack_premultiply_alpha_); |
+ glViewport(viewport_x_, viewport_y_, viewport_width_, viewport_height_); |
+ |
+ // Restore all of the state touched by the extension. |
+ if (current_program_) |
+ glUseProgram(current_program_->service_id()); |
+ |
+ RestoreCurrentFramebufferBindings(); |
+ |
+ if (!bound_array_buffer_) |
+ glBindBuffer(GL_ARRAY_BUFFER, 0); |
+ else |
+ glBindBuffer(GL_ARRAY_BUFFER, bound_array_buffer_->service_id()); |
+ |
+ ApplyDirtyState(); |
greggman
2012/04/04 20:12:24
I get the impression more things need to be restor
Jeff Timanus
2012/04/04 22:34:14
Ongoing. I'll add the extra state tracking to dou
|
+} |
+ |
static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { |
switch (internalformat) { |
case GL_RGB565: |