| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <list> | 10 #include <list> |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 } | 137 } |
| 138 | 138 |
| 139 // A struct to hold info about each command. | 139 // A struct to hold info about each command. |
| 140 struct CommandInfo { | 140 struct CommandInfo { |
| 141 int arg_flags; // How to handle the arguments for this command | 141 int arg_flags; // How to handle the arguments for this command |
| 142 int arg_count; // How many arguments are expected for this command. | 142 int arg_count; // How many arguments are expected for this command. |
| 143 }; | 143 }; |
| 144 | 144 |
| 145 // A table of CommandInfo for all the commands. | 145 // A table of CommandInfo for all the commands. |
| 146 const CommandInfo g_command_info[] = { | 146 const CommandInfo g_command_info[] = { |
| 147 #define GLES2_CMD_OP(name) { \ | 147 #define GLES2_CMD_OP(name) { \ |
| 148 name::kArgFlags, \ | 148 cmds::name::kArgFlags, \ |
| 149 sizeof(name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */ \ | 149 sizeof(cmds::name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */ \ |
| 150 | 150 |
| 151 GLES2_COMMAND_LIST(GLES2_CMD_OP) | 151 GLES2_COMMAND_LIST(GLES2_CMD_OP) |
| 152 | 152 |
| 153 #undef GLES2_CMD_OP | 153 #undef GLES2_CMD_OP |
| 154 }; | 154 }; |
| 155 | 155 |
| 156 // Return true if a character belongs to the ASCII subset as defined in | 156 // Return true if a character belongs to the ASCII subset as defined in |
| 157 // GLSL ES 1.0 spec section 3.1. | 157 // GLSL ES 1.0 spec section 3.1. |
| 158 static bool CharacterIsValidForGLES(unsigned char c) { | 158 static bool CharacterIsValidForGLES(unsigned char c) { |
| 159 // Printing characters are valid except " $ ` @ \ ' DEL. | 159 // Printing characters are valid except " $ ` @ \ ' DEL. |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 explicit ScopedTextureUploadTimer(GLES2DecoderImpl* decoder); | 342 explicit ScopedTextureUploadTimer(GLES2DecoderImpl* decoder); |
| 343 ~ScopedTextureUploadTimer(); | 343 ~ScopedTextureUploadTimer(); |
| 344 | 344 |
| 345 private: | 345 private: |
| 346 GLES2DecoderImpl* decoder_; | 346 GLES2DecoderImpl* decoder_; |
| 347 base::TimeTicks begin_time_; | 347 base::TimeTicks begin_time_; |
| 348 DISALLOW_COPY_AND_ASSIGN(ScopedTextureUploadTimer); | 348 DISALLOW_COPY_AND_ASSIGN(ScopedTextureUploadTimer); |
| 349 }; | 349 }; |
| 350 | 350 |
| 351 // Encapsulates an OpenGL texture. | 351 // Encapsulates an OpenGL texture. |
| 352 class Texture { | 352 class BackTexture { |
| 353 public: | 353 public: |
| 354 explicit Texture(GLES2DecoderImpl* decoder); | 354 explicit BackTexture(GLES2DecoderImpl* decoder); |
| 355 ~Texture(); | 355 ~BackTexture(); |
| 356 | 356 |
| 357 // Create a new render texture. | 357 // Create a new render texture. |
| 358 void Create(); | 358 void Create(); |
| 359 | 359 |
| 360 // Set the initial size and format of a render texture or resize it. | 360 // Set the initial size and format of a render texture or resize it. |
| 361 bool AllocateStorage(const gfx::Size& size, GLenum format, bool zero); | 361 bool AllocateStorage(const gfx::Size& size, GLenum format, bool zero); |
| 362 | 362 |
| 363 // Copy the contents of the currently bound frame buffer. | 363 // Copy the contents of the currently bound frame buffer. |
| 364 void Copy(const gfx::Size& size, GLenum format); | 364 void Copy(const gfx::Size& size, GLenum format); |
| 365 | 365 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 382 size_t estimated_size() const { | 382 size_t estimated_size() const { |
| 383 return memory_tracker_.GetMemRepresented(); | 383 return memory_tracker_.GetMemRepresented(); |
| 384 } | 384 } |
| 385 | 385 |
| 386 private: | 386 private: |
| 387 GLES2DecoderImpl* decoder_; | 387 GLES2DecoderImpl* decoder_; |
| 388 MemoryTypeTracker memory_tracker_; | 388 MemoryTypeTracker memory_tracker_; |
| 389 size_t bytes_allocated_; | 389 size_t bytes_allocated_; |
| 390 GLuint id_; | 390 GLuint id_; |
| 391 gfx::Size size_; | 391 gfx::Size size_; |
| 392 DISALLOW_COPY_AND_ASSIGN(Texture); | 392 DISALLOW_COPY_AND_ASSIGN(BackTexture); |
| 393 }; | 393 }; |
| 394 | 394 |
| 395 // Encapsulates an OpenGL render buffer of any format. | 395 // Encapsulates an OpenGL render buffer of any format. |
| 396 class RenderBuffer { | 396 class BackRenderbuffer { |
| 397 public: | 397 public: |
| 398 explicit RenderBuffer(GLES2DecoderImpl* decoder); | 398 explicit BackRenderbuffer(GLES2DecoderImpl* decoder); |
| 399 ~RenderBuffer(); | 399 ~BackRenderbuffer(); |
| 400 | 400 |
| 401 // Create a new render buffer. | 401 // Create a new render buffer. |
| 402 void Create(); | 402 void Create(); |
| 403 | 403 |
| 404 // Set the initial size and format of a render buffer or resize it. | 404 // Set the initial size and format of a render buffer or resize it. |
| 405 bool AllocateStorage(const gfx::Size& size, GLenum format, GLsizei samples); | 405 bool AllocateStorage(const gfx::Size& size, GLenum format, GLsizei samples); |
| 406 | 406 |
| 407 // Destroy the render buffer. This must be explicitly called before destroying | 407 // Destroy the render buffer. This must be explicitly called before destroying |
| 408 // this object. | 408 // this object. |
| 409 void Destroy(); | 409 void Destroy(); |
| 410 | 410 |
| 411 // Invalidate the render buffer. This can be used when a context is lost and | 411 // Invalidate the render buffer. This can be used when a context is lost and |
| 412 // it is not possible to make it current in order to free the resource. | 412 // it is not possible to make it current in order to free the resource. |
| 413 void Invalidate(); | 413 void Invalidate(); |
| 414 | 414 |
| 415 GLuint id() const { | 415 GLuint id() const { |
| 416 return id_; | 416 return id_; |
| 417 } | 417 } |
| 418 | 418 |
| 419 size_t estimated_size() const { | 419 size_t estimated_size() const { |
| 420 return memory_tracker_.GetMemRepresented(); | 420 return memory_tracker_.GetMemRepresented(); |
| 421 } | 421 } |
| 422 | 422 |
| 423 private: | 423 private: |
| 424 GLES2DecoderImpl* decoder_; | 424 GLES2DecoderImpl* decoder_; |
| 425 MemoryTypeTracker memory_tracker_; | 425 MemoryTypeTracker memory_tracker_; |
| 426 size_t bytes_allocated_; | 426 size_t bytes_allocated_; |
| 427 GLuint id_; | 427 GLuint id_; |
| 428 DISALLOW_COPY_AND_ASSIGN(RenderBuffer); | 428 DISALLOW_COPY_AND_ASSIGN(BackRenderbuffer); |
| 429 }; | 429 }; |
| 430 | 430 |
| 431 // Encapsulates an OpenGL frame buffer. | 431 // Encapsulates an OpenGL frame buffer. |
| 432 class FrameBuffer { | 432 class BackFramebuffer { |
| 433 public: | 433 public: |
| 434 explicit FrameBuffer(GLES2DecoderImpl* decoder); | 434 explicit BackFramebuffer(GLES2DecoderImpl* decoder); |
| 435 ~FrameBuffer(); | 435 ~BackFramebuffer(); |
| 436 | 436 |
| 437 // Create a new frame buffer. | 437 // Create a new frame buffer. |
| 438 void Create(); | 438 void Create(); |
| 439 | 439 |
| 440 // Attach a color render buffer to a frame buffer. | 440 // Attach a color render buffer to a frame buffer. |
| 441 void AttachRenderTexture(Texture* texture); | 441 void AttachRenderTexture(BackTexture* texture); |
| 442 | 442 |
| 443 // Attach a render buffer to a frame buffer. Note that this unbinds any | 443 // Attach a render buffer to a frame buffer. Note that this unbinds any |
| 444 // currently bound frame buffer. | 444 // currently bound frame buffer. |
| 445 void AttachRenderBuffer(GLenum target, RenderBuffer* render_buffer); | 445 void AttachRenderBuffer(GLenum target, BackRenderbuffer* render_buffer); |
| 446 | 446 |
| 447 // Destroy the frame buffer. This must be explicitly called before destroying | 447 // Destroy the frame buffer. This must be explicitly called before destroying |
| 448 // this object. | 448 // this object. |
| 449 void Destroy(); | 449 void Destroy(); |
| 450 | 450 |
| 451 // Invalidate the frame buffer. This can be used when a context is lost and it | 451 // Invalidate the frame buffer. This can be used when a context is lost and it |
| 452 // is not possible to make it current in order to free the resource. | 452 // is not possible to make it current in order to free the resource. |
| 453 void Invalidate(); | 453 void Invalidate(); |
| 454 | 454 |
| 455 // See glCheckFramebufferStatusEXT. | 455 // See glCheckFramebufferStatusEXT. |
| 456 GLenum CheckStatus(); | 456 GLenum CheckStatus(); |
| 457 | 457 |
| 458 GLuint id() const { | 458 GLuint id() const { |
| 459 return id_; | 459 return id_; |
| 460 } | 460 } |
| 461 | 461 |
| 462 private: | 462 private: |
| 463 GLES2DecoderImpl* decoder_; | 463 GLES2DecoderImpl* decoder_; |
| 464 GLuint id_; | 464 GLuint id_; |
| 465 DISALLOW_COPY_AND_ASSIGN(FrameBuffer); | 465 DISALLOW_COPY_AND_ASSIGN(BackFramebuffer); |
| 466 }; | 466 }; |
| 467 | 467 |
| 468 // } // anonymous namespace. | 468 // } // anonymous namespace. |
| 469 | 469 |
| 470 bool GLES2Decoder::GetServiceTextureId(uint32 client_texture_id, | 470 bool GLES2Decoder::GetServiceTextureId(uint32 client_texture_id, |
| 471 uint32* service_texture_id) { | 471 uint32* service_texture_id) { |
| 472 return false; | 472 return false; |
| 473 } | 473 } |
| 474 | 474 |
| 475 GLES2Decoder::GLES2Decoder() | 475 GLES2Decoder::GLES2Decoder() |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 617 bool BoundFramebufferHasDepthAttachment(); | 617 bool BoundFramebufferHasDepthAttachment(); |
| 618 bool BoundFramebufferHasStencilAttachment(); | 618 bool BoundFramebufferHasStencilAttachment(); |
| 619 | 619 |
| 620 virtual error::ContextLostReason GetContextLostReason() OVERRIDE; | 620 virtual error::ContextLostReason GetContextLostReason() OVERRIDE; |
| 621 | 621 |
| 622 private: | 622 private: |
| 623 friend class ScopedFrameBufferBinder; | 623 friend class ScopedFrameBufferBinder; |
| 624 friend class ScopedGLErrorSuppressor; | 624 friend class ScopedGLErrorSuppressor; |
| 625 friend class ScopedResolvedFrameBufferBinder; | 625 friend class ScopedResolvedFrameBufferBinder; |
| 626 friend class ScopedTextureUploadTimer; | 626 friend class ScopedTextureUploadTimer; |
| 627 friend class Texture; | 627 friend class BackTexture; |
| 628 friend class RenderBuffer; | 628 friend class BackRenderbuffer; |
| 629 friend class FrameBuffer; | 629 friend class BackFramebuffer; |
| 630 | 630 |
| 631 // Initialize or re-initialize the shader translator. | 631 // Initialize or re-initialize the shader translator. |
| 632 bool InitializeShaderTranslator(); | 632 bool InitializeShaderTranslator(); |
| 633 | 633 |
| 634 void UpdateCapabilities(); | 634 void UpdateCapabilities(); |
| 635 | 635 |
| 636 // Helpers for the glGen and glDelete functions. | 636 // Helpers for the glGen and glDelete functions. |
| 637 bool GenTexturesHelper(GLsizei n, const GLuint* client_ids); | 637 bool GenTexturesHelper(GLsizei n, const GLuint* client_ids); |
| 638 void DeleteTexturesHelper(GLsizei n, const GLuint* client_ids); | 638 void DeleteTexturesHelper(GLsizei n, const GLuint* client_ids); |
| 639 bool GenBuffersHelper(GLsizei n, const GLuint* client_ids); | 639 bool GenBuffersHelper(GLsizei n, const GLuint* client_ids); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 if (tracker) { | 700 if (tracker) { |
| 701 return tracker->EnsureGPUMemoryAvailable(estimated_size); | 701 return tracker->EnsureGPUMemoryAvailable(estimated_size); |
| 702 } | 702 } |
| 703 return true; | 703 return true; |
| 704 } | 704 } |
| 705 | 705 |
| 706 bool IsOffscreenBufferMultisampled() const { | 706 bool IsOffscreenBufferMultisampled() const { |
| 707 return offscreen_target_samples_ > 1; | 707 return offscreen_target_samples_ > 1; |
| 708 } | 708 } |
| 709 | 709 |
| 710 // Creates a TextureInfo for the given texture. | 710 // Creates a Texture for the given texture. |
| 711 TextureManager::TextureInfo* CreateTextureInfo( | 711 Texture* CreateTexture( |
| 712 GLuint client_id, GLuint service_id) { | 712 GLuint client_id, GLuint service_id) { |
| 713 return texture_manager()->CreateTextureInfo(client_id, service_id); | 713 return texture_manager()->CreateTexture(client_id, service_id); |
| 714 } | 714 } |
| 715 | 715 |
| 716 // Gets the texture info for the given texture. Returns NULL if none exists. | 716 // Gets the texture info for the given texture. Returns NULL if none exists. |
| 717 TextureManager::TextureInfo* GetTextureInfo(GLuint client_id) const { | 717 Texture* GetTexture(GLuint client_id) const { |
| 718 TextureManager::TextureInfo* info = | 718 Texture* info = |
| 719 texture_manager()->GetTextureInfo(client_id); | 719 texture_manager()->GetTexture(client_id); |
| 720 return info; | 720 return info; |
| 721 } | 721 } |
| 722 | 722 |
| 723 // Deletes the texture info for the given texture. | 723 // Deletes the texture info for the given texture. |
| 724 void RemoveTextureInfo(GLuint client_id) { | 724 void RemoveTexture(GLuint client_id) { |
| 725 texture_manager()->RemoveTextureInfo(client_id); | 725 texture_manager()->RemoveTexture(client_id); |
| 726 } | 726 } |
| 727 | 727 |
| 728 // Get the size (in pixels) of the currently bound frame buffer (either FBO | 728 // Get the size (in pixels) of the currently bound frame buffer (either FBO |
| 729 // or regular back buffer). | 729 // or regular back buffer). |
| 730 gfx::Size GetBoundReadFrameBufferSize(); | 730 gfx::Size GetBoundReadFrameBufferSize(); |
| 731 | 731 |
| 732 // Get the format of the currently bound frame buffer (either FBO or regular | 732 // Get the format of the currently bound frame buffer (either FBO or regular |
| 733 // back buffer) | 733 // back buffer) |
| 734 GLenum GetBoundReadFrameBufferInternalFormat(); | 734 GLenum GetBoundReadFrameBufferInternalFormat(); |
| 735 GLenum GetBoundDrawFrameBufferInternalFormat(); | 735 GLenum GetBoundDrawFrameBufferInternalFormat(); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 GLint yoffset, | 828 GLint yoffset, |
| 829 GLsizei width, | 829 GLsizei width, |
| 830 GLsizei height, | 830 GLsizei height, |
| 831 GLenum format, | 831 GLenum format, |
| 832 GLenum type, | 832 GLenum type, |
| 833 const void * data); | 833 const void * data); |
| 834 | 834 |
| 835 // Extra validation for async tex(Sub)Image2D. | 835 // Extra validation for async tex(Sub)Image2D. |
| 836 bool ValidateAsyncTransfer( | 836 bool ValidateAsyncTransfer( |
| 837 const char* function_name, | 837 const char* function_name, |
| 838 TextureManager::TextureInfo* info, | 838 Texture* info, |
| 839 GLenum target, | 839 GLenum target, |
| 840 GLint level, | 840 GLint level, |
| 841 const void * data); | 841 const void * data); |
| 842 | 842 |
| 843 // Wrapper for TexImageIOSurface2DCHROMIUM. | 843 // Wrapper for TexImageIOSurface2DCHROMIUM. |
| 844 void DoTexImageIOSurface2DCHROMIUM( | 844 void DoTexImageIOSurface2DCHROMIUM( |
| 845 GLenum target, | 845 GLenum target, |
| 846 GLsizei width, | 846 GLsizei width, |
| 847 GLsizei height, | 847 GLsizei height, |
| 848 GLuint io_surface_id, | 848 GLuint io_surface_id, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 868 | 868 |
| 869 void DoBindTexImage2DCHROMIUM( | 869 void DoBindTexImage2DCHROMIUM( |
| 870 GLenum target, | 870 GLenum target, |
| 871 GLint image_id); | 871 GLint image_id); |
| 872 void DoReleaseTexImage2DCHROMIUM( | 872 void DoReleaseTexImage2DCHROMIUM( |
| 873 GLenum target, | 873 GLenum target, |
| 874 GLint image_id); | 874 GLint image_id); |
| 875 | 875 |
| 876 void DoTraceEndCHROMIUM(void); | 876 void DoTraceEndCHROMIUM(void); |
| 877 | 877 |
| 878 // Creates a ProgramInfo for the given program. | 878 // Creates a Program for the given program. |
| 879 ProgramManager::ProgramInfo* CreateProgramInfo( | 879 Program* CreateProgram( |
| 880 GLuint client_id, GLuint service_id) { | 880 GLuint client_id, GLuint service_id) { |
| 881 return program_manager()->CreateProgramInfo(client_id, service_id); | 881 return program_manager()->CreateProgram(client_id, service_id); |
| 882 } | 882 } |
| 883 | 883 |
| 884 // Gets the program info for the given program. Returns NULL if none exists. | 884 // Gets the program info for the given program. Returns NULL if none exists. |
| 885 ProgramManager::ProgramInfo* GetProgramInfo(GLuint client_id) { | 885 Program* GetProgram(GLuint client_id) { |
| 886 return program_manager()->GetProgramInfo(client_id); | 886 return program_manager()->GetProgram(client_id); |
| 887 } | 887 } |
| 888 | 888 |
| 889 #if defined(NDEBUG) | 889 #if defined(NDEBUG) |
| 890 void LogClientServiceMapping( | 890 void LogClientServiceMapping( |
| 891 const char* /* function_name */, | 891 const char* /* function_name */, |
| 892 GLuint /* client_id */, | 892 GLuint /* client_id */, |
| 893 GLuint /* service_id */) { | 893 GLuint /* service_id */) { |
| 894 } | 894 } |
| 895 template<typename T> | 895 template<typename T> |
| 896 void LogClientServiceForInfo( | 896 void LogClientServiceForInfo( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 909 void LogClientServiceForInfo( | 909 void LogClientServiceForInfo( |
| 910 T* info, GLuint client_id, const char* function_name) { | 910 T* info, GLuint client_id, const char* function_name) { |
| 911 if (info) { | 911 if (info) { |
| 912 LogClientServiceMapping(function_name, client_id, info->service_id()); | 912 LogClientServiceMapping(function_name, client_id, info->service_id()); |
| 913 } | 913 } |
| 914 } | 914 } |
| 915 #endif | 915 #endif |
| 916 | 916 |
| 917 // Gets the program info for the given program. If it's not a program | 917 // Gets the program info for the given program. If it's not a program |
| 918 // generates a GL error. Returns NULL if not program. | 918 // generates a GL error. Returns NULL if not program. |
| 919 ProgramManager::ProgramInfo* GetProgramInfoNotShader( | 919 Program* GetProgramInfoNotShader( |
| 920 GLuint client_id, const char* function_name) { | 920 GLuint client_id, const char* function_name) { |
| 921 ProgramManager::ProgramInfo* info = GetProgramInfo(client_id); | 921 Program* info = GetProgram(client_id); |
| 922 if (!info) { | 922 if (!info) { |
| 923 if (GetShaderInfo(client_id)) { | 923 if (GetShader(client_id)) { |
| 924 SetGLError( | 924 SetGLError( |
| 925 GL_INVALID_OPERATION, function_name, "shader passed for program"); | 925 GL_INVALID_OPERATION, function_name, "shader passed for program"); |
| 926 } else { | 926 } else { |
| 927 SetGLError(GL_INVALID_VALUE, function_name, "unknown program"); | 927 SetGLError(GL_INVALID_VALUE, function_name, "unknown program"); |
| 928 } | 928 } |
| 929 } | 929 } |
| 930 LogClientServiceForInfo(info, client_id, function_name); | 930 LogClientServiceForInfo(info, client_id, function_name); |
| 931 return info; | 931 return info; |
| 932 } | 932 } |
| 933 | 933 |
| 934 | 934 |
| 935 // Creates a ShaderInfo for the given shader. | 935 // Creates a Shader for the given shader. |
| 936 ShaderManager::ShaderInfo* CreateShaderInfo( | 936 Shader* CreateShader( |
| 937 GLuint client_id, | 937 GLuint client_id, |
| 938 GLuint service_id, | 938 GLuint service_id, |
| 939 GLenum shader_type) { | 939 GLenum shader_type) { |
| 940 return shader_manager()->CreateShaderInfo( | 940 return shader_manager()->CreateShader( |
| 941 client_id, service_id, shader_type); | 941 client_id, service_id, shader_type); |
| 942 } | 942 } |
| 943 | 943 |
| 944 // Gets the shader info for the given shader. Returns NULL if none exists. | 944 // Gets the shader info for the given shader. Returns NULL if none exists. |
| 945 ShaderManager::ShaderInfo* GetShaderInfo(GLuint client_id) { | 945 Shader* GetShader(GLuint client_id) { |
| 946 return shader_manager()->GetShaderInfo(client_id); | 946 return shader_manager()->GetShader(client_id); |
| 947 } | 947 } |
| 948 | 948 |
| 949 // Gets the shader info for the given shader. If it's not a shader generates a | 949 // Gets the shader info for the given shader. If it's not a shader generates a |
| 950 // GL error. Returns NULL if not shader. | 950 // GL error. Returns NULL if not shader. |
| 951 ShaderManager::ShaderInfo* GetShaderInfoNotProgram( | 951 Shader* GetShaderInfoNotProgram( |
| 952 GLuint client_id, const char* function_name) { | 952 GLuint client_id, const char* function_name) { |
| 953 ShaderManager::ShaderInfo* info = GetShaderInfo(client_id); | 953 Shader* info = GetShader(client_id); |
| 954 if (!info) { | 954 if (!info) { |
| 955 if (GetProgramInfo(client_id)) { | 955 if (GetProgram(client_id)) { |
| 956 SetGLError( | 956 SetGLError( |
| 957 GL_INVALID_OPERATION, function_name, "program passed for shader"); | 957 GL_INVALID_OPERATION, function_name, "program passed for shader"); |
| 958 } else { | 958 } else { |
| 959 SetGLError( | 959 SetGLError( |
| 960 GL_INVALID_VALUE, function_name, "unknown shader"); | 960 GL_INVALID_VALUE, function_name, "unknown shader"); |
| 961 } | 961 } |
| 962 } | 962 } |
| 963 LogClientServiceForInfo(info, client_id, function_name); | 963 LogClientServiceForInfo(info, client_id, function_name); |
| 964 return info; | 964 return info; |
| 965 } | 965 } |
| 966 | 966 |
| 967 // Creates a buffer info for the given buffer. | 967 // Creates a buffer info for the given buffer. |
| 968 void CreateBufferInfo(GLuint client_id, GLuint service_id) { | 968 void CreateBuffer(GLuint client_id, GLuint service_id) { |
| 969 return buffer_manager()->CreateBufferInfo(client_id, service_id); | 969 return buffer_manager()->CreateBuffer(client_id, service_id); |
| 970 } | 970 } |
| 971 | 971 |
| 972 // Gets the buffer info for the given buffer. | 972 // Gets the buffer info for the given buffer. |
| 973 BufferManager::BufferInfo* GetBufferInfo(GLuint client_id) { | 973 BufferManager::Buffer* GetBuffer(GLuint client_id) { |
| 974 BufferManager::BufferInfo* info = | 974 BufferManager::Buffer* info = |
| 975 buffer_manager()->GetBufferInfo(client_id); | 975 buffer_manager()->GetBuffer(client_id); |
| 976 return info; | 976 return info; |
| 977 } | 977 } |
| 978 | 978 |
| 979 // Removes any buffers in the VertexAtrribInfos and BufferInfos. This is used | 979 // Removes any buffers in the VertexAtrribInfos and BufferInfos. This is used |
| 980 // on glDeleteBuffers so we can make sure the user does not try to render | 980 // on glDeleteBuffers so we can make sure the user does not try to render |
| 981 // with deleted buffers. | 981 // with deleted buffers. |
| 982 void RemoveBufferInfo(GLuint client_id); | 982 void RemoveBuffer(GLuint client_id); |
| 983 | 983 |
| 984 // Creates a framebuffer info for the given framebuffer. | 984 // Creates a framebuffer info for the given framebuffer. |
| 985 void CreateFramebufferInfo(GLuint client_id, GLuint service_id) { | 985 void CreateFramebuffer(GLuint client_id, GLuint service_id) { |
| 986 return framebuffer_manager()->CreateFramebufferInfo(client_id, service_id); | 986 return framebuffer_manager()->CreateFramebuffer(client_id, service_id); |
| 987 } | 987 } |
| 988 | 988 |
| 989 // Gets the framebuffer info for the given framebuffer. | 989 // Gets the framebuffer info for the given framebuffer. |
| 990 FramebufferManager::FramebufferInfo* GetFramebufferInfo( | 990 Framebuffer* GetFramebuffer( |
| 991 GLuint client_id) { | 991 GLuint client_id) { |
| 992 FramebufferManager::FramebufferInfo* info = | 992 Framebuffer* info = |
| 993 framebuffer_manager()->GetFramebufferInfo(client_id); | 993 framebuffer_manager()->GetFramebuffer(client_id); |
| 994 return info; | 994 return info; |
| 995 } | 995 } |
| 996 | 996 |
| 997 // Removes the framebuffer info for the given framebuffer. | 997 // Removes the framebuffer info for the given framebuffer. |
| 998 void RemoveFramebufferInfo(GLuint client_id) { | 998 void RemoveFramebuffer(GLuint client_id) { |
| 999 framebuffer_manager()->RemoveFramebufferInfo(client_id); | 999 framebuffer_manager()->RemoveFramebuffer(client_id); |
| 1000 } | 1000 } |
| 1001 | 1001 |
| 1002 // Creates a renderbuffer info for the given renderbuffer. | 1002 // Creates a renderbuffer info for the given renderbuffer. |
| 1003 void CreateRenderbufferInfo(GLuint client_id, GLuint service_id) { | 1003 void CreateRenderbuffer(GLuint client_id, GLuint service_id) { |
| 1004 return renderbuffer_manager()->CreateRenderbufferInfo( | 1004 return renderbuffer_manager()->CreateRenderbuffer( |
| 1005 client_id, service_id); | 1005 client_id, service_id); |
| 1006 } | 1006 } |
| 1007 | 1007 |
| 1008 // Gets the renderbuffer info for the given renderbuffer. | 1008 // Gets the renderbuffer info for the given renderbuffer. |
| 1009 RenderbufferManager::RenderbufferInfo* GetRenderbufferInfo( | 1009 Renderbuffer* GetRenderbuffer( |
| 1010 GLuint client_id) { | 1010 GLuint client_id) { |
| 1011 RenderbufferManager::RenderbufferInfo* info = | 1011 Renderbuffer* info = |
| 1012 renderbuffer_manager()->GetRenderbufferInfo(client_id); | 1012 renderbuffer_manager()->GetRenderbuffer(client_id); |
| 1013 return info; | 1013 return info; |
| 1014 } | 1014 } |
| 1015 | 1015 |
| 1016 // Removes the renderbuffer info for the given renderbuffer. | 1016 // Removes the renderbuffer info for the given renderbuffer. |
| 1017 void RemoveRenderbufferInfo(GLuint client_id) { | 1017 void RemoveRenderbuffer(GLuint client_id) { |
| 1018 renderbuffer_manager()->RemoveRenderbufferInfo(client_id); | 1018 renderbuffer_manager()->RemoveRenderbuffer(client_id); |
| 1019 } | 1019 } |
| 1020 | 1020 |
| 1021 // Gets the vertex attrib manager for the given vertex array. | 1021 // Gets the vertex attrib manager for the given vertex array. |
| 1022 VertexAttribManager* GetVertexAttribManager(GLuint client_id) { | 1022 VertexAttribManager* GetVertexAttribManager(GLuint client_id) { |
| 1023 VertexAttribManager* info = | 1023 VertexAttribManager* info = |
| 1024 vertex_array_manager()->GetVertexAttribManager(client_id); | 1024 vertex_array_manager()->GetVertexAttribManager(client_id); |
| 1025 return info; | 1025 return info; |
| 1026 } | 1026 } |
| 1027 | 1027 |
| 1028 // Removes the vertex attrib manager for the given vertex array. | 1028 // Removes the vertex attrib manager for the given vertex array. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1050 | 1050 |
| 1051 // Helper for glShaderSource. | 1051 // Helper for glShaderSource. |
| 1052 error::Error ShaderSourceHelper( | 1052 error::Error ShaderSourceHelper( |
| 1053 GLuint client_id, const char* data, uint32 data_size); | 1053 GLuint client_id, const char* data, uint32 data_size); |
| 1054 | 1054 |
| 1055 // Clear any textures used by the current program. | 1055 // Clear any textures used by the current program. |
| 1056 bool ClearUnclearedTextures(); | 1056 bool ClearUnclearedTextures(); |
| 1057 | 1057 |
| 1058 // Clear any uncleared level in texture. | 1058 // Clear any uncleared level in texture. |
| 1059 // Returns false if there was a generated GL error. | 1059 // Returns false if there was a generated GL error. |
| 1060 bool ClearTexture(TextureManager::TextureInfo* info); | 1060 bool ClearTexture(Texture* info); |
| 1061 | 1061 |
| 1062 // Clears any uncleared attachments attached to the given frame buffer. | 1062 // Clears any uncleared attachments attached to the given frame buffer. |
| 1063 // Returns false if there was a generated GL error. | 1063 // Returns false if there was a generated GL error. |
| 1064 void ClearUnclearedAttachments( | 1064 void ClearUnclearedAttachments( |
| 1065 GLenum target, FramebufferManager::FramebufferInfo* info); | 1065 GLenum target, Framebuffer* info); |
| 1066 | 1066 |
| 1067 // overridden from GLES2Decoder | 1067 // overridden from GLES2Decoder |
| 1068 virtual bool ClearLevel(unsigned service_id, | 1068 virtual bool ClearLevel(unsigned service_id, |
| 1069 unsigned bind_target, | 1069 unsigned bind_target, |
| 1070 unsigned target, | 1070 unsigned target, |
| 1071 int level, | 1071 int level, |
| 1072 unsigned format, | 1072 unsigned format, |
| 1073 unsigned type, | 1073 unsigned type, |
| 1074 int width, | 1074 int width, |
| 1075 int height, | 1075 int height, |
| 1076 bool is_texture_immutable) OVERRIDE; | 1076 bool is_texture_immutable) OVERRIDE; |
| 1077 | 1077 |
| 1078 // Restore all GL state that affects clearing. | 1078 // Restore all GL state that affects clearing. |
| 1079 void RestoreClearState(); | 1079 void RestoreClearState(); |
| 1080 | 1080 |
| 1081 // Remembers the state of some capabilities. | 1081 // Remembers the state of some capabilities. |
| 1082 // Returns: true if glEnable/glDisable should actually be called. | 1082 // Returns: true if glEnable/glDisable should actually be called. |
| 1083 bool SetCapabilityState(GLenum cap, bool enabled); | 1083 bool SetCapabilityState(GLenum cap, bool enabled); |
| 1084 | 1084 |
| 1085 // Check that the currently bound framebuffers are valid. | 1085 // Check that the currently bound framebuffers are valid. |
| 1086 // Generates GL error if not. | 1086 // Generates GL error if not. |
| 1087 bool CheckBoundFramebuffersValid(const char* func_name); | 1087 bool CheckBoundFramebuffersValid(const char* func_name); |
| 1088 | 1088 |
| 1089 // Check if a framebuffer meets our requirements. | 1089 // Check if a framebuffer meets our requirements. |
| 1090 bool CheckFramebufferValid( | 1090 bool CheckFramebufferValid( |
| 1091 FramebufferManager::FramebufferInfo* framebuffer, | 1091 Framebuffer* framebuffer, |
| 1092 GLenum target, | 1092 GLenum target, |
| 1093 const char* func_name); | 1093 const char* func_name); |
| 1094 | 1094 |
| 1095 // Checks if the current program exists and is valid. If not generates the | 1095 // Checks if the current program exists and is valid. If not generates the |
| 1096 // appropriate GL error. Returns true if the current program is in a usable | 1096 // appropriate GL error. Returns true if the current program is in a usable |
| 1097 // state. | 1097 // state. |
| 1098 bool CheckCurrentProgram(const char* function_name); | 1098 bool CheckCurrentProgram(const char* function_name); |
| 1099 | 1099 |
| 1100 // Checks if the current program exists and is valid and that location is not | 1100 // Checks if the current program exists and is valid and that location is not |
| 1101 // -1. If the current program is not valid generates the appropriate GL | 1101 // -1. If the current program is not valid generates the appropriate GL |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1391 error::Error DoDrawArrays( | 1391 error::Error DoDrawArrays( |
| 1392 const char* function_name, | 1392 const char* function_name, |
| 1393 bool instanced, GLenum mode, GLint first, GLsizei count, | 1393 bool instanced, GLenum mode, GLint first, GLsizei count, |
| 1394 GLsizei primcount); | 1394 GLsizei primcount); |
| 1395 error::Error DoDrawElements( | 1395 error::Error DoDrawElements( |
| 1396 const char* function_name, | 1396 const char* function_name, |
| 1397 bool instanced, GLenum mode, GLsizei count, GLenum type, | 1397 bool instanced, GLenum mode, GLsizei count, GLenum type, |
| 1398 int32 offset, GLsizei primcount); | 1398 int32 offset, GLsizei primcount); |
| 1399 | 1399 |
| 1400 // Gets the buffer id for a given target. | 1400 // Gets the buffer id for a given target. |
| 1401 BufferManager::BufferInfo* GetBufferInfoForTarget(GLenum target) { | 1401 BufferManager::Buffer* GetBufferInfoForTarget(GLenum target) { |
| 1402 DCHECK(target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER); | 1402 DCHECK(target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER); |
| 1403 if (target == GL_ARRAY_BUFFER) { | 1403 if (target == GL_ARRAY_BUFFER) { |
| 1404 return state_.bound_array_buffer; | 1404 return state_.bound_array_buffer; |
| 1405 } else { | 1405 } else { |
| 1406 return state_.vertex_attrib_manager->element_array_buffer(); | 1406 return state_.vertex_attrib_manager->element_array_buffer(); |
| 1407 } | 1407 } |
| 1408 } | 1408 } |
| 1409 | 1409 |
| 1410 // Gets the texture id for a given target. | 1410 // Gets the texture id for a given target. |
| 1411 TextureManager::TextureInfo* GetTextureInfoForTarget(GLenum target) { | 1411 Texture* GetTextureInfoForTarget(GLenum target) { |
| 1412 TextureUnit& unit = state_.texture_units[state_.active_texture_unit]; | 1412 TextureUnit& unit = state_.texture_units[state_.active_texture_unit]; |
| 1413 TextureManager::TextureInfo* info = NULL; | 1413 Texture* info = NULL; |
| 1414 switch (target) { | 1414 switch (target) { |
| 1415 case GL_TEXTURE_2D: | 1415 case GL_TEXTURE_2D: |
| 1416 info = unit.bound_texture_2d; | 1416 info = unit.bound_texture_2d; |
| 1417 break; | 1417 break; |
| 1418 case GL_TEXTURE_CUBE_MAP: | 1418 case GL_TEXTURE_CUBE_MAP: |
| 1419 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: | 1419 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: |
| 1420 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: | 1420 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: |
| 1421 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: | 1421 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: |
| 1422 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: | 1422 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: |
| 1423 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: | 1423 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: |
| 1424 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: | 1424 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: |
| 1425 info = unit.bound_texture_cube_map; | 1425 info = unit.bound_texture_cube_map; |
| 1426 break; | 1426 break; |
| 1427 case GL_TEXTURE_EXTERNAL_OES: | 1427 case GL_TEXTURE_EXTERNAL_OES: |
| 1428 info = unit.bound_texture_external_oes; | 1428 info = unit.bound_texture_external_oes; |
| 1429 break; | 1429 break; |
| 1430 case GL_TEXTURE_RECTANGLE_ARB: | 1430 case GL_TEXTURE_RECTANGLE_ARB: |
| 1431 info = unit.bound_texture_rectangle_arb; | 1431 info = unit.bound_texture_rectangle_arb; |
| 1432 break; | 1432 break; |
| 1433 default: | 1433 default: |
| 1434 NOTREACHED(); | 1434 NOTREACHED(); |
| 1435 return NULL; | 1435 return NULL; |
| 1436 } | 1436 } |
| 1437 return info; | 1437 return info; |
| 1438 } | 1438 } |
| 1439 | 1439 |
| 1440 TextureManager::TextureInfo* GetTextureInfoForTargetUnlessDefault( | 1440 Texture* GetTextureInfoForTargetUnlessDefault( |
| 1441 GLenum target) { | 1441 GLenum target) { |
| 1442 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 1442 Texture* info = GetTextureInfoForTarget(target); |
| 1443 if (!info) | 1443 if (!info) |
| 1444 return NULL; | 1444 return NULL; |
| 1445 if (info == texture_manager()->GetDefaultTextureInfo(target)) | 1445 if (info == texture_manager()->GetDefaultTextureInfo(target)) |
| 1446 return NULL; | 1446 return NULL; |
| 1447 return info; | 1447 return info; |
| 1448 } | 1448 } |
| 1449 | 1449 |
| 1450 GLenum GetBindTargetForSamplerType(GLenum type) { | 1450 GLenum GetBindTargetForSamplerType(GLenum type) { |
| 1451 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || | 1451 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || |
| 1452 type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB); | 1452 type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB); |
| 1453 switch (type) { | 1453 switch (type) { |
| 1454 case GL_SAMPLER_2D: | 1454 case GL_SAMPLER_2D: |
| 1455 return GL_TEXTURE_2D; | 1455 return GL_TEXTURE_2D; |
| 1456 case GL_SAMPLER_CUBE: | 1456 case GL_SAMPLER_CUBE: |
| 1457 return GL_TEXTURE_CUBE_MAP; | 1457 return GL_TEXTURE_CUBE_MAP; |
| 1458 case GL_SAMPLER_EXTERNAL_OES: | 1458 case GL_SAMPLER_EXTERNAL_OES: |
| 1459 return GL_TEXTURE_EXTERNAL_OES; | 1459 return GL_TEXTURE_EXTERNAL_OES; |
| 1460 case GL_SAMPLER_2D_RECT_ARB: | 1460 case GL_SAMPLER_2D_RECT_ARB: |
| 1461 return GL_TEXTURE_RECTANGLE_ARB; | 1461 return GL_TEXTURE_RECTANGLE_ARB; |
| 1462 } | 1462 } |
| 1463 | 1463 |
| 1464 NOTREACHED(); | 1464 NOTREACHED(); |
| 1465 return 0; | 1465 return 0; |
| 1466 } | 1466 } |
| 1467 | 1467 |
| 1468 // Gets the framebuffer info for a particular target. | 1468 // Gets the framebuffer info for a particular target. |
| 1469 FramebufferManager::FramebufferInfo* GetFramebufferInfoForTarget( | 1469 Framebuffer* GetFramebufferInfoForTarget( |
| 1470 GLenum target) { | 1470 GLenum target) { |
| 1471 FramebufferManager::FramebufferInfo* info = NULL; | 1471 Framebuffer* info = NULL; |
| 1472 switch (target) { | 1472 switch (target) { |
| 1473 case GL_FRAMEBUFFER: | 1473 case GL_FRAMEBUFFER: |
| 1474 case GL_DRAW_FRAMEBUFFER_EXT: | 1474 case GL_DRAW_FRAMEBUFFER_EXT: |
| 1475 info = state_.bound_draw_framebuffer; | 1475 info = state_.bound_draw_framebuffer; |
| 1476 break; | 1476 break; |
| 1477 case GL_READ_FRAMEBUFFER_EXT: | 1477 case GL_READ_FRAMEBUFFER_EXT: |
| 1478 info = state_.bound_read_framebuffer; | 1478 info = state_.bound_read_framebuffer; |
| 1479 break; | 1479 break; |
| 1480 default: | 1480 default: |
| 1481 NOTREACHED(); | 1481 NOTREACHED(); |
| 1482 break; | 1482 break; |
| 1483 } | 1483 } |
| 1484 return info; | 1484 return info; |
| 1485 } | 1485 } |
| 1486 | 1486 |
| 1487 RenderbufferManager::RenderbufferInfo* GetRenderbufferInfoForTarget( | 1487 Renderbuffer* GetRenderbufferInfoForTarget( |
| 1488 GLenum target) { | 1488 GLenum target) { |
| 1489 RenderbufferManager::RenderbufferInfo* info = NULL; | 1489 Renderbuffer* info = NULL; |
| 1490 switch (target) { | 1490 switch (target) { |
| 1491 case GL_RENDERBUFFER: | 1491 case GL_RENDERBUFFER: |
| 1492 info = state_.bound_renderbuffer; | 1492 info = state_.bound_renderbuffer; |
| 1493 break; | 1493 break; |
| 1494 default: | 1494 default: |
| 1495 NOTREACHED(); | 1495 NOTREACHED(); |
| 1496 break; | 1496 break; |
| 1497 } | 1497 } |
| 1498 return info; | 1498 return info; |
| 1499 } | 1499 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1528 bool ValidateCompressedTexDimensions( | 1528 bool ValidateCompressedTexDimensions( |
| 1529 const char* function_name, | 1529 const char* function_name, |
| 1530 GLint level, GLsizei width, GLsizei height, GLenum format); | 1530 GLint level, GLsizei width, GLsizei height, GLenum format); |
| 1531 bool ValidateCompressedTexFuncData( | 1531 bool ValidateCompressedTexFuncData( |
| 1532 const char* function_name, | 1532 const char* function_name, |
| 1533 GLsizei width, GLsizei height, GLenum format, size_t size); | 1533 GLsizei width, GLsizei height, GLenum format, size_t size); |
| 1534 bool ValidateCompressedTexSubDimensions( | 1534 bool ValidateCompressedTexSubDimensions( |
| 1535 const char* function_name, | 1535 const char* function_name, |
| 1536 GLenum target, GLint level, GLint xoffset, GLint yoffset, | 1536 GLenum target, GLint level, GLint xoffset, GLint yoffset, |
| 1537 GLsizei width, GLsizei height, GLenum format, | 1537 GLsizei width, GLsizei height, GLenum format, |
| 1538 TextureManager::TextureInfo* texture); | 1538 Texture* texture); |
| 1539 | 1539 |
| 1540 void LogMessage(const std::string& msg); | 1540 void LogMessage(const std::string& msg); |
| 1541 void RenderWarning(const std::string& msg); | 1541 void RenderWarning(const std::string& msg); |
| 1542 void PerformanceWarning(const std::string& msg); | 1542 void PerformanceWarning(const std::string& msg); |
| 1543 const std::string& GetLogPrefix() const; | 1543 const std::string& GetLogPrefix() const; |
| 1544 | 1544 |
| 1545 const FeatureInfo::FeatureFlags& features() const { | 1545 const FeatureInfo::FeatureFlags& features() const { |
| 1546 return feature_info_->feature_flags(); | 1546 return feature_info_->feature_flags(); |
| 1547 } | 1547 } |
| 1548 | 1548 |
| 1549 const FeatureInfo::Workarounds& workarounds() const { | 1549 const FeatureInfo::Workarounds& workarounds() const { |
| 1550 return feature_info_->workarounds(); | 1550 return feature_info_->workarounds(); |
| 1551 } | 1551 } |
| 1552 | 1552 |
| 1553 bool ShouldDeferDraws() { | 1553 bool ShouldDeferDraws() { |
| 1554 return !offscreen_target_frame_buffer_.get() && | 1554 return !offscreen_target_frame_buffer_.get() && |
| 1555 state_.bound_draw_framebuffer == NULL && | 1555 state_.bound_draw_framebuffer == NULL && |
| 1556 surface_->DeferDraws(); | 1556 surface_->DeferDraws(); |
| 1557 } | 1557 } |
| 1558 | 1558 |
| 1559 bool ShouldDeferReads() { | 1559 bool ShouldDeferReads() { |
| 1560 return !offscreen_target_frame_buffer_.get() && | 1560 return !offscreen_target_frame_buffer_.get() && |
| 1561 state_.bound_read_framebuffer == NULL && | 1561 state_.bound_read_framebuffer == NULL && |
| 1562 surface_->DeferDraws(); | 1562 surface_->DeferDraws(); |
| 1563 } | 1563 } |
| 1564 | 1564 |
| 1565 void ForceCompileShaderIfPending(ShaderManager::ShaderInfo* info); | 1565 void ForceCompileShaderIfPending(Shader* info); |
| 1566 | 1566 |
| 1567 // Generate a member function prototype for each command in an automated and | 1567 // Generate a member function prototype for each command in an automated and |
| 1568 // typesafe way. | 1568 // typesafe way. |
| 1569 #define GLES2_CMD_OP(name) \ | 1569 #define GLES2_CMD_OP(name) \ |
| 1570 Error Handle ## name( \ | 1570 Error Handle ## name( \ |
| 1571 uint32 immediate_data_size, \ | 1571 uint32 immediate_data_size, \ |
| 1572 const gles2::name& args); \ | 1572 const cmds::name& args); \ |
| 1573 | 1573 |
| 1574 GLES2_COMMAND_LIST(GLES2_CMD_OP) | 1574 GLES2_COMMAND_LIST(GLES2_CMD_OP) |
| 1575 | 1575 |
| 1576 #undef GLES2_CMD_OP | 1576 #undef GLES2_CMD_OP |
| 1577 | 1577 |
| 1578 // The GL context this decoder renders to on behalf of the client. | 1578 // The GL context this decoder renders to on behalf of the client. |
| 1579 scoped_refptr<gfx::GLSurface> surface_; | 1579 scoped_refptr<gfx::GLSurface> surface_; |
| 1580 scoped_refptr<gfx::GLContext> context_; | 1580 scoped_refptr<gfx::GLContext> context_; |
| 1581 | 1581 |
| 1582 // The ContextGroup for this decoder uses to track resources. | 1582 // The ContextGroup for this decoder uses to track resources. |
| 1583 ContextGroup::Ref group_; | 1583 scoped_refptr<ContextGroup> group_; |
| 1584 | 1584 |
| 1585 // All the state for this context. | 1585 // All the state for this context. |
| 1586 ContextState state_; | 1586 ContextState state_; |
| 1587 | 1587 |
| 1588 // A parent decoder can access this decoders saved offscreen frame buffer. | 1588 // A parent decoder can access this decoders saved offscreen frame buffer. |
| 1589 // The parent pointer is reset if the parent is destroyed. | 1589 // The parent pointer is reset if the parent is destroyed. |
| 1590 base::WeakPtr<GLES2DecoderImpl> parent_; | 1590 base::WeakPtr<GLES2DecoderImpl> parent_; |
| 1591 | 1591 |
| 1592 // Current width and height of the offscreen frame buffer. | 1592 // Current width and height of the offscreen frame buffer. |
| 1593 gfx::Size offscreen_size_; | 1593 gfx::Size offscreen_size_; |
| 1594 | 1594 |
| 1595 // Current GL error bits. | 1595 // Current GL error bits. |
| 1596 uint32 error_bits_; | 1596 uint32 error_bits_; |
| 1597 | 1597 |
| 1598 // Util to help with GL. | 1598 // Util to help with GL. |
| 1599 GLES2Util util_; | 1599 GLES2Util util_; |
| 1600 | 1600 |
| 1601 // unpack flip y as last set by glPixelStorei | 1601 // unpack flip y as last set by glPixelStorei |
| 1602 bool unpack_flip_y_; | 1602 bool unpack_flip_y_; |
| 1603 | 1603 |
| 1604 // unpack (un)premultiply alpha as last set by glPixelStorei | 1604 // unpack (un)premultiply alpha as last set by glPixelStorei |
| 1605 bool unpack_premultiply_alpha_; | 1605 bool unpack_premultiply_alpha_; |
| 1606 bool unpack_unpremultiply_alpha_; | 1606 bool unpack_unpremultiply_alpha_; |
| 1607 | 1607 |
| 1608 // Default vertex attribs manager, used when no VAOs are bound. | 1608 // Default vertex attribs manager, used when no VAOs are bound. |
| 1609 VertexAttribManager::Ref default_vertex_attrib_manager_; | 1609 scoped_refptr<VertexAttribManager> default_vertex_attrib_manager_; |
| 1610 | 1610 |
| 1611 // The buffer we bind to attrib 0 since OpenGL requires it (ES does not). | 1611 // The buffer we bind to attrib 0 since OpenGL requires it (ES does not). |
| 1612 GLuint attrib_0_buffer_id_; | 1612 GLuint attrib_0_buffer_id_; |
| 1613 | 1613 |
| 1614 // The value currently in attrib_0. | 1614 // The value currently in attrib_0. |
| 1615 Vec4 attrib_0_value_; | 1615 Vec4 attrib_0_value_; |
| 1616 | 1616 |
| 1617 // Whether or not the attrib_0 buffer holds the attrib_0_value. | 1617 // Whether or not the attrib_0 buffer holds the attrib_0_value. |
| 1618 bool attrib_0_buffer_matches_value_; | 1618 bool attrib_0_buffer_matches_value_; |
| 1619 | 1619 |
| 1620 // The size of attrib 0. | 1620 // The size of attrib 0. |
| 1621 GLsizei attrib_0_size_; | 1621 GLsizei attrib_0_size_; |
| 1622 | 1622 |
| 1623 // The buffer used to simulate GL_FIXED attribs. | 1623 // The buffer used to simulate GL_FIXED attribs. |
| 1624 GLuint fixed_attrib_buffer_id_; | 1624 GLuint fixed_attrib_buffer_id_; |
| 1625 | 1625 |
| 1626 // The size of fiixed attrib buffer. | 1626 // The size of fiixed attrib buffer. |
| 1627 GLsizei fixed_attrib_buffer_size_; | 1627 GLsizei fixed_attrib_buffer_size_; |
| 1628 | 1628 |
| 1629 // state saved for clearing so we can clear render buffers and then | 1629 // state saved for clearing so we can clear render buffers and then |
| 1630 // restore to these values. | 1630 // restore to these values. |
| 1631 bool clear_state_dirty_; | 1631 bool clear_state_dirty_; |
| 1632 | 1632 |
| 1633 // The offscreen frame buffer that the client renders to. With EGL, the | 1633 // The offscreen frame buffer that the client renders to. With EGL, the |
| 1634 // depth and stencil buffers are separate. With regular GL there is a single | 1634 // depth and stencil buffers are separate. With regular GL there is a single |
| 1635 // packed depth stencil buffer in offscreen_target_depth_render_buffer_. | 1635 // packed depth stencil buffer in offscreen_target_depth_render_buffer_. |
| 1636 // offscreen_target_stencil_render_buffer_ is unused. | 1636 // offscreen_target_stencil_render_buffer_ is unused. |
| 1637 scoped_ptr<FrameBuffer> offscreen_target_frame_buffer_; | 1637 scoped_ptr<BackFramebuffer> offscreen_target_frame_buffer_; |
| 1638 scoped_ptr<Texture> offscreen_target_color_texture_; | 1638 scoped_ptr<BackTexture> offscreen_target_color_texture_; |
| 1639 scoped_ptr<RenderBuffer> offscreen_target_color_render_buffer_; | 1639 scoped_ptr<BackRenderbuffer> offscreen_target_color_render_buffer_; |
| 1640 scoped_ptr<RenderBuffer> offscreen_target_depth_render_buffer_; | 1640 scoped_ptr<BackRenderbuffer> offscreen_target_depth_render_buffer_; |
| 1641 scoped_ptr<RenderBuffer> offscreen_target_stencil_render_buffer_; | 1641 scoped_ptr<BackRenderbuffer> offscreen_target_stencil_render_buffer_; |
| 1642 GLenum offscreen_target_color_format_; | 1642 GLenum offscreen_target_color_format_; |
| 1643 GLenum offscreen_target_depth_format_; | 1643 GLenum offscreen_target_depth_format_; |
| 1644 GLenum offscreen_target_stencil_format_; | 1644 GLenum offscreen_target_stencil_format_; |
| 1645 GLsizei offscreen_target_samples_; | 1645 GLsizei offscreen_target_samples_; |
| 1646 GLboolean offscreen_target_buffer_preserved_; | 1646 GLboolean offscreen_target_buffer_preserved_; |
| 1647 | 1647 |
| 1648 // The copy that is saved when SwapBuffers is called. | 1648 // The copy that is saved when SwapBuffers is called. |
| 1649 scoped_ptr<FrameBuffer> offscreen_saved_frame_buffer_; | 1649 scoped_ptr<BackFramebuffer> offscreen_saved_frame_buffer_; |
| 1650 scoped_ptr<Texture> offscreen_saved_color_texture_; | 1650 scoped_ptr<BackTexture> offscreen_saved_color_texture_; |
| 1651 TextureManager::TextureInfo::Ref offscreen_saved_color_texture_info_; | 1651 scoped_refptr<Texture> |
| 1652 offscreen_saved_color_texture_info_; |
| 1652 | 1653 |
| 1653 // The copy that is used as the destination for multi-sample resolves. | 1654 // The copy that is used as the destination for multi-sample resolves. |
| 1654 scoped_ptr<FrameBuffer> offscreen_resolved_frame_buffer_; | 1655 scoped_ptr<BackFramebuffer> offscreen_resolved_frame_buffer_; |
| 1655 scoped_ptr<Texture> offscreen_resolved_color_texture_; | 1656 scoped_ptr<BackTexture> offscreen_resolved_color_texture_; |
| 1656 GLenum offscreen_saved_color_format_; | 1657 GLenum offscreen_saved_color_format_; |
| 1657 | 1658 |
| 1658 scoped_ptr<QueryManager> query_manager_; | 1659 scoped_ptr<QueryManager> query_manager_; |
| 1659 | 1660 |
| 1660 scoped_ptr<VertexArrayManager> vertex_array_manager_; | 1661 scoped_ptr<VertexArrayManager> vertex_array_manager_; |
| 1661 | 1662 |
| 1662 base::Callback<void(gfx::Size)> resize_callback_; | 1663 base::Callback<void(gfx::Size)> resize_callback_; |
| 1663 | 1664 |
| 1664 MsgCallback msg_callback_; | 1665 MsgCallback msg_callback_; |
| 1665 WaitSyncPointCallback wait_sync_point_callback_; | 1666 WaitSyncPointCallback wait_sync_point_callback_; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1689 std::string this_in_hex_; | 1690 std::string this_in_hex_; |
| 1690 | 1691 |
| 1691 bool use_shader_translator_; | 1692 bool use_shader_translator_; |
| 1692 scoped_refptr<ShaderTranslator> vertex_translator_; | 1693 scoped_refptr<ShaderTranslator> vertex_translator_; |
| 1693 scoped_refptr<ShaderTranslator> fragment_translator_; | 1694 scoped_refptr<ShaderTranslator> fragment_translator_; |
| 1694 | 1695 |
| 1695 DisallowedFeatures disallowed_features_; | 1696 DisallowedFeatures disallowed_features_; |
| 1696 | 1697 |
| 1697 // Cached from ContextGroup | 1698 // Cached from ContextGroup |
| 1698 const Validators* validators_; | 1699 const Validators* validators_; |
| 1699 FeatureInfo::Ref feature_info_; | 1700 scoped_refptr<FeatureInfo> feature_info_; |
| 1700 | 1701 |
| 1701 // This indicates all the following texSubImage2D calls that are part of the | 1702 // This indicates all the following texSubImage2D calls that are part of the |
| 1702 // failed texImage2D call should be ignored. | 1703 // failed texImage2D call should be ignored. |
| 1703 bool tex_image_2d_failed_; | 1704 bool tex_image_2d_failed_; |
| 1704 | 1705 |
| 1705 int frame_number_; | 1706 int frame_number_; |
| 1706 | 1707 |
| 1707 bool has_robustness_extension_; | 1708 bool has_robustness_extension_; |
| 1708 GLenum reset_status_; | 1709 GLenum reset_status_; |
| 1709 | 1710 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1804 if (!resolve_and_bind_) | 1805 if (!resolve_and_bind_) |
| 1805 return; | 1806 return; |
| 1806 | 1807 |
| 1807 ScopedGLErrorSuppressor suppressor(decoder_); | 1808 ScopedGLErrorSuppressor suppressor(decoder_); |
| 1808 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, | 1809 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, |
| 1809 decoder_->offscreen_target_frame_buffer_->id()); | 1810 decoder_->offscreen_target_frame_buffer_->id()); |
| 1810 GLuint targetid; | 1811 GLuint targetid; |
| 1811 if (internal) { | 1812 if (internal) { |
| 1812 if (!decoder_->offscreen_resolved_frame_buffer_.get()) { | 1813 if (!decoder_->offscreen_resolved_frame_buffer_.get()) { |
| 1813 decoder_->offscreen_resolved_frame_buffer_.reset( | 1814 decoder_->offscreen_resolved_frame_buffer_.reset( |
| 1814 new FrameBuffer(decoder_)); | 1815 new BackFramebuffer(decoder_)); |
| 1815 decoder_->offscreen_resolved_frame_buffer_->Create(); | 1816 decoder_->offscreen_resolved_frame_buffer_->Create(); |
| 1816 decoder_->offscreen_resolved_color_texture_.reset(new Texture(decoder_)); | 1817 decoder_->offscreen_resolved_color_texture_.reset( |
| 1818 new BackTexture(decoder_)); |
| 1817 decoder_->offscreen_resolved_color_texture_->Create(); | 1819 decoder_->offscreen_resolved_color_texture_->Create(); |
| 1818 | 1820 |
| 1819 DCHECK(decoder_->offscreen_saved_color_format_); | 1821 DCHECK(decoder_->offscreen_saved_color_format_); |
| 1820 decoder_->offscreen_resolved_color_texture_->AllocateStorage( | 1822 decoder_->offscreen_resolved_color_texture_->AllocateStorage( |
| 1821 decoder_->offscreen_size_, decoder_->offscreen_saved_color_format_, | 1823 decoder_->offscreen_size_, decoder_->offscreen_saved_color_format_, |
| 1822 false); | 1824 false); |
| 1823 decoder_->offscreen_resolved_frame_buffer_->AttachRenderTexture( | 1825 decoder_->offscreen_resolved_frame_buffer_->AttachRenderTexture( |
| 1824 decoder_->offscreen_resolved_color_texture_.get()); | 1826 decoder_->offscreen_resolved_color_texture_.get()); |
| 1825 if (decoder_->offscreen_resolved_frame_buffer_->CheckStatus() != | 1827 if (decoder_->offscreen_resolved_frame_buffer_->CheckStatus() != |
| 1826 GL_FRAMEBUFFER_COMPLETE) { | 1828 GL_FRAMEBUFFER_COMPLETE) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1862 : decoder_(decoder), | 1864 : decoder_(decoder), |
| 1863 begin_time_(base::TimeTicks::HighResNow()) { | 1865 begin_time_(base::TimeTicks::HighResNow()) { |
| 1864 } | 1866 } |
| 1865 | 1867 |
| 1866 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { | 1868 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { |
| 1867 decoder_->texture_upload_count_++; | 1869 decoder_->texture_upload_count_++; |
| 1868 decoder_->total_texture_upload_time_ += | 1870 decoder_->total_texture_upload_time_ += |
| 1869 base::TimeTicks::HighResNow() - begin_time_; | 1871 base::TimeTicks::HighResNow() - begin_time_; |
| 1870 } | 1872 } |
| 1871 | 1873 |
| 1872 Texture::Texture(GLES2DecoderImpl* decoder) | 1874 BackTexture::BackTexture(GLES2DecoderImpl* decoder) |
| 1873 : decoder_(decoder), | 1875 : decoder_(decoder), |
| 1874 memory_tracker_(decoder->memory_tracker(), MemoryTracker::kUnmanaged), | 1876 memory_tracker_(decoder->memory_tracker(), MemoryTracker::kUnmanaged), |
| 1875 bytes_allocated_(0), | 1877 bytes_allocated_(0), |
| 1876 id_(0) { | 1878 id_(0) { |
| 1877 } | 1879 } |
| 1878 | 1880 |
| 1879 Texture::~Texture() { | 1881 BackTexture::~BackTexture() { |
| 1880 // This does not destroy the render texture because that would require that | 1882 // This does not destroy the render texture because that would require that |
| 1881 // the associated GL context was current. Just check that it was explicitly | 1883 // the associated GL context was current. Just check that it was explicitly |
| 1882 // destroyed. | 1884 // destroyed. |
| 1883 DCHECK_EQ(id_, 0u); | 1885 DCHECK_EQ(id_, 0u); |
| 1884 } | 1886 } |
| 1885 | 1887 |
| 1886 void Texture::Create() { | 1888 void BackTexture::Create() { |
| 1887 ScopedGLErrorSuppressor suppressor(decoder_); | 1889 ScopedGLErrorSuppressor suppressor(decoder_); |
| 1888 Destroy(); | 1890 Destroy(); |
| 1889 glGenTextures(1, &id_); | 1891 glGenTextures(1, &id_); |
| 1890 ScopedTexture2DBinder binder(decoder_, id_); | 1892 ScopedTexture2DBinder binder(decoder_, id_); |
| 1891 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 1893 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 1892 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 1894 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 1893 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 1895 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 1894 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 1896 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 1895 | 1897 |
| 1896 // TODO(apatrick): Attempt to diagnose crbug.com/97775. If SwapBuffers is | 1898 // TODO(apatrick): Attempt to diagnose crbug.com/97775. If SwapBuffers is |
| 1897 // never called on an offscreen context, no data will ever be uploaded to the | 1899 // never called on an offscreen context, no data will ever be uploaded to the |
| 1898 // saved offscreen color texture (it is deferred until to when SwapBuffers | 1900 // saved offscreen color texture (it is deferred until to when SwapBuffers |
| 1899 // is called). My idea is that some nvidia drivers might have a bug where | 1901 // is called). My idea is that some nvidia drivers might have a bug where |
| 1900 // deleting a texture that has never been populated might cause a | 1902 // deleting a texture that has never been populated might cause a |
| 1901 // crash. | 1903 // crash. |
| 1902 glTexImage2D( | 1904 glTexImage2D( |
| 1903 GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); | 1905 GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); |
| 1904 | 1906 |
| 1905 bytes_allocated_ = 16u * 16u * 4u; | 1907 bytes_allocated_ = 16u * 16u * 4u; |
| 1906 memory_tracker_.TrackMemAlloc(bytes_allocated_); | 1908 memory_tracker_.TrackMemAlloc(bytes_allocated_); |
| 1907 } | 1909 } |
| 1908 | 1910 |
| 1909 bool Texture::AllocateStorage(const gfx::Size& size, GLenum format, bool zero) { | 1911 bool BackTexture::AllocateStorage( |
| 1912 const gfx::Size& size, GLenum format, bool zero) { |
| 1910 DCHECK_NE(id_, 0u); | 1913 DCHECK_NE(id_, 0u); |
| 1911 ScopedGLErrorSuppressor suppressor(decoder_); | 1914 ScopedGLErrorSuppressor suppressor(decoder_); |
| 1912 ScopedTexture2DBinder binder(decoder_, id_); | 1915 ScopedTexture2DBinder binder(decoder_, id_); |
| 1913 uint32 image_size = 0; | 1916 uint32 image_size = 0; |
| 1914 GLES2Util::ComputeImageDataSizes( | 1917 GLES2Util::ComputeImageDataSizes( |
| 1915 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size, | 1918 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size, |
| 1916 NULL, NULL); | 1919 NULL, NULL); |
| 1917 | 1920 |
| 1918 if (!memory_tracker_.EnsureGPUMemoryAvailable(image_size)) { | 1921 if (!memory_tracker_.EnsureGPUMemoryAvailable(image_size)) { |
| 1919 return false; | 1922 return false; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1939 | 1942 |
| 1940 bool success = glGetError() == GL_NO_ERROR; | 1943 bool success = glGetError() == GL_NO_ERROR; |
| 1941 if (success) { | 1944 if (success) { |
| 1942 memory_tracker_.TrackMemFree(bytes_allocated_); | 1945 memory_tracker_.TrackMemFree(bytes_allocated_); |
| 1943 bytes_allocated_ = image_size; | 1946 bytes_allocated_ = image_size; |
| 1944 memory_tracker_.TrackMemAlloc(bytes_allocated_); | 1947 memory_tracker_.TrackMemAlloc(bytes_allocated_); |
| 1945 } | 1948 } |
| 1946 return success; | 1949 return success; |
| 1947 } | 1950 } |
| 1948 | 1951 |
| 1949 void Texture::Copy(const gfx::Size& size, GLenum format) { | 1952 void BackTexture::Copy(const gfx::Size& size, GLenum format) { |
| 1950 DCHECK_NE(id_, 0u); | 1953 DCHECK_NE(id_, 0u); |
| 1951 ScopedGLErrorSuppressor suppressor(decoder_); | 1954 ScopedGLErrorSuppressor suppressor(decoder_); |
| 1952 ScopedTexture2DBinder binder(decoder_, id_); | 1955 ScopedTexture2DBinder binder(decoder_, id_); |
| 1953 glCopyTexImage2D(GL_TEXTURE_2D, | 1956 glCopyTexImage2D(GL_TEXTURE_2D, |
| 1954 0, // level | 1957 0, // level |
| 1955 format, | 1958 format, |
| 1956 0, 0, | 1959 0, 0, |
| 1957 size.width(), | 1960 size.width(), |
| 1958 size.height(), | 1961 size.height(), |
| 1959 0); // border | 1962 0); // border |
| 1960 } | 1963 } |
| 1961 | 1964 |
| 1962 void Texture::Destroy() { | 1965 void BackTexture::Destroy() { |
| 1963 if (id_ != 0) { | 1966 if (id_ != 0) { |
| 1964 ScopedGLErrorSuppressor suppressor(decoder_); | 1967 ScopedGLErrorSuppressor suppressor(decoder_); |
| 1965 glDeleteTextures(1, &id_); | 1968 glDeleteTextures(1, &id_); |
| 1966 id_ = 0; | 1969 id_ = 0; |
| 1967 } | 1970 } |
| 1968 memory_tracker_.TrackMemFree(bytes_allocated_); | 1971 memory_tracker_.TrackMemFree(bytes_allocated_); |
| 1969 bytes_allocated_ = 0; | 1972 bytes_allocated_ = 0; |
| 1970 } | 1973 } |
| 1971 | 1974 |
| 1972 void Texture::Invalidate() { | 1975 void BackTexture::Invalidate() { |
| 1973 id_ = 0; | 1976 id_ = 0; |
| 1974 } | 1977 } |
| 1975 | 1978 |
| 1976 RenderBuffer::RenderBuffer(GLES2DecoderImpl* decoder) | 1979 BackRenderbuffer::BackRenderbuffer(GLES2DecoderImpl* decoder) |
| 1977 : decoder_(decoder), | 1980 : decoder_(decoder), |
| 1978 memory_tracker_(decoder->memory_tracker(), MemoryTracker::kUnmanaged), | 1981 memory_tracker_(decoder->memory_tracker(), MemoryTracker::kUnmanaged), |
| 1979 bytes_allocated_(0), | 1982 bytes_allocated_(0), |
| 1980 id_(0) { | 1983 id_(0) { |
| 1981 } | 1984 } |
| 1982 | 1985 |
| 1983 RenderBuffer::~RenderBuffer() { | 1986 BackRenderbuffer::~BackRenderbuffer() { |
| 1984 // This does not destroy the render buffer because that would require that | 1987 // This does not destroy the render buffer because that would require that |
| 1985 // the associated GL context was current. Just check that it was explicitly | 1988 // the associated GL context was current. Just check that it was explicitly |
| 1986 // destroyed. | 1989 // destroyed. |
| 1987 DCHECK_EQ(id_, 0u); | 1990 DCHECK_EQ(id_, 0u); |
| 1988 } | 1991 } |
| 1989 | 1992 |
| 1990 void RenderBuffer::Create() { | 1993 void BackRenderbuffer::Create() { |
| 1991 ScopedGLErrorSuppressor suppressor(decoder_); | 1994 ScopedGLErrorSuppressor suppressor(decoder_); |
| 1992 Destroy(); | 1995 Destroy(); |
| 1993 glGenRenderbuffersEXT(1, &id_); | 1996 glGenRenderbuffersEXT(1, &id_); |
| 1994 } | 1997 } |
| 1995 | 1998 |
| 1996 bool RenderBuffer::AllocateStorage(const gfx::Size& size, GLenum format, | 1999 bool BackRenderbuffer::AllocateStorage(const gfx::Size& size, GLenum format, |
| 1997 GLsizei samples) { | 2000 GLsizei samples) { |
| 1998 ScopedGLErrorSuppressor suppressor(decoder_); | 2001 ScopedGLErrorSuppressor suppressor(decoder_); |
| 1999 ScopedRenderBufferBinder binder(decoder_, id_); | 2002 ScopedRenderBufferBinder binder(decoder_, id_); |
| 2000 | 2003 |
| 2001 uint32 estimated_size = 0; | 2004 uint32 estimated_size = 0; |
| 2002 if (!RenderbufferManager::ComputeEstimatedRenderbufferSize( | 2005 if (!RenderbufferManager::ComputeEstimatedRenderbufferSize( |
| 2003 size.width(), size.height(), samples, format, &estimated_size)) { | 2006 size.width(), size.height(), samples, format, &estimated_size)) { |
| 2004 return false; | 2007 return false; |
| 2005 } | 2008 } |
| 2006 | 2009 |
| 2007 if (!memory_tracker_.EnsureGPUMemoryAvailable(estimated_size)) { | 2010 if (!memory_tracker_.EnsureGPUMemoryAvailable(estimated_size)) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2030 } | 2033 } |
| 2031 bool success = glGetError() == GL_NO_ERROR; | 2034 bool success = glGetError() == GL_NO_ERROR; |
| 2032 if (success) { | 2035 if (success) { |
| 2033 memory_tracker_.TrackMemFree(bytes_allocated_); | 2036 memory_tracker_.TrackMemFree(bytes_allocated_); |
| 2034 bytes_allocated_ = estimated_size; | 2037 bytes_allocated_ = estimated_size; |
| 2035 memory_tracker_.TrackMemAlloc(bytes_allocated_); | 2038 memory_tracker_.TrackMemAlloc(bytes_allocated_); |
| 2036 } | 2039 } |
| 2037 return success; | 2040 return success; |
| 2038 } | 2041 } |
| 2039 | 2042 |
| 2040 void RenderBuffer::Destroy() { | 2043 void BackRenderbuffer::Destroy() { |
| 2041 if (id_ != 0) { | 2044 if (id_ != 0) { |
| 2042 ScopedGLErrorSuppressor suppressor(decoder_); | 2045 ScopedGLErrorSuppressor suppressor(decoder_); |
| 2043 glDeleteRenderbuffersEXT(1, &id_); | 2046 glDeleteRenderbuffersEXT(1, &id_); |
| 2044 id_ = 0; | 2047 id_ = 0; |
| 2045 } | 2048 } |
| 2046 memory_tracker_.TrackMemFree(bytes_allocated_); | 2049 memory_tracker_.TrackMemFree(bytes_allocated_); |
| 2047 bytes_allocated_ = 0; | 2050 bytes_allocated_ = 0; |
| 2048 } | 2051 } |
| 2049 | 2052 |
| 2050 void RenderBuffer::Invalidate() { | 2053 void BackRenderbuffer::Invalidate() { |
| 2051 id_ = 0; | 2054 id_ = 0; |
| 2052 } | 2055 } |
| 2053 | 2056 |
| 2054 FrameBuffer::FrameBuffer(GLES2DecoderImpl* decoder) | 2057 BackFramebuffer::BackFramebuffer(GLES2DecoderImpl* decoder) |
| 2055 : decoder_(decoder), | 2058 : decoder_(decoder), |
| 2056 id_(0) { | 2059 id_(0) { |
| 2057 } | 2060 } |
| 2058 | 2061 |
| 2059 FrameBuffer::~FrameBuffer() { | 2062 BackFramebuffer::~BackFramebuffer() { |
| 2060 // This does not destroy the frame buffer because that would require that | 2063 // This does not destroy the frame buffer because that would require that |
| 2061 // the associated GL context was current. Just check that it was explicitly | 2064 // the associated GL context was current. Just check that it was explicitly |
| 2062 // destroyed. | 2065 // destroyed. |
| 2063 DCHECK_EQ(id_, 0u); | 2066 DCHECK_EQ(id_, 0u); |
| 2064 } | 2067 } |
| 2065 | 2068 |
| 2066 void FrameBuffer::Create() { | 2069 void BackFramebuffer::Create() { |
| 2067 ScopedGLErrorSuppressor suppressor(decoder_); | 2070 ScopedGLErrorSuppressor suppressor(decoder_); |
| 2068 Destroy(); | 2071 Destroy(); |
| 2069 glGenFramebuffersEXT(1, &id_); | 2072 glGenFramebuffersEXT(1, &id_); |
| 2070 } | 2073 } |
| 2071 | 2074 |
| 2072 void FrameBuffer::AttachRenderTexture(Texture* texture) { | 2075 void BackFramebuffer::AttachRenderTexture(BackTexture* texture) { |
| 2073 DCHECK_NE(id_, 0u); | 2076 DCHECK_NE(id_, 0u); |
| 2074 ScopedGLErrorSuppressor suppressor(decoder_); | 2077 ScopedGLErrorSuppressor suppressor(decoder_); |
| 2075 ScopedFrameBufferBinder binder(decoder_, id_); | 2078 ScopedFrameBufferBinder binder(decoder_, id_); |
| 2076 GLuint attach_id = texture ? texture->id() : 0; | 2079 GLuint attach_id = texture ? texture->id() : 0; |
| 2077 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, | 2080 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, |
| 2078 GL_COLOR_ATTACHMENT0, | 2081 GL_COLOR_ATTACHMENT0, |
| 2079 GL_TEXTURE_2D, | 2082 GL_TEXTURE_2D, |
| 2080 attach_id, | 2083 attach_id, |
| 2081 0); | 2084 0); |
| 2082 } | 2085 } |
| 2083 | 2086 |
| 2084 void FrameBuffer::AttachRenderBuffer(GLenum target, | 2087 void BackFramebuffer::AttachRenderBuffer(GLenum target, |
| 2085 RenderBuffer* render_buffer) { | 2088 BackRenderbuffer* render_buffer) { |
| 2086 DCHECK_NE(id_, 0u); | 2089 DCHECK_NE(id_, 0u); |
| 2087 ScopedGLErrorSuppressor suppressor(decoder_); | 2090 ScopedGLErrorSuppressor suppressor(decoder_); |
| 2088 ScopedFrameBufferBinder binder(decoder_, id_); | 2091 ScopedFrameBufferBinder binder(decoder_, id_); |
| 2089 GLuint attach_id = render_buffer ? render_buffer->id() : 0; | 2092 GLuint attach_id = render_buffer ? render_buffer->id() : 0; |
| 2090 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, | 2093 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, |
| 2091 target, | 2094 target, |
| 2092 GL_RENDERBUFFER, | 2095 GL_RENDERBUFFER, |
| 2093 attach_id); | 2096 attach_id); |
| 2094 } | 2097 } |
| 2095 | 2098 |
| 2096 void FrameBuffer::Destroy() { | 2099 void BackFramebuffer::Destroy() { |
| 2097 if (id_ != 0) { | 2100 if (id_ != 0) { |
| 2098 ScopedGLErrorSuppressor suppressor(decoder_); | 2101 ScopedGLErrorSuppressor suppressor(decoder_); |
| 2099 glDeleteFramebuffersEXT(1, &id_); | 2102 glDeleteFramebuffersEXT(1, &id_); |
| 2100 id_ = 0; | 2103 id_ = 0; |
| 2101 } | 2104 } |
| 2102 } | 2105 } |
| 2103 | 2106 |
| 2104 void FrameBuffer::Invalidate() { | 2107 void BackFramebuffer::Invalidate() { |
| 2105 id_ = 0; | 2108 id_ = 0; |
| 2106 } | 2109 } |
| 2107 | 2110 |
| 2108 GLenum FrameBuffer::CheckStatus() { | 2111 GLenum BackFramebuffer::CheckStatus() { |
| 2109 DCHECK_NE(id_, 0u); | 2112 DCHECK_NE(id_, 0u); |
| 2110 ScopedGLErrorSuppressor suppressor(decoder_); | 2113 ScopedGLErrorSuppressor suppressor(decoder_); |
| 2111 ScopedFrameBufferBinder binder(decoder_, id_); | 2114 ScopedFrameBufferBinder binder(decoder_, id_); |
| 2112 return glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); | 2115 return glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
| 2113 } | 2116 } |
| 2114 | 2117 |
| 2115 GLES2Decoder* GLES2Decoder::Create(ContextGroup* group) { | 2118 GLES2Decoder* GLES2Decoder::Create(ContextGroup* group) { |
| 2116 return new GLES2DecoderImpl(group); | 2119 return new GLES2DecoderImpl(group); |
| 2117 } | 2120 } |
| 2118 | 2121 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2254 glGenBuffersARB(1, &attrib_0_buffer_id_); | 2257 glGenBuffersARB(1, &attrib_0_buffer_id_); |
| 2255 glBindBuffer(GL_ARRAY_BUFFER, attrib_0_buffer_id_); | 2258 glBindBuffer(GL_ARRAY_BUFFER, attrib_0_buffer_id_); |
| 2256 glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, NULL); | 2259 glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, NULL); |
| 2257 glBindBuffer(GL_ARRAY_BUFFER, 0); | 2260 glBindBuffer(GL_ARRAY_BUFFER, 0); |
| 2258 glGenBuffersARB(1, &fixed_attrib_buffer_id_); | 2261 glGenBuffersARB(1, &fixed_attrib_buffer_id_); |
| 2259 | 2262 |
| 2260 state_.texture_units.resize(group_->max_texture_units()); | 2263 state_.texture_units.resize(group_->max_texture_units()); |
| 2261 for (uint32 tt = 0; tt < state_.texture_units.size(); ++tt) { | 2264 for (uint32 tt = 0; tt < state_.texture_units.size(); ++tt) { |
| 2262 glActiveTexture(GL_TEXTURE0 + tt); | 2265 glActiveTexture(GL_TEXTURE0 + tt); |
| 2263 // We want the last bind to be 2D. | 2266 // We want the last bind to be 2D. |
| 2264 TextureManager::TextureInfo* info; | 2267 Texture* info; |
| 2265 if (features().oes_egl_image_external) { | 2268 if (features().oes_egl_image_external) { |
| 2266 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_EXTERNAL_OES); | 2269 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_EXTERNAL_OES); |
| 2267 state_.texture_units[tt].bound_texture_external_oes = info; | 2270 state_.texture_units[tt].bound_texture_external_oes = info; |
| 2268 glBindTexture(GL_TEXTURE_EXTERNAL_OES, info->service_id()); | 2271 glBindTexture(GL_TEXTURE_EXTERNAL_OES, info->service_id()); |
| 2269 } | 2272 } |
| 2270 if (features().arb_texture_rectangle) { | 2273 if (features().arb_texture_rectangle) { |
| 2271 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_RECTANGLE_ARB); | 2274 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_RECTANGLE_ARB); |
| 2272 state_.texture_units[tt].bound_texture_rectangle_arb = info; | 2275 state_.texture_units[tt].bound_texture_rectangle_arb = info; |
| 2273 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, info->service_id()); | 2276 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, info->service_id()); |
| 2274 } | 2277 } |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2375 offscreen_target_stencil_format_ = attrib_parser.stencil_size_ > 0 ? | 2378 offscreen_target_stencil_format_ = attrib_parser.stencil_size_ > 0 ? |
| 2376 GL_STENCIL_INDEX : 0; | 2379 GL_STENCIL_INDEX : 0; |
| 2377 } | 2380 } |
| 2378 } | 2381 } |
| 2379 | 2382 |
| 2380 offscreen_saved_color_format_ = attrib_parser.alpha_size_ > 0 ? | 2383 offscreen_saved_color_format_ = attrib_parser.alpha_size_ > 0 ? |
| 2381 GL_RGBA : GL_RGB; | 2384 GL_RGBA : GL_RGB; |
| 2382 | 2385 |
| 2383 // Create the target frame buffer. This is the one that the client renders | 2386 // Create the target frame buffer. This is the one that the client renders |
| 2384 // directly to. | 2387 // directly to. |
| 2385 offscreen_target_frame_buffer_.reset(new FrameBuffer(this)); | 2388 offscreen_target_frame_buffer_.reset(new BackFramebuffer(this)); |
| 2386 offscreen_target_frame_buffer_->Create(); | 2389 offscreen_target_frame_buffer_->Create(); |
| 2387 // Due to GLES2 format limitations, either the color texture (for | 2390 // Due to GLES2 format limitations, either the color texture (for |
| 2388 // non-multisampling) or the color render buffer (for multisampling) will be | 2391 // non-multisampling) or the color render buffer (for multisampling) will be |
| 2389 // attached to the offscreen frame buffer. The render buffer has more | 2392 // attached to the offscreen frame buffer. The render buffer has more |
| 2390 // limited formats available to it, but the texture can't do multisampling. | 2393 // limited formats available to it, but the texture can't do multisampling. |
| 2391 if (IsOffscreenBufferMultisampled()) { | 2394 if (IsOffscreenBufferMultisampled()) { |
| 2392 offscreen_target_color_render_buffer_.reset(new RenderBuffer(this)); | 2395 offscreen_target_color_render_buffer_.reset(new BackRenderbuffer(this)); |
| 2393 offscreen_target_color_render_buffer_->Create(); | 2396 offscreen_target_color_render_buffer_->Create(); |
| 2394 } else { | 2397 } else { |
| 2395 offscreen_target_color_texture_.reset(new Texture(this)); | 2398 offscreen_target_color_texture_.reset(new BackTexture(this)); |
| 2396 offscreen_target_color_texture_->Create(); | 2399 offscreen_target_color_texture_->Create(); |
| 2397 } | 2400 } |
| 2398 offscreen_target_depth_render_buffer_.reset(new RenderBuffer(this)); | 2401 offscreen_target_depth_render_buffer_.reset(new BackRenderbuffer(this)); |
| 2399 offscreen_target_depth_render_buffer_->Create(); | 2402 offscreen_target_depth_render_buffer_->Create(); |
| 2400 offscreen_target_stencil_render_buffer_.reset(new RenderBuffer(this)); | 2403 offscreen_target_stencil_render_buffer_.reset(new BackRenderbuffer(this)); |
| 2401 offscreen_target_stencil_render_buffer_->Create(); | 2404 offscreen_target_stencil_render_buffer_->Create(); |
| 2402 | 2405 |
| 2403 // Create the saved offscreen texture. The target frame buffer is copied | 2406 // Create the saved offscreen texture. The target frame buffer is copied |
| 2404 // here when SwapBuffers is called. | 2407 // here when SwapBuffers is called. |
| 2405 offscreen_saved_frame_buffer_.reset(new FrameBuffer(this)); | 2408 offscreen_saved_frame_buffer_.reset(new BackFramebuffer(this)); |
| 2406 offscreen_saved_frame_buffer_->Create(); | 2409 offscreen_saved_frame_buffer_->Create(); |
| 2407 // | 2410 // |
| 2408 offscreen_saved_color_texture_.reset(new Texture(this)); | 2411 offscreen_saved_color_texture_.reset(new BackTexture(this)); |
| 2409 offscreen_saved_color_texture_->Create(); | 2412 offscreen_saved_color_texture_->Create(); |
| 2410 | 2413 |
| 2411 // Allocate the render buffers at their initial size and check the status | 2414 // Allocate the render buffers at their initial size and check the status |
| 2412 // of the frame buffers is okay. | 2415 // of the frame buffers is okay. |
| 2413 if (!ResizeOffscreenFrameBuffer(size)) { | 2416 if (!ResizeOffscreenFrameBuffer(size)) { |
| 2414 LOG(ERROR) << "Could not allocate offscreen buffer storage."; | 2417 LOG(ERROR) << "Could not allocate offscreen buffer storage."; |
| 2415 Destroy(true); | 2418 Destroy(true); |
| 2416 return false; | 2419 return false; |
| 2417 } | 2420 } |
| 2418 | 2421 |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2567 if (!fragment_translator_.get()) { | 2570 if (!fragment_translator_.get()) { |
| 2568 LOG(ERROR) << "Could not initialize fragment shader translator."; | 2571 LOG(ERROR) << "Could not initialize fragment shader translator."; |
| 2569 Destroy(true); | 2572 Destroy(true); |
| 2570 return false; | 2573 return false; |
| 2571 } | 2574 } |
| 2572 return true; | 2575 return true; |
| 2573 } | 2576 } |
| 2574 | 2577 |
| 2575 bool GLES2DecoderImpl::GenBuffersHelper(GLsizei n, const GLuint* client_ids) { | 2578 bool GLES2DecoderImpl::GenBuffersHelper(GLsizei n, const GLuint* client_ids) { |
| 2576 for (GLsizei ii = 0; ii < n; ++ii) { | 2579 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2577 if (GetBufferInfo(client_ids[ii])) { | 2580 if (GetBuffer(client_ids[ii])) { |
| 2578 return false; | 2581 return false; |
| 2579 } | 2582 } |
| 2580 } | 2583 } |
| 2581 scoped_array<GLuint> service_ids(new GLuint[n]); | 2584 scoped_array<GLuint> service_ids(new GLuint[n]); |
| 2582 glGenBuffersARB(n, service_ids.get()); | 2585 glGenBuffersARB(n, service_ids.get()); |
| 2583 for (GLsizei ii = 0; ii < n; ++ii) { | 2586 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2584 CreateBufferInfo(client_ids[ii], service_ids[ii]); | 2587 CreateBuffer(client_ids[ii], service_ids[ii]); |
| 2585 } | 2588 } |
| 2586 return true; | 2589 return true; |
| 2587 } | 2590 } |
| 2588 | 2591 |
| 2589 bool GLES2DecoderImpl::GenFramebuffersHelper( | 2592 bool GLES2DecoderImpl::GenFramebuffersHelper( |
| 2590 GLsizei n, const GLuint* client_ids) { | 2593 GLsizei n, const GLuint* client_ids) { |
| 2591 for (GLsizei ii = 0; ii < n; ++ii) { | 2594 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2592 if (GetFramebufferInfo(client_ids[ii])) { | 2595 if (GetFramebuffer(client_ids[ii])) { |
| 2593 return false; | 2596 return false; |
| 2594 } | 2597 } |
| 2595 } | 2598 } |
| 2596 scoped_array<GLuint> service_ids(new GLuint[n]); | 2599 scoped_array<GLuint> service_ids(new GLuint[n]); |
| 2597 glGenFramebuffersEXT(n, service_ids.get()); | 2600 glGenFramebuffersEXT(n, service_ids.get()); |
| 2598 for (GLsizei ii = 0; ii < n; ++ii) { | 2601 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2599 CreateFramebufferInfo(client_ids[ii], service_ids[ii]); | 2602 CreateFramebuffer(client_ids[ii], service_ids[ii]); |
| 2600 } | 2603 } |
| 2601 return true; | 2604 return true; |
| 2602 } | 2605 } |
| 2603 | 2606 |
| 2604 bool GLES2DecoderImpl::GenRenderbuffersHelper( | 2607 bool GLES2DecoderImpl::GenRenderbuffersHelper( |
| 2605 GLsizei n, const GLuint* client_ids) { | 2608 GLsizei n, const GLuint* client_ids) { |
| 2606 for (GLsizei ii = 0; ii < n; ++ii) { | 2609 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2607 if (GetRenderbufferInfo(client_ids[ii])) { | 2610 if (GetRenderbuffer(client_ids[ii])) { |
| 2608 return false; | 2611 return false; |
| 2609 } | 2612 } |
| 2610 } | 2613 } |
| 2611 scoped_array<GLuint> service_ids(new GLuint[n]); | 2614 scoped_array<GLuint> service_ids(new GLuint[n]); |
| 2612 glGenRenderbuffersEXT(n, service_ids.get()); | 2615 glGenRenderbuffersEXT(n, service_ids.get()); |
| 2613 for (GLsizei ii = 0; ii < n; ++ii) { | 2616 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2614 CreateRenderbufferInfo(client_ids[ii], service_ids[ii]); | 2617 CreateRenderbuffer(client_ids[ii], service_ids[ii]); |
| 2615 } | 2618 } |
| 2616 return true; | 2619 return true; |
| 2617 } | 2620 } |
| 2618 | 2621 |
| 2619 bool GLES2DecoderImpl::GenTexturesHelper(GLsizei n, const GLuint* client_ids) { | 2622 bool GLES2DecoderImpl::GenTexturesHelper(GLsizei n, const GLuint* client_ids) { |
| 2620 for (GLsizei ii = 0; ii < n; ++ii) { | 2623 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2621 if (GetTextureInfo(client_ids[ii])) { | 2624 if (GetTexture(client_ids[ii])) { |
| 2622 return false; | 2625 return false; |
| 2623 } | 2626 } |
| 2624 } | 2627 } |
| 2625 scoped_array<GLuint> service_ids(new GLuint[n]); | 2628 scoped_array<GLuint> service_ids(new GLuint[n]); |
| 2626 glGenTextures(n, service_ids.get()); | 2629 glGenTextures(n, service_ids.get()); |
| 2627 for (GLsizei ii = 0; ii < n; ++ii) { | 2630 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2628 CreateTextureInfo(client_ids[ii], service_ids[ii]); | 2631 CreateTexture(client_ids[ii], service_ids[ii]); |
| 2629 } | 2632 } |
| 2630 return true; | 2633 return true; |
| 2631 } | 2634 } |
| 2632 | 2635 |
| 2633 void GLES2DecoderImpl::DeleteBuffersHelper( | 2636 void GLES2DecoderImpl::DeleteBuffersHelper( |
| 2634 GLsizei n, const GLuint* client_ids) { | 2637 GLsizei n, const GLuint* client_ids) { |
| 2635 for (GLsizei ii = 0; ii < n; ++ii) { | 2638 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2636 BufferManager::BufferInfo* buffer = GetBufferInfo(client_ids[ii]); | 2639 BufferManager::Buffer* buffer = GetBuffer(client_ids[ii]); |
| 2637 if (buffer && !buffer->IsDeleted()) { | 2640 if (buffer && !buffer->IsDeleted()) { |
| 2638 state_.vertex_attrib_manager->Unbind(buffer); | 2641 state_.vertex_attrib_manager->Unbind(buffer); |
| 2639 if (state_.bound_array_buffer == buffer) { | 2642 if (state_.bound_array_buffer == buffer) { |
| 2640 state_.bound_array_buffer = NULL; | 2643 state_.bound_array_buffer = NULL; |
| 2641 } | 2644 } |
| 2642 RemoveBufferInfo(client_ids[ii]); | 2645 RemoveBuffer(client_ids[ii]); |
| 2643 } | 2646 } |
| 2644 } | 2647 } |
| 2645 } | 2648 } |
| 2646 | 2649 |
| 2647 void GLES2DecoderImpl::DeleteFramebuffersHelper( | 2650 void GLES2DecoderImpl::DeleteFramebuffersHelper( |
| 2648 GLsizei n, const GLuint* client_ids) { | 2651 GLsizei n, const GLuint* client_ids) { |
| 2649 bool supports_separate_framebuffer_binds = | 2652 bool supports_separate_framebuffer_binds = |
| 2650 features().chromium_framebuffer_multisample; | 2653 features().chromium_framebuffer_multisample; |
| 2651 | 2654 |
| 2652 for (GLsizei ii = 0; ii < n; ++ii) { | 2655 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2653 FramebufferManager::FramebufferInfo* framebuffer = | 2656 Framebuffer* framebuffer = |
| 2654 GetFramebufferInfo(client_ids[ii]); | 2657 GetFramebuffer(client_ids[ii]); |
| 2655 if (framebuffer && !framebuffer->IsDeleted()) { | 2658 if (framebuffer && !framebuffer->IsDeleted()) { |
| 2656 if (framebuffer == state_.bound_draw_framebuffer) { | 2659 if (framebuffer == state_.bound_draw_framebuffer) { |
| 2657 state_.bound_draw_framebuffer = NULL; | 2660 state_.bound_draw_framebuffer = NULL; |
| 2658 clear_state_dirty_ = true; | 2661 clear_state_dirty_ = true; |
| 2659 GLenum target = supports_separate_framebuffer_binds ? | 2662 GLenum target = supports_separate_framebuffer_binds ? |
| 2660 GL_DRAW_FRAMEBUFFER_EXT : GL_FRAMEBUFFER; | 2663 GL_DRAW_FRAMEBUFFER_EXT : GL_FRAMEBUFFER; |
| 2661 glBindFramebufferEXT(target, GetBackbufferServiceId()); | 2664 glBindFramebufferEXT(target, GetBackbufferServiceId()); |
| 2662 } | 2665 } |
| 2663 if (framebuffer == state_.bound_read_framebuffer) { | 2666 if (framebuffer == state_.bound_read_framebuffer) { |
| 2664 state_.bound_read_framebuffer = NULL; | 2667 state_.bound_read_framebuffer = NULL; |
| 2665 GLenum target = supports_separate_framebuffer_binds ? | 2668 GLenum target = supports_separate_framebuffer_binds ? |
| 2666 GL_READ_FRAMEBUFFER_EXT : GL_FRAMEBUFFER; | 2669 GL_READ_FRAMEBUFFER_EXT : GL_FRAMEBUFFER; |
| 2667 glBindFramebufferEXT(target, GetBackbufferServiceId()); | 2670 glBindFramebufferEXT(target, GetBackbufferServiceId()); |
| 2668 } | 2671 } |
| 2669 OnFboChanged(); | 2672 OnFboChanged(); |
| 2670 RemoveFramebufferInfo(client_ids[ii]); | 2673 RemoveFramebuffer(client_ids[ii]); |
| 2671 } | 2674 } |
| 2672 } | 2675 } |
| 2673 } | 2676 } |
| 2674 | 2677 |
| 2675 void GLES2DecoderImpl::DeleteRenderbuffersHelper( | 2678 void GLES2DecoderImpl::DeleteRenderbuffersHelper( |
| 2676 GLsizei n, const GLuint* client_ids) { | 2679 GLsizei n, const GLuint* client_ids) { |
| 2677 bool supports_separate_framebuffer_binds = | 2680 bool supports_separate_framebuffer_binds = |
| 2678 features().chromium_framebuffer_multisample; | 2681 features().chromium_framebuffer_multisample; |
| 2679 for (GLsizei ii = 0; ii < n; ++ii) { | 2682 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2680 RenderbufferManager::RenderbufferInfo* renderbuffer = | 2683 Renderbuffer* renderbuffer = |
| 2681 GetRenderbufferInfo(client_ids[ii]); | 2684 GetRenderbuffer(client_ids[ii]); |
| 2682 if (renderbuffer && !renderbuffer->IsDeleted()) { | 2685 if (renderbuffer && !renderbuffer->IsDeleted()) { |
| 2683 if (state_.bound_renderbuffer == renderbuffer) { | 2686 if (state_.bound_renderbuffer == renderbuffer) { |
| 2684 state_.bound_renderbuffer = NULL; | 2687 state_.bound_renderbuffer = NULL; |
| 2685 } | 2688 } |
| 2686 // Unbind from current framebuffers. | 2689 // Unbind from current framebuffers. |
| 2687 if (supports_separate_framebuffer_binds) { | 2690 if (supports_separate_framebuffer_binds) { |
| 2688 if (state_.bound_read_framebuffer) { | 2691 if (state_.bound_read_framebuffer) { |
| 2689 state_.bound_read_framebuffer->UnbindRenderbuffer( | 2692 state_.bound_read_framebuffer->UnbindRenderbuffer( |
| 2690 GL_READ_FRAMEBUFFER_EXT, renderbuffer); | 2693 GL_READ_FRAMEBUFFER_EXT, renderbuffer); |
| 2691 } | 2694 } |
| 2692 if (state_.bound_draw_framebuffer) { | 2695 if (state_.bound_draw_framebuffer) { |
| 2693 state_.bound_draw_framebuffer->UnbindRenderbuffer( | 2696 state_.bound_draw_framebuffer->UnbindRenderbuffer( |
| 2694 GL_DRAW_FRAMEBUFFER_EXT, renderbuffer); | 2697 GL_DRAW_FRAMEBUFFER_EXT, renderbuffer); |
| 2695 } | 2698 } |
| 2696 } else { | 2699 } else { |
| 2697 if (state_.bound_draw_framebuffer) { | 2700 if (state_.bound_draw_framebuffer) { |
| 2698 state_.bound_draw_framebuffer->UnbindRenderbuffer( | 2701 state_.bound_draw_framebuffer->UnbindRenderbuffer( |
| 2699 GL_FRAMEBUFFER, renderbuffer); | 2702 GL_FRAMEBUFFER, renderbuffer); |
| 2700 } | 2703 } |
| 2701 } | 2704 } |
| 2702 clear_state_dirty_ = true; | 2705 clear_state_dirty_ = true; |
| 2703 RemoveRenderbufferInfo(client_ids[ii]); | 2706 RemoveRenderbuffer(client_ids[ii]); |
| 2704 } | 2707 } |
| 2705 } | 2708 } |
| 2706 } | 2709 } |
| 2707 | 2710 |
| 2708 void GLES2DecoderImpl::DeleteTexturesHelper( | 2711 void GLES2DecoderImpl::DeleteTexturesHelper( |
| 2709 GLsizei n, const GLuint* client_ids) { | 2712 GLsizei n, const GLuint* client_ids) { |
| 2710 bool supports_separate_framebuffer_binds = | 2713 bool supports_separate_framebuffer_binds = |
| 2711 features().chromium_framebuffer_multisample; | 2714 features().chromium_framebuffer_multisample; |
| 2712 for (GLsizei ii = 0; ii < n; ++ii) { | 2715 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2713 TextureManager::TextureInfo* texture = GetTextureInfo(client_ids[ii]); | 2716 Texture* texture = GetTexture(client_ids[ii]); |
| 2714 if (texture && !texture->IsDeleted()) { | 2717 if (texture && !texture->IsDeleted()) { |
| 2715 if (texture->IsAttachedToFramebuffer()) { | 2718 if (texture->IsAttachedToFramebuffer()) { |
| 2716 clear_state_dirty_ = true; | 2719 clear_state_dirty_ = true; |
| 2717 } | 2720 } |
| 2718 // Unbind texture from texture units. | 2721 // Unbind texture from texture units. |
| 2719 for (size_t jj = 0; jj < state_.texture_units.size(); ++jj) { | 2722 for (size_t jj = 0; jj < state_.texture_units.size(); ++jj) { |
| 2720 state_.texture_units[jj].Unbind(texture); | 2723 state_.texture_units[jj].Unbind(texture); |
| 2721 } | 2724 } |
| 2722 // Unbind from current framebuffers. | 2725 // Unbind from current framebuffers. |
| 2723 if (supports_separate_framebuffer_binds) { | 2726 if (supports_separate_framebuffer_binds) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2736 } | 2739 } |
| 2737 GLuint service_id = texture->service_id(); | 2740 GLuint service_id = texture->service_id(); |
| 2738 if (texture->IsStreamTexture() && stream_texture_manager_) { | 2741 if (texture->IsStreamTexture() && stream_texture_manager_) { |
| 2739 stream_texture_manager_->DestroyStreamTexture(service_id); | 2742 stream_texture_manager_->DestroyStreamTexture(service_id); |
| 2740 } | 2743 } |
| 2741 #if defined(OS_MACOSX) | 2744 #if defined(OS_MACOSX) |
| 2742 if (texture->target() == GL_TEXTURE_RECTANGLE_ARB) { | 2745 if (texture->target() == GL_TEXTURE_RECTANGLE_ARB) { |
| 2743 ReleaseIOSurfaceForTexture(service_id); | 2746 ReleaseIOSurfaceForTexture(service_id); |
| 2744 } | 2747 } |
| 2745 #endif | 2748 #endif |
| 2746 RemoveTextureInfo(client_ids[ii]); | 2749 RemoveTexture(client_ids[ii]); |
| 2747 } | 2750 } |
| 2748 } | 2751 } |
| 2749 } | 2752 } |
| 2750 | 2753 |
| 2751 // } // anonymous namespace | 2754 // } // anonymous namespace |
| 2752 | 2755 |
| 2753 bool GLES2DecoderImpl::MakeCurrent() { | 2756 bool GLES2DecoderImpl::MakeCurrent() { |
| 2754 if (!context_.get() || !context_->MakeCurrent(surface_.get())) | 2757 if (!context_.get() || !context_->MakeCurrent(surface_.get())) |
| 2755 return false; | 2758 return false; |
| 2756 | 2759 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2785 | 2788 |
| 2786 return true; | 2789 return true; |
| 2787 } | 2790 } |
| 2788 | 2791 |
| 2789 void GLES2DecoderImpl::ReleaseCurrent() { | 2792 void GLES2DecoderImpl::ReleaseCurrent() { |
| 2790 if (context_.get()) | 2793 if (context_.get()) |
| 2791 context_->ReleaseCurrent(surface_.get()); | 2794 context_->ReleaseCurrent(surface_.get()); |
| 2792 } | 2795 } |
| 2793 | 2796 |
| 2794 void GLES2DecoderImpl::RestoreCurrentRenderbufferBindings() { | 2797 void GLES2DecoderImpl::RestoreCurrentRenderbufferBindings() { |
| 2795 RenderbufferManager::RenderbufferInfo* renderbuffer = | 2798 Renderbuffer* renderbuffer = |
| 2796 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); | 2799 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| 2797 glBindRenderbufferEXT( | 2800 glBindRenderbufferEXT( |
| 2798 GL_RENDERBUFFER, renderbuffer ? renderbuffer->service_id() : 0); | 2801 GL_RENDERBUFFER, renderbuffer ? renderbuffer->service_id() : 0); |
| 2799 } | 2802 } |
| 2800 | 2803 |
| 2801 static void RebindCurrentFramebuffer( | 2804 static void RebindCurrentFramebuffer( |
| 2802 GLenum target, | 2805 GLenum target, |
| 2803 FramebufferManager::FramebufferInfo* info, | 2806 Framebuffer* info, |
| 2804 GLuint back_buffer_service_id) { | 2807 GLuint back_buffer_service_id) { |
| 2805 GLuint framebuffer_id = info ? info->service_id() : 0; | 2808 GLuint framebuffer_id = info ? info->service_id() : 0; |
| 2806 | 2809 |
| 2807 if (framebuffer_id == 0) { | 2810 if (framebuffer_id == 0) { |
| 2808 framebuffer_id = back_buffer_service_id; | 2811 framebuffer_id = back_buffer_service_id; |
| 2809 } | 2812 } |
| 2810 | 2813 |
| 2811 glBindFramebufferEXT(target, framebuffer_id); | 2814 glBindFramebufferEXT(target, framebuffer_id); |
| 2812 } | 2815 } |
| 2813 | 2816 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2839 last_id = info.bound_texture_2d->service_id(); | 2842 last_id = info.bound_texture_2d->service_id(); |
| 2840 } else { | 2843 } else { |
| 2841 last_id = 0; | 2844 last_id = 0; |
| 2842 } | 2845 } |
| 2843 | 2846 |
| 2844 glBindTexture(GL_TEXTURE_2D, last_id); | 2847 glBindTexture(GL_TEXTURE_2D, last_id); |
| 2845 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); | 2848 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); |
| 2846 } | 2849 } |
| 2847 | 2850 |
| 2848 bool GLES2DecoderImpl::CheckFramebufferValid( | 2851 bool GLES2DecoderImpl::CheckFramebufferValid( |
| 2849 FramebufferManager::FramebufferInfo* framebuffer, | 2852 Framebuffer* framebuffer, |
| 2850 GLenum target, const char* func_name) { | 2853 GLenum target, const char* func_name) { |
| 2851 if (!framebuffer) { | 2854 if (!framebuffer) { |
| 2852 if (backbuffer_needs_clear_bits_) { | 2855 if (backbuffer_needs_clear_bits_) { |
| 2853 glClearColor(0, 0, 0, (GLES2Util::GetChannelsForFormat( | 2856 glClearColor(0, 0, 0, (GLES2Util::GetChannelsForFormat( |
| 2854 offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1); | 2857 offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1); |
| 2855 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | 2858 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); |
| 2856 glClearStencil(0); | 2859 glClearStencil(0); |
| 2857 glStencilMask(-1); | 2860 glStencilMask(-1); |
| 2858 glClearDepth(1.0f); | 2861 glClearDepth(1.0f); |
| 2859 glDepthMask(true); | 2862 glDepthMask(true); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2915 } | 2918 } |
| 2916 return CheckFramebufferValid( | 2919 return CheckFramebufferValid( |
| 2917 state_.bound_draw_framebuffer, | 2920 state_.bound_draw_framebuffer, |
| 2918 GL_DRAW_FRAMEBUFFER_EXT, func_name) && | 2921 GL_DRAW_FRAMEBUFFER_EXT, func_name) && |
| 2919 CheckFramebufferValid( | 2922 CheckFramebufferValid( |
| 2920 state_.bound_read_framebuffer, | 2923 state_.bound_read_framebuffer, |
| 2921 GL_READ_FRAMEBUFFER_EXT, func_name); | 2924 GL_READ_FRAMEBUFFER_EXT, func_name); |
| 2922 } | 2925 } |
| 2923 | 2926 |
| 2924 gfx::Size GLES2DecoderImpl::GetBoundReadFrameBufferSize() { | 2927 gfx::Size GLES2DecoderImpl::GetBoundReadFrameBufferSize() { |
| 2925 FramebufferManager::FramebufferInfo* framebuffer = | 2928 Framebuffer* framebuffer = |
| 2926 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); | 2929 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); |
| 2927 if (framebuffer != NULL) { | 2930 if (framebuffer != NULL) { |
| 2928 const FramebufferManager::FramebufferInfo::Attachment* attachment = | 2931 const Framebuffer::Attachment* attachment = |
| 2929 framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0); | 2932 framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0); |
| 2930 if (attachment) { | 2933 if (attachment) { |
| 2931 return gfx::Size(attachment->width(), attachment->height()); | 2934 return gfx::Size(attachment->width(), attachment->height()); |
| 2932 } | 2935 } |
| 2933 return gfx::Size(0, 0); | 2936 return gfx::Size(0, 0); |
| 2934 } else if (offscreen_target_frame_buffer_.get()) { | 2937 } else if (offscreen_target_frame_buffer_.get()) { |
| 2935 return offscreen_size_; | 2938 return offscreen_size_; |
| 2936 } else { | 2939 } else { |
| 2937 return surface_->GetSize(); | 2940 return surface_->GetSize(); |
| 2938 } | 2941 } |
| 2939 } | 2942 } |
| 2940 | 2943 |
| 2941 GLenum GLES2DecoderImpl::GetBoundReadFrameBufferInternalFormat() { | 2944 GLenum GLES2DecoderImpl::GetBoundReadFrameBufferInternalFormat() { |
| 2942 FramebufferManager::FramebufferInfo* framebuffer = | 2945 Framebuffer* framebuffer = |
| 2943 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); | 2946 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); |
| 2944 if (framebuffer != NULL) { | 2947 if (framebuffer != NULL) { |
| 2945 return framebuffer->GetColorAttachmentFormat(); | 2948 return framebuffer->GetColorAttachmentFormat(); |
| 2946 } else if (offscreen_target_frame_buffer_.get()) { | 2949 } else if (offscreen_target_frame_buffer_.get()) { |
| 2947 return offscreen_target_color_format_; | 2950 return offscreen_target_color_format_; |
| 2948 } else { | 2951 } else { |
| 2949 return back_buffer_color_format_; | 2952 return back_buffer_color_format_; |
| 2950 } | 2953 } |
| 2951 } | 2954 } |
| 2952 | 2955 |
| 2953 GLenum GLES2DecoderImpl::GetBoundDrawFrameBufferInternalFormat() { | 2956 GLenum GLES2DecoderImpl::GetBoundDrawFrameBufferInternalFormat() { |
| 2954 FramebufferManager::FramebufferInfo* framebuffer = | 2957 Framebuffer* framebuffer = |
| 2955 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); | 2958 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); |
| 2956 if (framebuffer != NULL) { | 2959 if (framebuffer != NULL) { |
| 2957 return framebuffer->GetColorAttachmentFormat(); | 2960 return framebuffer->GetColorAttachmentFormat(); |
| 2958 } else if (offscreen_target_frame_buffer_.get()) { | 2961 } else if (offscreen_target_frame_buffer_.get()) { |
| 2959 return offscreen_target_color_format_; | 2962 return offscreen_target_color_format_; |
| 2960 } else { | 2963 } else { |
| 2961 return back_buffer_color_format_; | 2964 return back_buffer_color_format_; |
| 2962 } | 2965 } |
| 2963 } | 2966 } |
| 2964 | 2967 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3024 return async_pixel_transfer_delegate_.get(); | 3027 return async_pixel_transfer_delegate_.get(); |
| 3025 } | 3028 } |
| 3026 | 3029 |
| 3027 void GLES2DecoderImpl::SetAsyncPixelTransferDelegate( | 3030 void GLES2DecoderImpl::SetAsyncPixelTransferDelegate( |
| 3028 gfx::AsyncPixelTransferDelegate* delegate) { | 3031 gfx::AsyncPixelTransferDelegate* delegate) { |
| 3029 async_pixel_transfer_delegate_ = make_scoped_ptr(delegate); | 3032 async_pixel_transfer_delegate_ = make_scoped_ptr(delegate); |
| 3030 } | 3033 } |
| 3031 | 3034 |
| 3032 bool GLES2DecoderImpl::GetServiceTextureId(uint32 client_texture_id, | 3035 bool GLES2DecoderImpl::GetServiceTextureId(uint32 client_texture_id, |
| 3033 uint32* service_texture_id) { | 3036 uint32* service_texture_id) { |
| 3034 TextureManager::TextureInfo* texture = | 3037 Texture* texture = |
| 3035 texture_manager()->GetTextureInfo(client_texture_id); | 3038 texture_manager()->GetTexture(client_texture_id); |
| 3036 if (texture) { | 3039 if (texture) { |
| 3037 *service_texture_id = texture->service_id(); | 3040 *service_texture_id = texture->service_id(); |
| 3038 return true; | 3041 return true; |
| 3039 } | 3042 } |
| 3040 return false; | 3043 return false; |
| 3041 } | 3044 } |
| 3042 | 3045 |
| 3043 uint32 GLES2DecoderImpl::GetTextureUploadCount() { | 3046 uint32 GLES2DecoderImpl::GetTextureUploadCount() { |
| 3044 return texture_upload_count_ + | 3047 return texture_upload_count_ + |
| 3045 async_pixel_transfer_delegate_->GetTextureUploadCount(); | 3048 async_pixel_transfer_delegate_->GetTextureUploadCount(); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3196 parent_->children_.begin(), | 3199 parent_->children_.begin(), |
| 3197 parent_->children_.end(), | 3200 parent_->children_.end(), |
| 3198 this); | 3201 this); |
| 3199 DCHECK(it != parent_->children_.end()); | 3202 DCHECK(it != parent_->children_.end()); |
| 3200 parent_->children_.erase(it); | 3203 parent_->children_.erase(it); |
| 3201 // First check the texture has been mapped into the parent. This might not | 3204 // First check the texture has been mapped into the parent. This might not |
| 3202 // be the case if initialization failed midway through. | 3205 // be the case if initialization failed midway through. |
| 3203 GLuint service_id = offscreen_saved_color_texture_->id(); | 3206 GLuint service_id = offscreen_saved_color_texture_->id(); |
| 3204 GLuint client_id = 0; | 3207 GLuint client_id = 0; |
| 3205 if (parent_->texture_manager()->GetClientId(service_id, &client_id)) { | 3208 if (parent_->texture_manager()->GetClientId(service_id, &client_id)) { |
| 3206 parent_->texture_manager()->RemoveTextureInfo(client_id); | 3209 parent_->texture_manager()->RemoveTexture(client_id); |
| 3207 } | 3210 } |
| 3208 } | 3211 } |
| 3209 | 3212 |
| 3210 GLES2DecoderImpl* new_parent_impl = static_cast<GLES2DecoderImpl*>( | 3213 GLES2DecoderImpl* new_parent_impl = static_cast<GLES2DecoderImpl*>( |
| 3211 new_parent); | 3214 new_parent); |
| 3212 if (new_parent_impl) { | 3215 if (new_parent_impl) { |
| 3213 #ifndef NDEBUG | 3216 #ifndef NDEBUG |
| 3214 ChildList::iterator it = std::find( | 3217 ChildList::iterator it = std::find( |
| 3215 new_parent_impl->children_.begin(), | 3218 new_parent_impl->children_.begin(), |
| 3216 new_parent_impl->children_.end(), | 3219 new_parent_impl->children_.end(), |
| 3217 this); | 3220 this); |
| 3218 DCHECK(it == new_parent_impl->children_.end()); | 3221 DCHECK(it == new_parent_impl->children_.end()); |
| 3219 #endif | 3222 #endif |
| 3220 new_parent_impl->children_.push_back(this); | 3223 new_parent_impl->children_.push_back(this); |
| 3221 // Map the ID of the saved offscreen texture into the parent so that | 3224 // Map the ID of the saved offscreen texture into the parent so that |
| 3222 // it can reference it. | 3225 // it can reference it. |
| 3223 GLuint service_id = offscreen_saved_color_texture_->id(); | 3226 GLuint service_id = offscreen_saved_color_texture_->id(); |
| 3224 | 3227 |
| 3225 // Replace texture info when ID is already in use by parent. | 3228 // Replace texture info when ID is already in use by parent. |
| 3226 if (new_parent_impl->texture_manager()->GetTextureInfo( | 3229 if (new_parent_impl->texture_manager()->GetTexture( |
| 3227 new_parent_texture_id)) | 3230 new_parent_texture_id)) |
| 3228 new_parent_impl->texture_manager()->RemoveTextureInfo( | 3231 new_parent_impl->texture_manager()->RemoveTexture( |
| 3229 new_parent_texture_id); | 3232 new_parent_texture_id); |
| 3230 | 3233 |
| 3231 offscreen_saved_color_texture_info_ = | 3234 offscreen_saved_color_texture_info_ = |
| 3232 new_parent_impl->CreateTextureInfo(new_parent_texture_id, service_id); | 3235 new_parent_impl->CreateTexture(new_parent_texture_id, service_id); |
| 3233 offscreen_saved_color_texture_info_->SetNotOwned(); | 3236 offscreen_saved_color_texture_info_->SetNotOwned(); |
| 3234 new_parent_impl->texture_manager()-> | 3237 new_parent_impl->texture_manager()-> |
| 3235 SetInfoTarget(offscreen_saved_color_texture_info_, GL_TEXTURE_2D); | 3238 SetInfoTarget(offscreen_saved_color_texture_info_, GL_TEXTURE_2D); |
| 3236 | 3239 |
| 3237 parent_ = base::AsWeakPtr<GLES2DecoderImpl>(new_parent_impl); | 3240 parent_ = base::AsWeakPtr<GLES2DecoderImpl>(new_parent_impl); |
| 3238 | 3241 |
| 3239 UpdateParentTextureInfo(); | 3242 UpdateParentTextureInfo(); |
| 3240 } else { | 3243 } else { |
| 3241 parent_.reset(); | 3244 parent_.reset(); |
| 3242 offscreen_saved_color_texture_info_ = NULL; | 3245 offscreen_saved_color_texture_info_ = NULL; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3383 offscreen_resolved_frame_buffer_->Destroy(); | 3386 offscreen_resolved_frame_buffer_->Destroy(); |
| 3384 if (offscreen_resolved_color_texture_.get()) | 3387 if (offscreen_resolved_color_texture_.get()) |
| 3385 offscreen_resolved_color_texture_->Destroy(); | 3388 offscreen_resolved_color_texture_->Destroy(); |
| 3386 offscreen_resolved_color_texture_.reset(); | 3389 offscreen_resolved_color_texture_.reset(); |
| 3387 offscreen_resolved_frame_buffer_.reset(); | 3390 offscreen_resolved_frame_buffer_.reset(); |
| 3388 | 3391 |
| 3389 return true; | 3392 return true; |
| 3390 } | 3393 } |
| 3391 | 3394 |
| 3392 error::Error GLES2DecoderImpl::HandleResizeCHROMIUM( | 3395 error::Error GLES2DecoderImpl::HandleResizeCHROMIUM( |
| 3393 uint32 immediate_data_size, const gles2::ResizeCHROMIUM& c) { | 3396 uint32 immediate_data_size, const cmds::ResizeCHROMIUM& c) { |
| 3394 if (!offscreen_target_frame_buffer_.get() && surface_->DeferDraws()) | 3397 if (!offscreen_target_frame_buffer_.get() && surface_->DeferDraws()) |
| 3395 return error::kDeferCommandUntilLater; | 3398 return error::kDeferCommandUntilLater; |
| 3396 | 3399 |
| 3397 GLuint width = static_cast<GLuint>(c.width); | 3400 GLuint width = static_cast<GLuint>(c.width); |
| 3398 GLuint height = static_cast<GLuint>(c.height); | 3401 GLuint height = static_cast<GLuint>(c.height); |
| 3399 TRACE_EVENT2("gpu", "glResizeChromium", "width", width, "height", height); | 3402 TRACE_EVENT2("gpu", "glResizeChromium", "width", width, "height", height); |
| 3400 | 3403 |
| 3401 width = std::max(1U, width); | 3404 width = std::max(1U, width); |
| 3402 height = std::max(1U, height); | 3405 height = std::max(1U, height); |
| 3403 | 3406 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3453 unsigned int command_index = command - kStartPoint - 1; | 3456 unsigned int command_index = command - kStartPoint - 1; |
| 3454 if (command_index < arraysize(g_command_info)) { | 3457 if (command_index < arraysize(g_command_info)) { |
| 3455 const CommandInfo& info = g_command_info[command_index]; | 3458 const CommandInfo& info = g_command_info[command_index]; |
| 3456 unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count); | 3459 unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count); |
| 3457 if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) || | 3460 if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) || |
| 3458 (info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) { | 3461 (info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) { |
| 3459 uint32 immediate_data_size = | 3462 uint32 immediate_data_size = |
| 3460 (arg_count - info_arg_count) * sizeof(CommandBufferEntry); // NOLINT | 3463 (arg_count - info_arg_count) * sizeof(CommandBufferEntry); // NOLINT |
| 3461 switch (command) { | 3464 switch (command) { |
| 3462 #define GLES2_CMD_OP(name) \ | 3465 #define GLES2_CMD_OP(name) \ |
| 3463 case name::kCmdId: \ | 3466 case cmds::name::kCmdId: \ |
| 3464 result = Handle ## name( \ | 3467 result = Handle ## name( \ |
| 3465 immediate_data_size, \ | 3468 immediate_data_size, \ |
| 3466 *static_cast<const name*>(cmd_data)); \ | 3469 *static_cast<const gles2::cmds::name*>(cmd_data)); \ |
| 3467 break; \ | 3470 break; \ |
| 3468 | 3471 |
| 3469 GLES2_COMMAND_LIST(GLES2_CMD_OP) | 3472 GLES2_COMMAND_LIST(GLES2_CMD_OP) |
| 3470 #undef GLES2_CMD_OP | 3473 #undef GLES2_CMD_OP |
| 3471 } | 3474 } |
| 3472 if (debug()) { | 3475 if (debug()) { |
| 3473 GLenum error; | 3476 GLenum error; |
| 3474 while ((error = glGetError()) != GL_NO_ERROR) { | 3477 while ((error = glGetError()) != GL_NO_ERROR) { |
| 3475 LOG(ERROR) << "[" << GetLogPrefix() << "] " | 3478 LOG(ERROR) << "[" << GetLogPrefix() << "] " |
| 3476 << "GL ERROR: " << GLES2Util::GetStringEnum(error) << " : " | 3479 << "GL ERROR: " << GLES2Util::GetStringEnum(error) << " : " |
| 3477 << GetCommandName(command); | 3480 << GetCommandName(command); |
| 3478 SetGLError(error, "DoCommand", "GL error from driver"); | 3481 SetGLError(error, "DoCommand", "GL error from driver"); |
| 3479 } | 3482 } |
| 3480 } | 3483 } |
| 3481 } else { | 3484 } else { |
| 3482 result = error::kInvalidArguments; | 3485 result = error::kInvalidArguments; |
| 3483 } | 3486 } |
| 3484 } else { | 3487 } else { |
| 3485 result = DoCommonCommand(command, arg_count, cmd_data); | 3488 result = DoCommonCommand(command, arg_count, cmd_data); |
| 3486 } | 3489 } |
| 3487 if (result == error::kNoError && current_decoder_error_ != error::kNoError) { | 3490 if (result == error::kNoError && current_decoder_error_ != error::kNoError) { |
| 3488 result = current_decoder_error_; | 3491 result = current_decoder_error_; |
| 3489 current_decoder_error_ = error::kNoError; | 3492 current_decoder_error_ = error::kNoError; |
| 3490 } | 3493 } |
| 3491 return result; | 3494 return result; |
| 3492 } | 3495 } |
| 3493 | 3496 |
| 3494 void GLES2DecoderImpl::RemoveBufferInfo(GLuint client_id) { | 3497 void GLES2DecoderImpl::RemoveBuffer(GLuint client_id) { |
| 3495 buffer_manager()->RemoveBufferInfo(client_id); | 3498 buffer_manager()->RemoveBuffer(client_id); |
| 3496 } | 3499 } |
| 3497 | 3500 |
| 3498 bool GLES2DecoderImpl::CreateProgramHelper(GLuint client_id) { | 3501 bool GLES2DecoderImpl::CreateProgramHelper(GLuint client_id) { |
| 3499 if (GetProgramInfo(client_id)) { | 3502 if (GetProgram(client_id)) { |
| 3500 return false; | 3503 return false; |
| 3501 } | 3504 } |
| 3502 GLuint service_id = glCreateProgram(); | 3505 GLuint service_id = glCreateProgram(); |
| 3503 if (service_id != 0) { | 3506 if (service_id != 0) { |
| 3504 CreateProgramInfo(client_id, service_id); | 3507 CreateProgram(client_id, service_id); |
| 3505 } | 3508 } |
| 3506 return true; | 3509 return true; |
| 3507 } | 3510 } |
| 3508 | 3511 |
| 3509 bool GLES2DecoderImpl::CreateShaderHelper(GLenum type, GLuint client_id) { | 3512 bool GLES2DecoderImpl::CreateShaderHelper(GLenum type, GLuint client_id) { |
| 3510 if (GetShaderInfo(client_id)) { | 3513 if (GetShader(client_id)) { |
| 3511 return false; | 3514 return false; |
| 3512 } | 3515 } |
| 3513 GLuint service_id = glCreateShader(type); | 3516 GLuint service_id = glCreateShader(type); |
| 3514 if (service_id != 0) { | 3517 if (service_id != 0) { |
| 3515 CreateShaderInfo(client_id, service_id, type); | 3518 CreateShader(client_id, service_id, type); |
| 3516 } | 3519 } |
| 3517 return true; | 3520 return true; |
| 3518 } | 3521 } |
| 3519 | 3522 |
| 3520 void GLES2DecoderImpl::DoFinish() { | 3523 void GLES2DecoderImpl::DoFinish() { |
| 3521 glFinish(); | 3524 glFinish(); |
| 3522 ProcessPendingQueries(); | 3525 ProcessPendingQueries(); |
| 3523 } | 3526 } |
| 3524 | 3527 |
| 3525 void GLES2DecoderImpl::DoFlush() { | 3528 void GLES2DecoderImpl::DoFlush() { |
| 3526 glFlush(); | 3529 glFlush(); |
| 3527 ProcessPendingQueries(); | 3530 ProcessPendingQueries(); |
| 3528 } | 3531 } |
| 3529 | 3532 |
| 3530 void GLES2DecoderImpl::DoActiveTexture(GLenum texture_unit) { | 3533 void GLES2DecoderImpl::DoActiveTexture(GLenum texture_unit) { |
| 3531 GLuint texture_index = texture_unit - GL_TEXTURE0; | 3534 GLuint texture_index = texture_unit - GL_TEXTURE0; |
| 3532 if (texture_index >= state_.texture_units.size()) { | 3535 if (texture_index >= state_.texture_units.size()) { |
| 3533 SetGLErrorInvalidEnum( | 3536 SetGLErrorInvalidEnum( |
| 3534 "glActiveTexture", texture_unit, "texture_unit"); | 3537 "glActiveTexture", texture_unit, "texture_unit"); |
| 3535 return; | 3538 return; |
| 3536 } | 3539 } |
| 3537 state_.active_texture_unit = texture_index; | 3540 state_.active_texture_unit = texture_index; |
| 3538 glActiveTexture(texture_unit); | 3541 glActiveTexture(texture_unit); |
| 3539 } | 3542 } |
| 3540 | 3543 |
| 3541 void GLES2DecoderImpl::DoBindBuffer(GLenum target, GLuint client_id) { | 3544 void GLES2DecoderImpl::DoBindBuffer(GLenum target, GLuint client_id) { |
| 3542 BufferManager::BufferInfo* info = NULL; | 3545 BufferManager::Buffer* info = NULL; |
| 3543 GLuint service_id = 0; | 3546 GLuint service_id = 0; |
| 3544 if (client_id != 0) { | 3547 if (client_id != 0) { |
| 3545 info = GetBufferInfo(client_id); | 3548 info = GetBuffer(client_id); |
| 3546 if (!info) { | 3549 if (!info) { |
| 3547 if (!group_->bind_generates_resource()) { | 3550 if (!group_->bind_generates_resource()) { |
| 3548 LOG(ERROR) << "glBindBuffer: id not generated by glGenBuffers"; | 3551 LOG(ERROR) << "glBindBuffer: id not generated by glGenBuffers"; |
| 3549 current_decoder_error_ = error::kGenericError; | 3552 current_decoder_error_ = error::kGenericError; |
| 3550 return; | 3553 return; |
| 3551 } | 3554 } |
| 3552 | 3555 |
| 3553 // It's a new id so make a buffer info for it. | 3556 // It's a new id so make a buffer info for it. |
| 3554 glGenBuffersARB(1, &service_id); | 3557 glGenBuffersARB(1, &service_id); |
| 3555 CreateBufferInfo(client_id, service_id); | 3558 CreateBuffer(client_id, service_id); |
| 3556 info = GetBufferInfo(client_id); | 3559 info = GetBuffer(client_id); |
| 3557 IdAllocatorInterface* id_allocator = | 3560 IdAllocatorInterface* id_allocator = |
| 3558 group_->GetIdAllocator(id_namespaces::kBuffers); | 3561 group_->GetIdAllocator(id_namespaces::kBuffers); |
| 3559 id_allocator->MarkAsUsed(client_id); | 3562 id_allocator->MarkAsUsed(client_id); |
| 3560 } | 3563 } |
| 3561 } | 3564 } |
| 3562 LogClientServiceForInfo(info, client_id, "glBindBuffer"); | 3565 LogClientServiceForInfo(info, client_id, "glBindBuffer"); |
| 3563 if (info) { | 3566 if (info) { |
| 3564 if (!buffer_manager()->SetTarget(info, target)) { | 3567 if (!buffer_manager()->SetTarget(info, target)) { |
| 3565 SetGLError(GL_INVALID_OPERATION, | 3568 SetGLError(GL_INVALID_OPERATION, |
| 3566 "glBindBuffer", "buffer bound to more than 1 target"); | 3569 "glBindBuffer", "buffer bound to more than 1 target"); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3581 } | 3584 } |
| 3582 glBindBuffer(target, service_id); | 3585 glBindBuffer(target, service_id); |
| 3583 } | 3586 } |
| 3584 | 3587 |
| 3585 bool GLES2DecoderImpl::BoundFramebufferHasColorAttachmentWithAlpha() { | 3588 bool GLES2DecoderImpl::BoundFramebufferHasColorAttachmentWithAlpha() { |
| 3586 return (GLES2Util::GetChannelsForFormat( | 3589 return (GLES2Util::GetChannelsForFormat( |
| 3587 GetBoundDrawFrameBufferInternalFormat()) & 0x0008) != 0; | 3590 GetBoundDrawFrameBufferInternalFormat()) & 0x0008) != 0; |
| 3588 } | 3591 } |
| 3589 | 3592 |
| 3590 bool GLES2DecoderImpl::BoundFramebufferHasDepthAttachment() { | 3593 bool GLES2DecoderImpl::BoundFramebufferHasDepthAttachment() { |
| 3591 FramebufferManager::FramebufferInfo* framebuffer = | 3594 Framebuffer* framebuffer = |
| 3592 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); | 3595 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); |
| 3593 if (framebuffer) { | 3596 if (framebuffer) { |
| 3594 return framebuffer->HasDepthAttachment(); | 3597 return framebuffer->HasDepthAttachment(); |
| 3595 } | 3598 } |
| 3596 if (offscreen_target_frame_buffer_.get()) { | 3599 if (offscreen_target_frame_buffer_.get()) { |
| 3597 return offscreen_target_depth_format_ != 0; | 3600 return offscreen_target_depth_format_ != 0; |
| 3598 } | 3601 } |
| 3599 return back_buffer_has_depth_; | 3602 return back_buffer_has_depth_; |
| 3600 } | 3603 } |
| 3601 | 3604 |
| 3602 bool GLES2DecoderImpl::BoundFramebufferHasStencilAttachment() { | 3605 bool GLES2DecoderImpl::BoundFramebufferHasStencilAttachment() { |
| 3603 FramebufferManager::FramebufferInfo* framebuffer = | 3606 Framebuffer* framebuffer = |
| 3604 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); | 3607 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); |
| 3605 if (framebuffer) { | 3608 if (framebuffer) { |
| 3606 return framebuffer->HasStencilAttachment(); | 3609 return framebuffer->HasStencilAttachment(); |
| 3607 } | 3610 } |
| 3608 if (offscreen_target_frame_buffer_.get()) { | 3611 if (offscreen_target_frame_buffer_.get()) { |
| 3609 return offscreen_target_stencil_format_ != 0 || | 3612 return offscreen_target_stencil_format_ != 0 || |
| 3610 offscreen_target_depth_format_ == GL_DEPTH24_STENCIL8; | 3613 offscreen_target_depth_format_ == GL_DEPTH24_STENCIL8; |
| 3611 } | 3614 } |
| 3612 return back_buffer_has_stencil_; | 3615 return back_buffer_has_stencil_; |
| 3613 } | 3616 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3662 GetBackbufferServiceId(); | 3665 GetBackbufferServiceId(); |
| 3663 glBindFramebufferEXT(GL_READ_FRAMEBUFFER, service_id); | 3666 glBindFramebufferEXT(GL_READ_FRAMEBUFFER, service_id); |
| 3664 } | 3667 } |
| 3665 OnFboChanged(); | 3668 OnFboChanged(); |
| 3666 | 3669 |
| 3667 } | 3670 } |
| 3668 | 3671 |
| 3669 void GLES2DecoderImpl::RestoreTextureState(unsigned service_id) const { | 3672 void GLES2DecoderImpl::RestoreTextureState(unsigned service_id) const { |
| 3670 GLuint client_id = 0; | 3673 GLuint client_id = 0; |
| 3671 if (texture_manager()->GetClientId(service_id, &client_id)) { | 3674 if (texture_manager()->GetClientId(service_id, &client_id)) { |
| 3672 TextureManager::TextureInfo* texture = GetTextureInfo(client_id); | 3675 Texture* texture = GetTexture(client_id); |
| 3673 glBindTexture(GL_TEXTURE_2D, service_id); | 3676 glBindTexture(GL_TEXTURE_2D, service_id); |
| 3674 glTexParameteri( | 3677 glTexParameteri( |
| 3675 GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap_s()); | 3678 GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, texture->wrap_s()); |
| 3676 glTexParameteri( | 3679 glTexParameteri( |
| 3677 GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texture->wrap_t()); | 3680 GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, texture->wrap_t()); |
| 3678 glTexParameteri( | 3681 glTexParameteri( |
| 3679 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->min_filter()); | 3682 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->min_filter()); |
| 3680 glTexParameteri( | 3683 glTexParameteri( |
| 3681 GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->mag_filter()); | 3684 GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->mag_filter()); |
| 3682 RestoreTextureUnitBindings(state_.active_texture_unit); | 3685 RestoreTextureUnitBindings(state_.active_texture_unit); |
| 3683 } | 3686 } |
| 3684 } | 3687 } |
| 3685 | 3688 |
| 3686 void GLES2DecoderImpl::OnFboChanged() const { | 3689 void GLES2DecoderImpl::OnFboChanged() const { |
| 3687 if (workarounds().restore_scissor_on_fbo_change) | 3690 if (workarounds().restore_scissor_on_fbo_change) |
| 3688 glScissor(state_.scissor_x, state_.scissor_y, | 3691 glScissor(state_.scissor_x, state_.scissor_y, |
| 3689 state_.scissor_width, state_.scissor_height); | 3692 state_.scissor_width, state_.scissor_height); |
| 3690 } | 3693 } |
| 3691 | 3694 |
| 3692 void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { | 3695 void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { |
| 3693 FramebufferManager::FramebufferInfo* info = NULL; | 3696 Framebuffer* info = NULL; |
| 3694 GLuint service_id = 0; | 3697 GLuint service_id = 0; |
| 3695 if (client_id != 0) { | 3698 if (client_id != 0) { |
| 3696 info = GetFramebufferInfo(client_id); | 3699 info = GetFramebuffer(client_id); |
| 3697 if (!info) { | 3700 if (!info) { |
| 3698 if (!group_->bind_generates_resource()) { | 3701 if (!group_->bind_generates_resource()) { |
| 3699 LOG(ERROR) | 3702 LOG(ERROR) |
| 3700 << "glBindFramebuffer: id not generated by glGenFramebuffers"; | 3703 << "glBindFramebuffer: id not generated by glGenFramebuffers"; |
| 3701 current_decoder_error_ = error::kGenericError; | 3704 current_decoder_error_ = error::kGenericError; |
| 3702 return; | 3705 return; |
| 3703 } | 3706 } |
| 3704 | 3707 |
| 3705 // It's a new id so make a framebuffer info for it. | 3708 // It's a new id so make a framebuffer info for it. |
| 3706 glGenFramebuffersEXT(1, &service_id); | 3709 glGenFramebuffersEXT(1, &service_id); |
| 3707 CreateFramebufferInfo(client_id, service_id); | 3710 CreateFramebuffer(client_id, service_id); |
| 3708 info = GetFramebufferInfo(client_id); | 3711 info = GetFramebuffer(client_id); |
| 3709 IdAllocatorInterface* id_allocator = | 3712 IdAllocatorInterface* id_allocator = |
| 3710 group_->GetIdAllocator(id_namespaces::kFramebuffers); | 3713 group_->GetIdAllocator(id_namespaces::kFramebuffers); |
| 3711 id_allocator->MarkAsUsed(client_id); | 3714 id_allocator->MarkAsUsed(client_id); |
| 3712 } else { | 3715 } else { |
| 3713 service_id = info->service_id(); | 3716 service_id = info->service_id(); |
| 3714 } | 3717 } |
| 3715 info->MarkAsValid(); | 3718 info->MarkAsValid(); |
| 3716 } | 3719 } |
| 3717 LogClientServiceForInfo(info, client_id, "glBindFramebuffer"); | 3720 LogClientServiceForInfo(info, client_id, "glBindFramebuffer"); |
| 3718 | 3721 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3729 // backbuffer. | 3732 // backbuffer. |
| 3730 if (info == NULL) { | 3733 if (info == NULL) { |
| 3731 service_id = GetBackbufferServiceId(); | 3734 service_id = GetBackbufferServiceId(); |
| 3732 } | 3735 } |
| 3733 | 3736 |
| 3734 glBindFramebufferEXT(target, service_id); | 3737 glBindFramebufferEXT(target, service_id); |
| 3735 OnFboChanged(); | 3738 OnFboChanged(); |
| 3736 } | 3739 } |
| 3737 | 3740 |
| 3738 void GLES2DecoderImpl::DoBindRenderbuffer(GLenum target, GLuint client_id) { | 3741 void GLES2DecoderImpl::DoBindRenderbuffer(GLenum target, GLuint client_id) { |
| 3739 RenderbufferManager::RenderbufferInfo* info = NULL; | 3742 Renderbuffer* info = NULL; |
| 3740 GLuint service_id = 0; | 3743 GLuint service_id = 0; |
| 3741 if (client_id != 0) { | 3744 if (client_id != 0) { |
| 3742 info = GetRenderbufferInfo(client_id); | 3745 info = GetRenderbuffer(client_id); |
| 3743 if (!info) { | 3746 if (!info) { |
| 3744 if (!group_->bind_generates_resource()) { | 3747 if (!group_->bind_generates_resource()) { |
| 3745 LOG(ERROR) | 3748 LOG(ERROR) |
| 3746 << "glBindRenderbuffer: id not generated by glGenRenderbuffers"; | 3749 << "glBindRenderbuffer: id not generated by glGenRenderbuffers"; |
| 3747 current_decoder_error_ = error::kGenericError; | 3750 current_decoder_error_ = error::kGenericError; |
| 3748 return; | 3751 return; |
| 3749 } | 3752 } |
| 3750 | 3753 |
| 3751 // It's a new id so make a renderbuffer info for it. | 3754 // It's a new id so make a renderbuffer info for it. |
| 3752 glGenRenderbuffersEXT(1, &service_id); | 3755 glGenRenderbuffersEXT(1, &service_id); |
| 3753 CreateRenderbufferInfo(client_id, service_id); | 3756 CreateRenderbuffer(client_id, service_id); |
| 3754 info = GetRenderbufferInfo(client_id); | 3757 info = GetRenderbuffer(client_id); |
| 3755 IdAllocatorInterface* id_allocator = | 3758 IdAllocatorInterface* id_allocator = |
| 3756 group_->GetIdAllocator(id_namespaces::kRenderbuffers); | 3759 group_->GetIdAllocator(id_namespaces::kRenderbuffers); |
| 3757 id_allocator->MarkAsUsed(client_id); | 3760 id_allocator->MarkAsUsed(client_id); |
| 3758 } else { | 3761 } else { |
| 3759 service_id = info->service_id(); | 3762 service_id = info->service_id(); |
| 3760 } | 3763 } |
| 3761 info->MarkAsValid(); | 3764 info->MarkAsValid(); |
| 3762 } | 3765 } |
| 3763 LogClientServiceForInfo(info, client_id, "glBindRenerbuffer"); | 3766 LogClientServiceForInfo(info, client_id, "glBindRenerbuffer"); |
| 3764 state_.bound_renderbuffer = info; | 3767 state_.bound_renderbuffer = info; |
| 3765 glBindRenderbufferEXT(target, service_id); | 3768 glBindRenderbufferEXT(target, service_id); |
| 3766 } | 3769 } |
| 3767 | 3770 |
| 3768 void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) { | 3771 void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) { |
| 3769 TextureManager::TextureInfo* info = NULL; | 3772 Texture* info = NULL; |
| 3770 GLuint service_id = 0; | 3773 GLuint service_id = 0; |
| 3771 if (client_id != 0) { | 3774 if (client_id != 0) { |
| 3772 info = GetTextureInfo(client_id); | 3775 info = GetTexture(client_id); |
| 3773 if (!info) { | 3776 if (!info) { |
| 3774 if (!group_->bind_generates_resource()) { | 3777 if (!group_->bind_generates_resource()) { |
| 3775 LOG(ERROR) << "glBindTexture: id not generated by glGenTextures"; | 3778 LOG(ERROR) << "glBindTexture: id not generated by glGenTextures"; |
| 3776 current_decoder_error_ = error::kGenericError; | 3779 current_decoder_error_ = error::kGenericError; |
| 3777 return; | 3780 return; |
| 3778 } | 3781 } |
| 3779 | 3782 |
| 3780 // It's a new id so make a texture info for it. | 3783 // It's a new id so make a texture info for it. |
| 3781 glGenTextures(1, &service_id); | 3784 glGenTextures(1, &service_id); |
| 3782 DCHECK_NE(0u, service_id); | 3785 DCHECK_NE(0u, service_id); |
| 3783 CreateTextureInfo(client_id, service_id); | 3786 CreateTexture(client_id, service_id); |
| 3784 info = GetTextureInfo(client_id); | 3787 info = GetTexture(client_id); |
| 3785 IdAllocatorInterface* id_allocator = | 3788 IdAllocatorInterface* id_allocator = |
| 3786 group_->GetIdAllocator(id_namespaces::kTextures); | 3789 group_->GetIdAllocator(id_namespaces::kTextures); |
| 3787 id_allocator->MarkAsUsed(client_id); | 3790 id_allocator->MarkAsUsed(client_id); |
| 3788 } | 3791 } |
| 3789 } else { | 3792 } else { |
| 3790 info = texture_manager()->GetDefaultTextureInfo(target); | 3793 info = texture_manager()->GetDefaultTextureInfo(target); |
| 3791 } | 3794 } |
| 3792 | 3795 |
| 3793 // Check the texture exists | 3796 // Check the texture exists |
| 3794 // Check that we are not trying to bind it to a different target. | 3797 // Check that we are not trying to bind it to a different target. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3844 } | 3847 } |
| 3845 } else { | 3848 } else { |
| 3846 SetGLError(GL_INVALID_VALUE, | 3849 SetGLError(GL_INVALID_VALUE, |
| 3847 "glDisableVertexAttribArray", "index out of range"); | 3850 "glDisableVertexAttribArray", "index out of range"); |
| 3848 } | 3851 } |
| 3849 } | 3852 } |
| 3850 | 3853 |
| 3851 void GLES2DecoderImpl::DoDiscardFramebufferEXT(GLenum target, | 3854 void GLES2DecoderImpl::DoDiscardFramebufferEXT(GLenum target, |
| 3852 GLsizei numAttachments, | 3855 GLsizei numAttachments, |
| 3853 const GLenum* attachments) { | 3856 const GLenum* attachments) { |
| 3854 FramebufferManager::FramebufferInfo* framebuffer = | 3857 Framebuffer* framebuffer = |
| 3855 GetFramebufferInfoForTarget(GL_FRAMEBUFFER); | 3858 GetFramebufferInfoForTarget(GL_FRAMEBUFFER); |
| 3856 | 3859 |
| 3857 // Validates the attachments. If one of them fails | 3860 // Validates the attachments. If one of them fails |
| 3858 // the whole command fails. | 3861 // the whole command fails. |
| 3859 for (GLsizei i = 0; i < numAttachments; ++i) { | 3862 for (GLsizei i = 0; i < numAttachments; ++i) { |
| 3860 if ((framebuffer && | 3863 if ((framebuffer && |
| 3861 !validators_->attachment.IsValid(attachments[i])) || | 3864 !validators_->attachment.IsValid(attachments[i])) || |
| 3862 (!framebuffer && | 3865 (!framebuffer && |
| 3863 !validators_->backbuffer_attachment.IsValid(attachments[i]))) { | 3866 !validators_->backbuffer_attachment.IsValid(attachments[i]))) { |
| 3864 SetGLErrorInvalidEnum("glDiscardFramebufferEXT", | 3867 SetGLErrorInvalidEnum("glDiscardFramebufferEXT", |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3898 void GLES2DecoderImpl::DoEnableVertexAttribArray(GLuint index) { | 3901 void GLES2DecoderImpl::DoEnableVertexAttribArray(GLuint index) { |
| 3899 if (state_.vertex_attrib_manager->Enable(index, true)) { | 3902 if (state_.vertex_attrib_manager->Enable(index, true)) { |
| 3900 glEnableVertexAttribArray(index); | 3903 glEnableVertexAttribArray(index); |
| 3901 } else { | 3904 } else { |
| 3902 SetGLError(GL_INVALID_VALUE, | 3905 SetGLError(GL_INVALID_VALUE, |
| 3903 "glEnableVertexAttribArray", "index out of range"); | 3906 "glEnableVertexAttribArray", "index out of range"); |
| 3904 } | 3907 } |
| 3905 } | 3908 } |
| 3906 | 3909 |
| 3907 void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) { | 3910 void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) { |
| 3908 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 3911 Texture* info = GetTextureInfoForTarget(target); |
| 3909 if (!info || | 3912 if (!info || |
| 3910 !texture_manager()->CanGenerateMipmaps(info)) { | 3913 !texture_manager()->CanGenerateMipmaps(info)) { |
| 3911 SetGLError(GL_INVALID_OPERATION, | 3914 SetGLError(GL_INVALID_OPERATION, |
| 3912 "glGenerateMipmaps", "Can not generate mips"); | 3915 "glGenerateMipmaps", "Can not generate mips"); |
| 3913 return; | 3916 return; |
| 3914 } | 3917 } |
| 3915 | 3918 |
| 3916 if (target == GL_TEXTURE_CUBE_MAP) { | 3919 if (target == GL_TEXTURE_CUBE_MAP) { |
| 3917 for (int i = 0; i < 6; ++i) { | 3920 for (int i = 0; i < 6; ++i) { |
| 3918 GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i; | 3921 GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i; |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4102 *params = client_id; | 4105 *params = client_id; |
| 4103 } else { | 4106 } else { |
| 4104 *params = 0; | 4107 *params = 0; |
| 4105 } | 4108 } |
| 4106 } | 4109 } |
| 4107 return true; | 4110 return true; |
| 4108 case GL_FRAMEBUFFER_BINDING: | 4111 case GL_FRAMEBUFFER_BINDING: |
| 4109 // case GL_DRAW_FRAMEBUFFER_BINDING_EXT: (same as GL_FRAMEBUFFER_BINDING) | 4112 // case GL_DRAW_FRAMEBUFFER_BINDING_EXT: (same as GL_FRAMEBUFFER_BINDING) |
| 4110 *num_written = 1; | 4113 *num_written = 1; |
| 4111 if (params) { | 4114 if (params) { |
| 4112 FramebufferManager::FramebufferInfo* framebuffer = | 4115 Framebuffer* framebuffer = |
| 4113 GetFramebufferInfoForTarget(GL_FRAMEBUFFER); | 4116 GetFramebufferInfoForTarget(GL_FRAMEBUFFER); |
| 4114 if (framebuffer) { | 4117 if (framebuffer) { |
| 4115 GLuint client_id = 0; | 4118 GLuint client_id = 0; |
| 4116 framebuffer_manager()->GetClientId( | 4119 framebuffer_manager()->GetClientId( |
| 4117 framebuffer->service_id(), &client_id); | 4120 framebuffer->service_id(), &client_id); |
| 4118 *params = client_id; | 4121 *params = client_id; |
| 4119 } else { | 4122 } else { |
| 4120 *params = 0; | 4123 *params = 0; |
| 4121 } | 4124 } |
| 4122 } | 4125 } |
| 4123 return true; | 4126 return true; |
| 4124 case GL_READ_FRAMEBUFFER_BINDING_EXT: | 4127 case GL_READ_FRAMEBUFFER_BINDING_EXT: |
| 4125 *num_written = 1; | 4128 *num_written = 1; |
| 4126 if (params) { | 4129 if (params) { |
| 4127 FramebufferManager::FramebufferInfo* framebuffer = | 4130 Framebuffer* framebuffer = |
| 4128 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); | 4131 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); |
| 4129 if (framebuffer) { | 4132 if (framebuffer) { |
| 4130 GLuint client_id = 0; | 4133 GLuint client_id = 0; |
| 4131 framebuffer_manager()->GetClientId( | 4134 framebuffer_manager()->GetClientId( |
| 4132 framebuffer->service_id(), &client_id); | 4135 framebuffer->service_id(), &client_id); |
| 4133 *params = client_id; | 4136 *params = client_id; |
| 4134 } else { | 4137 } else { |
| 4135 *params = 0; | 4138 *params = 0; |
| 4136 } | 4139 } |
| 4137 } | 4140 } |
| 4138 return true; | 4141 return true; |
| 4139 case GL_RENDERBUFFER_BINDING: | 4142 case GL_RENDERBUFFER_BINDING: |
| 4140 *num_written = 1; | 4143 *num_written = 1; |
| 4141 if (params) { | 4144 if (params) { |
| 4142 RenderbufferManager::RenderbufferInfo* renderbuffer = | 4145 Renderbuffer* renderbuffer = |
| 4143 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); | 4146 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| 4144 if (renderbuffer) { | 4147 if (renderbuffer) { |
| 4145 GLuint client_id = 0; | 4148 GLuint client_id = 0; |
| 4146 renderbuffer_manager()->GetClientId( | 4149 renderbuffer_manager()->GetClientId( |
| 4147 renderbuffer->service_id(), &client_id); | 4150 renderbuffer->service_id(), &client_id); |
| 4148 *params = client_id; | 4151 *params = client_id; |
| 4149 } else { | 4152 } else { |
| 4150 *params = 0; | 4153 *params = 0; |
| 4151 } | 4154 } |
| 4152 } | 4155 } |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4301 DCHECK(params); | 4304 DCHECK(params); |
| 4302 GLsizei num_written; | 4305 GLsizei num_written; |
| 4303 if (!state_.GetStateAsGLint(pname, params, &num_written) && | 4306 if (!state_.GetStateAsGLint(pname, params, &num_written) && |
| 4304 !GetHelper(pname, params, &num_written)) { | 4307 !GetHelper(pname, params, &num_written)) { |
| 4305 glGetIntegerv(pname, params); | 4308 glGetIntegerv(pname, params); |
| 4306 } | 4309 } |
| 4307 } | 4310 } |
| 4308 | 4311 |
| 4309 void GLES2DecoderImpl::DoGetProgramiv( | 4312 void GLES2DecoderImpl::DoGetProgramiv( |
| 4310 GLuint program_id, GLenum pname, GLint* params) { | 4313 GLuint program_id, GLenum pname, GLint* params) { |
| 4311 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 4314 Program* info = GetProgramInfoNotShader( |
| 4312 program_id, "glGetProgramiv"); | 4315 program_id, "glGetProgramiv"); |
| 4313 if (!info) { | 4316 if (!info) { |
| 4314 return; | 4317 return; |
| 4315 } | 4318 } |
| 4316 info->GetProgramiv(pname, params); | 4319 info->GetProgramiv(pname, params); |
| 4317 } | 4320 } |
| 4318 | 4321 |
| 4319 void GLES2DecoderImpl::DoBindAttribLocation( | 4322 void GLES2DecoderImpl::DoBindAttribLocation( |
| 4320 GLuint program, GLuint index, const char* name) { | 4323 GLuint program, GLuint index, const char* name) { |
| 4321 if (!StringIsValidForGLES(name)) { | 4324 if (!StringIsValidForGLES(name)) { |
| 4322 SetGLError(GL_INVALID_VALUE, "glBindAttribLocation", "Invalid character"); | 4325 SetGLError(GL_INVALID_VALUE, "glBindAttribLocation", "Invalid character"); |
| 4323 return; | 4326 return; |
| 4324 } | 4327 } |
| 4325 if (ProgramManager::IsInvalidPrefix(name, strlen(name))) { | 4328 if (ProgramManager::IsInvalidPrefix(name, strlen(name))) { |
| 4326 SetGLError(GL_INVALID_OPERATION, "glBindAttribLocation", "reserved prefix"); | 4329 SetGLError(GL_INVALID_OPERATION, "glBindAttribLocation", "reserved prefix"); |
| 4327 return; | 4330 return; |
| 4328 } | 4331 } |
| 4329 if (index >= group_->max_vertex_attribs()) { | 4332 if (index >= group_->max_vertex_attribs()) { |
| 4330 SetGLError(GL_INVALID_VALUE, "glBindAttribLocation", "index out of range"); | 4333 SetGLError(GL_INVALID_VALUE, "glBindAttribLocation", "index out of range"); |
| 4331 return; | 4334 return; |
| 4332 } | 4335 } |
| 4333 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 4336 Program* info = GetProgramInfoNotShader( |
| 4334 program, "glBindAttribLocation"); | 4337 program, "glBindAttribLocation"); |
| 4335 if (!info) { | 4338 if (!info) { |
| 4336 return; | 4339 return; |
| 4337 } | 4340 } |
| 4338 info->SetAttribLocationBinding(name, static_cast<GLint>(index)); | 4341 info->SetAttribLocationBinding(name, static_cast<GLint>(index)); |
| 4339 glBindAttribLocation(info->service_id(), index, name); | 4342 glBindAttribLocation(info->service_id(), index, name); |
| 4340 } | 4343 } |
| 4341 | 4344 |
| 4342 error::Error GLES2DecoderImpl::HandleBindAttribLocation( | 4345 error::Error GLES2DecoderImpl::HandleBindAttribLocation( |
| 4343 uint32 immediate_data_size, const gles2::BindAttribLocation& c) { | 4346 uint32 immediate_data_size, const cmds::BindAttribLocation& c) { |
| 4344 GLuint program = static_cast<GLuint>(c.program); | 4347 GLuint program = static_cast<GLuint>(c.program); |
| 4345 GLuint index = static_cast<GLuint>(c.index); | 4348 GLuint index = static_cast<GLuint>(c.index); |
| 4346 uint32 name_size = c.data_size; | 4349 uint32 name_size = c.data_size; |
| 4347 const char* name = GetSharedMemoryAs<const char*>( | 4350 const char* name = GetSharedMemoryAs<const char*>( |
| 4348 c.name_shm_id, c.name_shm_offset, name_size); | 4351 c.name_shm_id, c.name_shm_offset, name_size); |
| 4349 if (name == NULL) { | 4352 if (name == NULL) { |
| 4350 return error::kOutOfBounds; | 4353 return error::kOutOfBounds; |
| 4351 } | 4354 } |
| 4352 String name_str(name, name_size); | 4355 String name_str(name, name_size); |
| 4353 DoBindAttribLocation(program, index, name_str.c_str()); | 4356 DoBindAttribLocation(program, index, name_str.c_str()); |
| 4354 return error::kNoError; | 4357 return error::kNoError; |
| 4355 } | 4358 } |
| 4356 | 4359 |
| 4357 error::Error GLES2DecoderImpl::HandleBindAttribLocationImmediate( | 4360 error::Error GLES2DecoderImpl::HandleBindAttribLocationImmediate( |
| 4358 uint32 immediate_data_size, const gles2::BindAttribLocationImmediate& c) { | 4361 uint32 immediate_data_size, const cmds::BindAttribLocationImmediate& c) { |
| 4359 GLuint program = static_cast<GLuint>(c.program); | 4362 GLuint program = static_cast<GLuint>(c.program); |
| 4360 GLuint index = static_cast<GLuint>(c.index); | 4363 GLuint index = static_cast<GLuint>(c.index); |
| 4361 uint32 name_size = c.data_size; | 4364 uint32 name_size = c.data_size; |
| 4362 const char* name = GetImmediateDataAs<const char*>( | 4365 const char* name = GetImmediateDataAs<const char*>( |
| 4363 c, name_size, immediate_data_size); | 4366 c, name_size, immediate_data_size); |
| 4364 if (name == NULL) { | 4367 if (name == NULL) { |
| 4365 return error::kOutOfBounds; | 4368 return error::kOutOfBounds; |
| 4366 } | 4369 } |
| 4367 String name_str(name, name_size); | 4370 String name_str(name, name_size); |
| 4368 DoBindAttribLocation(program, index, name_str.c_str()); | 4371 DoBindAttribLocation(program, index, name_str.c_str()); |
| 4369 return error::kNoError; | 4372 return error::kNoError; |
| 4370 } | 4373 } |
| 4371 | 4374 |
| 4372 error::Error GLES2DecoderImpl::HandleBindAttribLocationBucket( | 4375 error::Error GLES2DecoderImpl::HandleBindAttribLocationBucket( |
| 4373 uint32 immediate_data_size, const gles2::BindAttribLocationBucket& c) { | 4376 uint32 immediate_data_size, const cmds::BindAttribLocationBucket& c) { |
| 4374 GLuint program = static_cast<GLuint>(c.program); | 4377 GLuint program = static_cast<GLuint>(c.program); |
| 4375 GLuint index = static_cast<GLuint>(c.index); | 4378 GLuint index = static_cast<GLuint>(c.index); |
| 4376 Bucket* bucket = GetBucket(c.name_bucket_id); | 4379 Bucket* bucket = GetBucket(c.name_bucket_id); |
| 4377 if (!bucket || bucket->size() == 0) { | 4380 if (!bucket || bucket->size() == 0) { |
| 4378 return error::kInvalidArguments; | 4381 return error::kInvalidArguments; |
| 4379 } | 4382 } |
| 4380 std::string name_str; | 4383 std::string name_str; |
| 4381 if (!bucket->GetAsString(&name_str)) { | 4384 if (!bucket->GetAsString(&name_str)) { |
| 4382 return error::kInvalidArguments; | 4385 return error::kInvalidArguments; |
| 4383 } | 4386 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 4397 "glBindUniformLocationCHROMIUM", "reserved prefix"); | 4400 "glBindUniformLocationCHROMIUM", "reserved prefix"); |
| 4398 return; | 4401 return; |
| 4399 } | 4402 } |
| 4400 if (location < 0 || static_cast<uint32>(location) >= | 4403 if (location < 0 || static_cast<uint32>(location) >= |
| 4401 (group_->max_fragment_uniform_vectors() + | 4404 (group_->max_fragment_uniform_vectors() + |
| 4402 group_->max_vertex_uniform_vectors()) * 4) { | 4405 group_->max_vertex_uniform_vectors()) * 4) { |
| 4403 SetGLError(GL_INVALID_VALUE, | 4406 SetGLError(GL_INVALID_VALUE, |
| 4404 "glBindUniformLocationCHROMIUM", "location out of range"); | 4407 "glBindUniformLocationCHROMIUM", "location out of range"); |
| 4405 return; | 4408 return; |
| 4406 } | 4409 } |
| 4407 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 4410 Program* info = GetProgramInfoNotShader( |
| 4408 program, "glBindUniformLocationCHROMIUM"); | 4411 program, "glBindUniformLocationCHROMIUM"); |
| 4409 if (!info) { | 4412 if (!info) { |
| 4410 return; | 4413 return; |
| 4411 } | 4414 } |
| 4412 if (!info->SetUniformLocationBinding(name, location)) { | 4415 if (!info->SetUniformLocationBinding(name, location)) { |
| 4413 SetGLError(GL_INVALID_VALUE, | 4416 SetGLError(GL_INVALID_VALUE, |
| 4414 "glBindUniformLocationCHROMIUM", "location out of range"); | 4417 "glBindUniformLocationCHROMIUM", "location out of range"); |
| 4415 } | 4418 } |
| 4416 } | 4419 } |
| 4417 | 4420 |
| 4418 error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUM( | 4421 error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUM( |
| 4419 uint32 immediate_data_size, const gles2::BindUniformLocationCHROMIUM& c) { | 4422 uint32 immediate_data_size, const cmds::BindUniformLocationCHROMIUM& c) { |
| 4420 GLuint program = static_cast<GLuint>(c.program); | 4423 GLuint program = static_cast<GLuint>(c.program); |
| 4421 GLint location = static_cast<GLint>(c.location); | 4424 GLint location = static_cast<GLint>(c.location); |
| 4422 uint32 name_size = c.data_size; | 4425 uint32 name_size = c.data_size; |
| 4423 const char* name = GetSharedMemoryAs<const char*>( | 4426 const char* name = GetSharedMemoryAs<const char*>( |
| 4424 c.name_shm_id, c.name_shm_offset, name_size); | 4427 c.name_shm_id, c.name_shm_offset, name_size); |
| 4425 if (name == NULL) { | 4428 if (name == NULL) { |
| 4426 return error::kOutOfBounds; | 4429 return error::kOutOfBounds; |
| 4427 } | 4430 } |
| 4428 String name_str(name, name_size); | 4431 String name_str(name, name_size); |
| 4429 DoBindUniformLocationCHROMIUM(program, location, name_str.c_str()); | 4432 DoBindUniformLocationCHROMIUM(program, location, name_str.c_str()); |
| 4430 return error::kNoError; | 4433 return error::kNoError; |
| 4431 } | 4434 } |
| 4432 | 4435 |
| 4433 error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUMImmediate( | 4436 error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUMImmediate( |
| 4434 uint32 immediate_data_size, | 4437 uint32 immediate_data_size, |
| 4435 const gles2::BindUniformLocationCHROMIUMImmediate& c) { | 4438 const cmds::BindUniformLocationCHROMIUMImmediate& c) { |
| 4436 GLuint program = static_cast<GLuint>(c.program); | 4439 GLuint program = static_cast<GLuint>(c.program); |
| 4437 GLint location = static_cast<GLint>(c.location); | 4440 GLint location = static_cast<GLint>(c.location); |
| 4438 uint32 name_size = c.data_size; | 4441 uint32 name_size = c.data_size; |
| 4439 const char* name = GetImmediateDataAs<const char*>( | 4442 const char* name = GetImmediateDataAs<const char*>( |
| 4440 c, name_size, immediate_data_size); | 4443 c, name_size, immediate_data_size); |
| 4441 if (name == NULL) { | 4444 if (name == NULL) { |
| 4442 return error::kOutOfBounds; | 4445 return error::kOutOfBounds; |
| 4443 } | 4446 } |
| 4444 String name_str(name, name_size); | 4447 String name_str(name, name_size); |
| 4445 DoBindUniformLocationCHROMIUM(program, location, name_str.c_str()); | 4448 DoBindUniformLocationCHROMIUM(program, location, name_str.c_str()); |
| 4446 return error::kNoError; | 4449 return error::kNoError; |
| 4447 } | 4450 } |
| 4448 | 4451 |
| 4449 error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUMBucket( | 4452 error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUMBucket( |
| 4450 uint32 immediate_data_size, | 4453 uint32 immediate_data_size, |
| 4451 const gles2::BindUniformLocationCHROMIUMBucket& c) { | 4454 const cmds::BindUniformLocationCHROMIUMBucket& c) { |
| 4452 GLuint program = static_cast<GLuint>(c.program); | 4455 GLuint program = static_cast<GLuint>(c.program); |
| 4453 GLint location = static_cast<GLint>(c.location); | 4456 GLint location = static_cast<GLint>(c.location); |
| 4454 Bucket* bucket = GetBucket(c.name_bucket_id); | 4457 Bucket* bucket = GetBucket(c.name_bucket_id); |
| 4455 if (!bucket || bucket->size() == 0) { | 4458 if (!bucket || bucket->size() == 0) { |
| 4456 return error::kInvalidArguments; | 4459 return error::kInvalidArguments; |
| 4457 } | 4460 } |
| 4458 std::string name_str; | 4461 std::string name_str; |
| 4459 if (!bucket->GetAsString(&name_str)) { | 4462 if (!bucket->GetAsString(&name_str)) { |
| 4460 return error::kInvalidArguments; | 4463 return error::kInvalidArguments; |
| 4461 } | 4464 } |
| 4462 DoBindUniformLocationCHROMIUM(program, location, name_str.c_str()); | 4465 DoBindUniformLocationCHROMIUM(program, location, name_str.c_str()); |
| 4463 return error::kNoError; | 4466 return error::kNoError; |
| 4464 } | 4467 } |
| 4465 | 4468 |
| 4466 error::Error GLES2DecoderImpl::HandleDeleteShader( | 4469 error::Error GLES2DecoderImpl::HandleDeleteShader( |
| 4467 uint32 immediate_data_size, const gles2::DeleteShader& c) { | 4470 uint32 immediate_data_size, const cmds::DeleteShader& c) { |
| 4468 GLuint client_id = c.shader; | 4471 GLuint client_id = c.shader; |
| 4469 if (client_id) { | 4472 if (client_id) { |
| 4470 ShaderManager::ShaderInfo* info = GetShaderInfo(client_id); | 4473 Shader* info = GetShader(client_id); |
| 4471 if (info) { | 4474 if (info) { |
| 4472 if (!info->IsDeleted()) { | 4475 if (!info->IsDeleted()) { |
| 4473 glDeleteShader(info->service_id()); | 4476 glDeleteShader(info->service_id()); |
| 4474 shader_manager()->MarkAsDeleted(info); | 4477 shader_manager()->MarkAsDeleted(info); |
| 4475 } | 4478 } |
| 4476 } else { | 4479 } else { |
| 4477 SetGLError(GL_INVALID_VALUE, "glDeleteShader", "unknown shader"); | 4480 SetGLError(GL_INVALID_VALUE, "glDeleteShader", "unknown shader"); |
| 4478 } | 4481 } |
| 4479 } | 4482 } |
| 4480 return error::kNoError; | 4483 return error::kNoError; |
| 4481 } | 4484 } |
| 4482 | 4485 |
| 4483 error::Error GLES2DecoderImpl::HandleDeleteProgram( | 4486 error::Error GLES2DecoderImpl::HandleDeleteProgram( |
| 4484 uint32 immediate_data_size, const gles2::DeleteProgram& c) { | 4487 uint32 immediate_data_size, const cmds::DeleteProgram& c) { |
| 4485 GLuint client_id = c.program; | 4488 GLuint client_id = c.program; |
| 4486 if (client_id) { | 4489 if (client_id) { |
| 4487 ProgramManager::ProgramInfo* info = GetProgramInfo(client_id); | 4490 Program* info = GetProgram(client_id); |
| 4488 if (info) { | 4491 if (info) { |
| 4489 if (!info->IsDeleted()) { | 4492 if (!info->IsDeleted()) { |
| 4490 program_manager()->MarkAsDeleted(shader_manager(), info); | 4493 program_manager()->MarkAsDeleted(shader_manager(), info); |
| 4491 } | 4494 } |
| 4492 } else { | 4495 } else { |
| 4493 SetGLError(GL_INVALID_VALUE, "glDeleteProgram", "unknown program"); | 4496 SetGLError(GL_INVALID_VALUE, "glDeleteProgram", "unknown program"); |
| 4494 } | 4497 } |
| 4495 } | 4498 } |
| 4496 return error::kNoError; | 4499 return error::kNoError; |
| 4497 } | 4500 } |
| 4498 | 4501 |
| 4499 void GLES2DecoderImpl::DoDeleteSharedIdsCHROMIUM( | 4502 void GLES2DecoderImpl::DoDeleteSharedIdsCHROMIUM( |
| 4500 GLuint namespace_id, GLsizei n, const GLuint* ids) { | 4503 GLuint namespace_id, GLsizei n, const GLuint* ids) { |
| 4501 IdAllocatorInterface* id_allocator = group_->GetIdAllocator(namespace_id); | 4504 IdAllocatorInterface* id_allocator = group_->GetIdAllocator(namespace_id); |
| 4502 for (GLsizei ii = 0; ii < n; ++ii) { | 4505 for (GLsizei ii = 0; ii < n; ++ii) { |
| 4503 id_allocator->FreeID(ids[ii]); | 4506 id_allocator->FreeID(ids[ii]); |
| 4504 } | 4507 } |
| 4505 } | 4508 } |
| 4506 | 4509 |
| 4507 error::Error GLES2DecoderImpl::HandleDeleteSharedIdsCHROMIUM( | 4510 error::Error GLES2DecoderImpl::HandleDeleteSharedIdsCHROMIUM( |
| 4508 uint32 immediate_data_size, const gles2::DeleteSharedIdsCHROMIUM& c) { | 4511 uint32 immediate_data_size, const cmds::DeleteSharedIdsCHROMIUM& c) { |
| 4509 GLuint namespace_id = static_cast<GLuint>(c.namespace_id); | 4512 GLuint namespace_id = static_cast<GLuint>(c.namespace_id); |
| 4510 GLsizei n = static_cast<GLsizei>(c.n); | 4513 GLsizei n = static_cast<GLsizei>(c.n); |
| 4511 uint32 data_size; | 4514 uint32 data_size; |
| 4512 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { | 4515 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { |
| 4513 return error::kOutOfBounds; | 4516 return error::kOutOfBounds; |
| 4514 } | 4517 } |
| 4515 const GLuint* ids = GetSharedMemoryAs<const GLuint*>( | 4518 const GLuint* ids = GetSharedMemoryAs<const GLuint*>( |
| 4516 c.ids_shm_id, c.ids_shm_offset, data_size); | 4519 c.ids_shm_id, c.ids_shm_offset, data_size); |
| 4517 if (n < 0) { | 4520 if (n < 0) { |
| 4518 SetGLError(GL_INVALID_VALUE, "DeleteSharedIdsCHROMIUM", "n < 0"); | 4521 SetGLError(GL_INVALID_VALUE, "DeleteSharedIdsCHROMIUM", "n < 0"); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 4534 } | 4537 } |
| 4535 } else { | 4538 } else { |
| 4536 for (GLsizei ii = 0; ii < n; ++ii) { | 4539 for (GLsizei ii = 0; ii < n; ++ii) { |
| 4537 ids[ii] = id_allocator->AllocateIDAtOrAbove(id_offset); | 4540 ids[ii] = id_allocator->AllocateIDAtOrAbove(id_offset); |
| 4538 id_offset = ids[ii] + 1; | 4541 id_offset = ids[ii] + 1; |
| 4539 } | 4542 } |
| 4540 } | 4543 } |
| 4541 } | 4544 } |
| 4542 | 4545 |
| 4543 error::Error GLES2DecoderImpl::HandleGenSharedIdsCHROMIUM( | 4546 error::Error GLES2DecoderImpl::HandleGenSharedIdsCHROMIUM( |
| 4544 uint32 immediate_data_size, const gles2::GenSharedIdsCHROMIUM& c) { | 4547 uint32 immediate_data_size, const cmds::GenSharedIdsCHROMIUM& c) { |
| 4545 GLuint namespace_id = static_cast<GLuint>(c.namespace_id); | 4548 GLuint namespace_id = static_cast<GLuint>(c.namespace_id); |
| 4546 GLuint id_offset = static_cast<GLuint>(c.id_offset); | 4549 GLuint id_offset = static_cast<GLuint>(c.id_offset); |
| 4547 GLsizei n = static_cast<GLsizei>(c.n); | 4550 GLsizei n = static_cast<GLsizei>(c.n); |
| 4548 uint32 data_size; | 4551 uint32 data_size; |
| 4549 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { | 4552 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { |
| 4550 return error::kOutOfBounds; | 4553 return error::kOutOfBounds; |
| 4551 } | 4554 } |
| 4552 GLuint* ids = GetSharedMemoryAs<GLuint*>( | 4555 GLuint* ids = GetSharedMemoryAs<GLuint*>( |
| 4553 c.ids_shm_id, c.ids_shm_offset, data_size); | 4556 c.ids_shm_id, c.ids_shm_offset, data_size); |
| 4554 if (n < 0) { | 4557 if (n < 0) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4572 } | 4575 } |
| 4573 SetGLError( | 4576 SetGLError( |
| 4574 GL_INVALID_VALUE, "RegisterSharedIdsCHROMIUM", | 4577 GL_INVALID_VALUE, "RegisterSharedIdsCHROMIUM", |
| 4575 "attempt to register id that already exists"); | 4578 "attempt to register id that already exists"); |
| 4576 return; | 4579 return; |
| 4577 } | 4580 } |
| 4578 } | 4581 } |
| 4579 } | 4582 } |
| 4580 | 4583 |
| 4581 error::Error GLES2DecoderImpl::HandleRegisterSharedIdsCHROMIUM( | 4584 error::Error GLES2DecoderImpl::HandleRegisterSharedIdsCHROMIUM( |
| 4582 uint32 immediate_data_size, const gles2::RegisterSharedIdsCHROMIUM& c) { | 4585 uint32 immediate_data_size, const cmds::RegisterSharedIdsCHROMIUM& c) { |
| 4583 GLuint namespace_id = static_cast<GLuint>(c.namespace_id); | 4586 GLuint namespace_id = static_cast<GLuint>(c.namespace_id); |
| 4584 GLsizei n = static_cast<GLsizei>(c.n); | 4587 GLsizei n = static_cast<GLsizei>(c.n); |
| 4585 uint32 data_size; | 4588 uint32 data_size; |
| 4586 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { | 4589 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { |
| 4587 return error::kOutOfBounds; | 4590 return error::kOutOfBounds; |
| 4588 } | 4591 } |
| 4589 GLuint* ids = GetSharedMemoryAs<GLuint*>( | 4592 GLuint* ids = GetSharedMemoryAs<GLuint*>( |
| 4590 c.ids_shm_id, c.ids_shm_offset, data_size); | 4593 c.ids_shm_id, c.ids_shm_offset, data_size); |
| 4591 if (n < 0) { | 4594 if (n < 0) { |
| 4592 SetGLError(GL_INVALID_VALUE, "RegisterSharedIdsCHROMIUM", "n < 0"); | 4595 SetGLError(GL_INVALID_VALUE, "RegisterSharedIdsCHROMIUM", "n < 0"); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 4608 "green", state_.color_clear_green); | 4611 "green", state_.color_clear_green); |
| 4609 ApplyDirtyState(); | 4612 ApplyDirtyState(); |
| 4610 glClear(mask); | 4613 glClear(mask); |
| 4611 } | 4614 } |
| 4612 return error::kNoError; | 4615 return error::kNoError; |
| 4613 } | 4616 } |
| 4614 | 4617 |
| 4615 void GLES2DecoderImpl::DoFramebufferRenderbuffer( | 4618 void GLES2DecoderImpl::DoFramebufferRenderbuffer( |
| 4616 GLenum target, GLenum attachment, GLenum renderbuffertarget, | 4619 GLenum target, GLenum attachment, GLenum renderbuffertarget, |
| 4617 GLuint client_renderbuffer_id) { | 4620 GLuint client_renderbuffer_id) { |
| 4618 FramebufferManager::FramebufferInfo* framebuffer_info = | 4621 Framebuffer* framebuffer_info = |
| 4619 GetFramebufferInfoForTarget(target); | 4622 GetFramebufferInfoForTarget(target); |
| 4620 if (!framebuffer_info) { | 4623 if (!framebuffer_info) { |
| 4621 SetGLError(GL_INVALID_OPERATION, | 4624 SetGLError(GL_INVALID_OPERATION, |
| 4622 "glFramebufferRenderbuffer", "no framebuffer bound"); | 4625 "glFramebufferRenderbuffer", "no framebuffer bound"); |
| 4623 return; | 4626 return; |
| 4624 } | 4627 } |
| 4625 GLuint service_id = 0; | 4628 GLuint service_id = 0; |
| 4626 RenderbufferManager::RenderbufferInfo* info = NULL; | 4629 Renderbuffer* info = NULL; |
| 4627 if (client_renderbuffer_id) { | 4630 if (client_renderbuffer_id) { |
| 4628 info = GetRenderbufferInfo(client_renderbuffer_id); | 4631 info = GetRenderbuffer(client_renderbuffer_id); |
| 4629 if (!info) { | 4632 if (!info) { |
| 4630 SetGLError(GL_INVALID_OPERATION, | 4633 SetGLError(GL_INVALID_OPERATION, |
| 4631 "glFramebufferRenderbuffer", "unknown renderbuffer"); | 4634 "glFramebufferRenderbuffer", "unknown renderbuffer"); |
| 4632 return; | 4635 return; |
| 4633 } | 4636 } |
| 4634 service_id = info->service_id(); | 4637 service_id = info->service_id(); |
| 4635 } | 4638 } |
| 4636 CopyRealGLErrorsToWrapper(); | 4639 CopyRealGLErrorsToWrapper(); |
| 4637 glFramebufferRenderbufferEXT( | 4640 glFramebufferRenderbufferEXT( |
| 4638 target, attachment, renderbuffertarget, service_id); | 4641 target, attachment, renderbuffertarget, service_id); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4678 } | 4681 } |
| 4679 | 4682 |
| 4680 void GLES2DecoderImpl::DoSampleCoverage(GLclampf value, GLboolean invert) { | 4683 void GLES2DecoderImpl::DoSampleCoverage(GLclampf value, GLboolean invert) { |
| 4681 state_.sample_coverage_value = std::min(1.0f, std::max(0.0f, value)); | 4684 state_.sample_coverage_value = std::min(1.0f, std::max(0.0f, value)); |
| 4682 state_.sample_coverage_invert = (invert != 0); | 4685 state_.sample_coverage_invert = (invert != 0); |
| 4683 glSampleCoverage(state_.sample_coverage_value, invert); | 4686 glSampleCoverage(state_.sample_coverage_value, invert); |
| 4684 } | 4687 } |
| 4685 | 4688 |
| 4686 // Assumes framebuffer is complete. | 4689 // Assumes framebuffer is complete. |
| 4687 void GLES2DecoderImpl::ClearUnclearedAttachments( | 4690 void GLES2DecoderImpl::ClearUnclearedAttachments( |
| 4688 GLenum target, FramebufferManager::FramebufferInfo* info) { | 4691 GLenum target, Framebuffer* info) { |
| 4689 if (target == GL_READ_FRAMEBUFFER_EXT) { | 4692 if (target == GL_READ_FRAMEBUFFER_EXT) { |
| 4690 // bind this to the DRAW point, clear then bind back to READ | 4693 // bind this to the DRAW point, clear then bind back to READ |
| 4691 // TODO(gman): I don't think there is any guarantee that an FBO that | 4694 // TODO(gman): I don't think there is any guarantee that an FBO that |
| 4692 // is complete on the READ attachment will be complete as a DRAW | 4695 // is complete on the READ attachment will be complete as a DRAW |
| 4693 // attachment. | 4696 // attachment. |
| 4694 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0); | 4697 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0); |
| 4695 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, info->service_id()); | 4698 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, info->service_id()); |
| 4696 } | 4699 } |
| 4697 GLbitfield clear_bits = 0; | 4700 GLbitfield clear_bits = 0; |
| 4698 if (info->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)) { | 4701 if (info->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 4721 glDisable(GL_SCISSOR_TEST); | 4724 glDisable(GL_SCISSOR_TEST); |
| 4722 glClear(clear_bits); | 4725 glClear(clear_bits); |
| 4723 | 4726 |
| 4724 framebuffer_manager()->MarkAttachmentsAsCleared( | 4727 framebuffer_manager()->MarkAttachmentsAsCleared( |
| 4725 info, renderbuffer_manager(), texture_manager()); | 4728 info, renderbuffer_manager(), texture_manager()); |
| 4726 | 4729 |
| 4727 RestoreClearState(); | 4730 RestoreClearState(); |
| 4728 | 4731 |
| 4729 if (target == GL_READ_FRAMEBUFFER_EXT) { | 4732 if (target == GL_READ_FRAMEBUFFER_EXT) { |
| 4730 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, info->service_id()); | 4733 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, info->service_id()); |
| 4731 FramebufferManager::FramebufferInfo* framebuffer = | 4734 Framebuffer* framebuffer = |
| 4732 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); | 4735 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); |
| 4733 GLuint service_id = | 4736 GLuint service_id = |
| 4734 framebuffer ? framebuffer->service_id() : GetBackbufferServiceId(); | 4737 framebuffer ? framebuffer->service_id() : GetBackbufferServiceId(); |
| 4735 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, service_id); | 4738 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, service_id); |
| 4736 } | 4739 } |
| 4737 } | 4740 } |
| 4738 | 4741 |
| 4739 void GLES2DecoderImpl::RestoreClearState() { | 4742 void GLES2DecoderImpl::RestoreClearState() { |
| 4740 clear_state_dirty_ = true; | 4743 clear_state_dirty_ = true; |
| 4741 glClearColor( | 4744 glClearColor( |
| 4742 state_.color_clear_red, state_.color_clear_green, state_.color_clear_blue, | 4745 state_.color_clear_red, state_.color_clear_green, state_.color_clear_blue, |
| 4743 state_.color_clear_alpha); | 4746 state_.color_clear_alpha); |
| 4744 glClearStencil(state_.stencil_clear); | 4747 glClearStencil(state_.stencil_clear); |
| 4745 glClearDepth(state_.depth_clear); | 4748 glClearDepth(state_.depth_clear); |
| 4746 if (state_.enable_flags.scissor_test) { | 4749 if (state_.enable_flags.scissor_test) { |
| 4747 glEnable(GL_SCISSOR_TEST); | 4750 glEnable(GL_SCISSOR_TEST); |
| 4748 } | 4751 } |
| 4749 } | 4752 } |
| 4750 | 4753 |
| 4751 GLenum GLES2DecoderImpl::DoCheckFramebufferStatus(GLenum target) { | 4754 GLenum GLES2DecoderImpl::DoCheckFramebufferStatus(GLenum target) { |
| 4752 FramebufferManager::FramebufferInfo* framebuffer = | 4755 Framebuffer* framebuffer = |
| 4753 GetFramebufferInfoForTarget(target); | 4756 GetFramebufferInfoForTarget(target); |
| 4754 if (!framebuffer) { | 4757 if (!framebuffer) { |
| 4755 return GL_FRAMEBUFFER_COMPLETE; | 4758 return GL_FRAMEBUFFER_COMPLETE; |
| 4756 } | 4759 } |
| 4757 GLenum completeness = framebuffer->IsPossiblyComplete(); | 4760 GLenum completeness = framebuffer->IsPossiblyComplete(); |
| 4758 if (completeness != GL_FRAMEBUFFER_COMPLETE) { | 4761 if (completeness != GL_FRAMEBUFFER_COMPLETE) { |
| 4759 return completeness; | 4762 return completeness; |
| 4760 } | 4763 } |
| 4761 return framebuffer->GetStatus(texture_manager(), target); | 4764 return framebuffer->GetStatus(texture_manager(), target); |
| 4762 } | 4765 } |
| 4763 | 4766 |
| 4764 void GLES2DecoderImpl::DoFramebufferTexture2D( | 4767 void GLES2DecoderImpl::DoFramebufferTexture2D( |
| 4765 GLenum target, GLenum attachment, GLenum textarget, | 4768 GLenum target, GLenum attachment, GLenum textarget, |
| 4766 GLuint client_texture_id, GLint level) { | 4769 GLuint client_texture_id, GLint level) { |
| 4767 FramebufferManager::FramebufferInfo* framebuffer_info = | 4770 Framebuffer* framebuffer_info = |
| 4768 GetFramebufferInfoForTarget(target); | 4771 GetFramebufferInfoForTarget(target); |
| 4769 if (!framebuffer_info) { | 4772 if (!framebuffer_info) { |
| 4770 SetGLError(GL_INVALID_OPERATION, | 4773 SetGLError(GL_INVALID_OPERATION, |
| 4771 "glFramebufferTexture2D", "no framebuffer bound."); | 4774 "glFramebufferTexture2D", "no framebuffer bound."); |
| 4772 return; | 4775 return; |
| 4773 } | 4776 } |
| 4774 GLuint service_id = 0; | 4777 GLuint service_id = 0; |
| 4775 TextureManager::TextureInfo* info = NULL; | 4778 Texture* info = NULL; |
| 4776 if (client_texture_id) { | 4779 if (client_texture_id) { |
| 4777 info = GetTextureInfo(client_texture_id); | 4780 info = GetTexture(client_texture_id); |
| 4778 if (!info) { | 4781 if (!info) { |
| 4779 SetGLError(GL_INVALID_OPERATION, | 4782 SetGLError(GL_INVALID_OPERATION, |
| 4780 "glFramebufferTexture2D", "unknown texture"); | 4783 "glFramebufferTexture2D", "unknown texture"); |
| 4781 return; | 4784 return; |
| 4782 } | 4785 } |
| 4783 service_id = info->service_id(); | 4786 service_id = info->service_id(); |
| 4784 } | 4787 } |
| 4785 | 4788 |
| 4786 if (!texture_manager()->ValidForTarget(textarget, level, 0, 0, 1)) { | 4789 if (!texture_manager()->ValidForTarget(textarget, level, 0, 0, 1)) { |
| 4787 SetGLError(GL_INVALID_VALUE, | 4790 SetGLError(GL_INVALID_VALUE, |
| 4788 "glFramebufferTexture2D", "level out of range"); | 4791 "glFramebufferTexture2D", "level out of range"); |
| 4789 return; | 4792 return; |
| 4790 } | 4793 } |
| 4791 | 4794 |
| 4792 CopyRealGLErrorsToWrapper(); | 4795 CopyRealGLErrorsToWrapper(); |
| 4793 glFramebufferTexture2DEXT(target, attachment, textarget, service_id, level); | 4796 glFramebufferTexture2DEXT(target, attachment, textarget, service_id, level); |
| 4794 GLenum error = PeekGLError(); | 4797 GLenum error = PeekGLError(); |
| 4795 if (error == GL_NO_ERROR) { | 4798 if (error == GL_NO_ERROR) { |
| 4796 framebuffer_info->AttachTexture(attachment, info, textarget, level); | 4799 framebuffer_info->AttachTexture(attachment, info, textarget, level); |
| 4797 } | 4800 } |
| 4798 if (framebuffer_info == state_.bound_draw_framebuffer) { | 4801 if (framebuffer_info == state_.bound_draw_framebuffer) { |
| 4799 clear_state_dirty_ = true; | 4802 clear_state_dirty_ = true; |
| 4800 } | 4803 } |
| 4801 } | 4804 } |
| 4802 | 4805 |
| 4803 void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( | 4806 void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( |
| 4804 GLenum target, GLenum attachment, GLenum pname, GLint* params) { | 4807 GLenum target, GLenum attachment, GLenum pname, GLint* params) { |
| 4805 FramebufferManager::FramebufferInfo* framebuffer_info = | 4808 Framebuffer* framebuffer_info = |
| 4806 GetFramebufferInfoForTarget(target); | 4809 GetFramebufferInfoForTarget(target); |
| 4807 if (!framebuffer_info) { | 4810 if (!framebuffer_info) { |
| 4808 SetGLError(GL_INVALID_OPERATION, | 4811 SetGLError(GL_INVALID_OPERATION, |
| 4809 "glFramebufferAttachmentParameteriv", "no framebuffer bound"); | 4812 "glFramebufferAttachmentParameteriv", "no framebuffer bound"); |
| 4810 return; | 4813 return; |
| 4811 } | 4814 } |
| 4812 glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params); | 4815 glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params); |
| 4813 if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) { | 4816 if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) { |
| 4814 GLint type = 0; | 4817 GLint type = 0; |
| 4815 GLuint client_id = 0; | 4818 GLuint client_id = 0; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4826 } | 4829 } |
| 4827 default: | 4830 default: |
| 4828 break; | 4831 break; |
| 4829 } | 4832 } |
| 4830 *params = client_id; | 4833 *params = client_id; |
| 4831 } | 4834 } |
| 4832 } | 4835 } |
| 4833 | 4836 |
| 4834 void GLES2DecoderImpl::DoGetRenderbufferParameteriv( | 4837 void GLES2DecoderImpl::DoGetRenderbufferParameteriv( |
| 4835 GLenum target, GLenum pname, GLint* params) { | 4838 GLenum target, GLenum pname, GLint* params) { |
| 4836 RenderbufferManager::RenderbufferInfo* renderbuffer = | 4839 Renderbuffer* renderbuffer = |
| 4837 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); | 4840 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| 4838 if (!renderbuffer) { | 4841 if (!renderbuffer) { |
| 4839 SetGLError(GL_INVALID_OPERATION, | 4842 SetGLError(GL_INVALID_OPERATION, |
| 4840 "glGetRenderbufferParameteriv", "no renderbuffer bound"); | 4843 "glGetRenderbufferParameteriv", "no renderbuffer bound"); |
| 4841 return; | 4844 return; |
| 4842 } | 4845 } |
| 4843 switch (pname) { | 4846 switch (pname) { |
| 4844 case GL_RENDERBUFFER_INTERNAL_FORMAT: | 4847 case GL_RENDERBUFFER_INTERNAL_FORMAT: |
| 4845 *params = renderbuffer->internal_format(); | 4848 *params = renderbuffer->internal_format(); |
| 4846 break; | 4849 break; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4879 | 4882 |
| 4880 void GLES2DecoderImpl::DoRenderbufferStorageMultisample( | 4883 void GLES2DecoderImpl::DoRenderbufferStorageMultisample( |
| 4881 GLenum target, GLsizei samples, GLenum internalformat, | 4884 GLenum target, GLsizei samples, GLenum internalformat, |
| 4882 GLsizei width, GLsizei height) { | 4885 GLsizei width, GLsizei height) { |
| 4883 if (!features().chromium_framebuffer_multisample) { | 4886 if (!features().chromium_framebuffer_multisample) { |
| 4884 SetGLError(GL_INVALID_OPERATION, | 4887 SetGLError(GL_INVALID_OPERATION, |
| 4885 "glRenderbufferStorageMultisampleEXT", "function not available"); | 4888 "glRenderbufferStorageMultisampleEXT", "function not available"); |
| 4886 return; | 4889 return; |
| 4887 } | 4890 } |
| 4888 | 4891 |
| 4889 RenderbufferManager::RenderbufferInfo* renderbuffer = | 4892 Renderbuffer* renderbuffer = |
| 4890 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); | 4893 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| 4891 if (!renderbuffer) { | 4894 if (!renderbuffer) { |
| 4892 SetGLError(GL_INVALID_OPERATION, | 4895 SetGLError(GL_INVALID_OPERATION, |
| 4893 "glRenderbufferStorageMultisampleEXT", "no renderbuffer bound"); | 4896 "glRenderbufferStorageMultisampleEXT", "no renderbuffer bound"); |
| 4894 return; | 4897 return; |
| 4895 } | 4898 } |
| 4896 | 4899 |
| 4897 if (samples > renderbuffer_manager()->max_samples()) { | 4900 if (samples > renderbuffer_manager()->max_samples()) { |
| 4898 SetGLError(GL_INVALID_VALUE, | 4901 SetGLError(GL_INVALID_VALUE, |
| 4899 "glRenderbufferStorageMultisampleEXT", "samples too large"); | 4902 "glRenderbufferStorageMultisampleEXT", "samples too large"); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4936 // TODO(gman): If renderbuffers tracked which framebuffers they were | 4939 // TODO(gman): If renderbuffers tracked which framebuffers they were |
| 4937 // attached to we could just mark those framebuffers as not complete. | 4940 // attached to we could just mark those framebuffers as not complete. |
| 4938 framebuffer_manager()->IncFramebufferStateChangeCount(); | 4941 framebuffer_manager()->IncFramebufferStateChangeCount(); |
| 4939 renderbuffer_manager()->SetInfo( | 4942 renderbuffer_manager()->SetInfo( |
| 4940 renderbuffer, samples, internalformat, width, height); | 4943 renderbuffer, samples, internalformat, width, height); |
| 4941 } | 4944 } |
| 4942 } | 4945 } |
| 4943 | 4946 |
| 4944 void GLES2DecoderImpl::DoRenderbufferStorage( | 4947 void GLES2DecoderImpl::DoRenderbufferStorage( |
| 4945 GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { | 4948 GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { |
| 4946 RenderbufferManager::RenderbufferInfo* renderbuffer = | 4949 Renderbuffer* renderbuffer = |
| 4947 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); | 4950 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| 4948 if (!renderbuffer) { | 4951 if (!renderbuffer) { |
| 4949 SetGLError(GL_INVALID_OPERATION, | 4952 SetGLError(GL_INVALID_OPERATION, |
| 4950 "glRenderbufferStorage", "no renderbuffer bound"); | 4953 "glRenderbufferStorage", "no renderbuffer bound"); |
| 4951 return; | 4954 return; |
| 4952 } | 4955 } |
| 4953 | 4956 |
| 4954 if (width > renderbuffer_manager()->max_renderbuffer_size() || | 4957 if (width > renderbuffer_manager()->max_renderbuffer_size() || |
| 4955 height > renderbuffer_manager()->max_renderbuffer_size()) { | 4958 height > renderbuffer_manager()->max_renderbuffer_size()) { |
| 4956 SetGLError(GL_INVALID_VALUE, | 4959 SetGLError(GL_INVALID_VALUE, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 4981 // TODO(gman): If tetxures tracked which framebuffers they were attached to | 4984 // TODO(gman): If tetxures tracked which framebuffers they were attached to |
| 4982 // we could just mark those framebuffers as not complete. | 4985 // we could just mark those framebuffers as not complete. |
| 4983 framebuffer_manager()->IncFramebufferStateChangeCount(); | 4986 framebuffer_manager()->IncFramebufferStateChangeCount(); |
| 4984 renderbuffer_manager()->SetInfo( | 4987 renderbuffer_manager()->SetInfo( |
| 4985 renderbuffer, 1, internalformat, width, height); | 4988 renderbuffer, 1, internalformat, width, height); |
| 4986 } | 4989 } |
| 4987 } | 4990 } |
| 4988 | 4991 |
| 4989 void GLES2DecoderImpl::DoLinkProgram(GLuint program) { | 4992 void GLES2DecoderImpl::DoLinkProgram(GLuint program) { |
| 4990 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoLinkProgram"); | 4993 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoLinkProgram"); |
| 4991 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 4994 Program* info = GetProgramInfoNotShader( |
| 4992 program, "glLinkProgram"); | 4995 program, "glLinkProgram"); |
| 4993 if (!info) { | 4996 if (!info) { |
| 4994 return; | 4997 return; |
| 4995 } | 4998 } |
| 4996 | 4999 |
| 4997 LogClientServiceForInfo(info, program, "glLinkProgram"); | 5000 LogClientServiceForInfo(info, program, "glLinkProgram"); |
| 4998 ShaderTranslator* vertex_translator = NULL; | 5001 ShaderTranslator* vertex_translator = NULL; |
| 4999 ShaderTranslator* fragment_translator = NULL; | 5002 ShaderTranslator* fragment_translator = NULL; |
| 5000 if (use_shader_translator_) { | 5003 if (use_shader_translator_) { |
| 5001 vertex_translator = vertex_translator_; | 5004 vertex_translator = vertex_translator_; |
| 5002 fragment_translator = fragment_translator_; | 5005 fragment_translator = fragment_translator_; |
| 5003 } | 5006 } |
| 5004 if (info->Link(shader_manager(), | 5007 if (info->Link(shader_manager(), |
| 5005 vertex_translator, | 5008 vertex_translator, |
| 5006 fragment_translator, | 5009 fragment_translator, |
| 5007 feature_info_)) { | 5010 feature_info_)) { |
| 5008 if (info == state_.current_program.get()) { | 5011 if (info == state_.current_program.get()) { |
| 5009 if (workarounds().use_current_program_after_successful_link) { | 5012 if (workarounds().use_current_program_after_successful_link) { |
| 5010 glUseProgram(info->service_id()); | 5013 glUseProgram(info->service_id()); |
| 5011 } | 5014 } |
| 5012 program_manager()->ClearUniforms(info); | 5015 program_manager()->ClearUniforms(info); |
| 5013 } | 5016 } |
| 5014 } | 5017 } |
| 5015 }; | 5018 }; |
| 5016 | 5019 |
| 5017 void GLES2DecoderImpl::DoTexParameterf( | 5020 void GLES2DecoderImpl::DoTexParameterf( |
| 5018 GLenum target, GLenum pname, GLfloat param) { | 5021 GLenum target, GLenum pname, GLfloat param) { |
| 5019 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 5022 Texture* info = GetTextureInfoForTarget(target); |
| 5020 if (!info) { | 5023 if (!info) { |
| 5021 SetGLError(GL_INVALID_VALUE, "glTexParameterf", "unknown texture"); | 5024 SetGLError(GL_INVALID_VALUE, "glTexParameterf", "unknown texture"); |
| 5022 return; | 5025 return; |
| 5023 } | 5026 } |
| 5024 | 5027 |
| 5025 GLenum error = texture_manager()->SetParameter( | 5028 GLenum error = texture_manager()->SetParameter( |
| 5026 info, pname, static_cast<GLint>(param)); | 5029 info, pname, static_cast<GLint>(param)); |
| 5027 if (error != GL_NO_ERROR) { | 5030 if (error != GL_NO_ERROR) { |
| 5028 SetGLErrorInvalidParam( | 5031 SetGLErrorInvalidParam( |
| 5029 error, "glTexParameterf", pname, static_cast<GLint>(param)); | 5032 error, "glTexParameterf", pname, static_cast<GLint>(param)); |
| 5030 return; | 5033 return; |
| 5031 } | 5034 } |
| 5032 glTexParameterf(target, pname, param); | 5035 glTexParameterf(target, pname, param); |
| 5033 } | 5036 } |
| 5034 | 5037 |
| 5035 void GLES2DecoderImpl::DoTexParameteri( | 5038 void GLES2DecoderImpl::DoTexParameteri( |
| 5036 GLenum target, GLenum pname, GLint param) { | 5039 GLenum target, GLenum pname, GLint param) { |
| 5037 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 5040 Texture* info = GetTextureInfoForTarget(target); |
| 5038 if (!info) { | 5041 if (!info) { |
| 5039 SetGLError(GL_INVALID_VALUE, "glTexParameteri", "unknown texture"); | 5042 SetGLError(GL_INVALID_VALUE, "glTexParameteri", "unknown texture"); |
| 5040 return; | 5043 return; |
| 5041 } | 5044 } |
| 5042 | 5045 |
| 5043 GLenum error = texture_manager()->SetParameter(info, pname, param); | 5046 GLenum error = texture_manager()->SetParameter(info, pname, param); |
| 5044 if (error != GL_NO_ERROR) { | 5047 if (error != GL_NO_ERROR) { |
| 5045 SetGLErrorInvalidParam(error, "glTexParameteri", pname, param); | 5048 SetGLErrorInvalidParam(error, "glTexParameteri", pname, param); |
| 5046 return; | 5049 return; |
| 5047 } | 5050 } |
| 5048 // Texture tracking pools exist only for the command decoder, so | 5051 // Texture tracking pools exist only for the command decoder, so |
| 5049 // do not pass them on to the native GL implementation. | 5052 // do not pass them on to the native GL implementation. |
| 5050 if (pname == GL_TEXTURE_POOL_CHROMIUM) { | 5053 if (pname == GL_TEXTURE_POOL_CHROMIUM) { |
| 5051 return; | 5054 return; |
| 5052 } | 5055 } |
| 5053 glTexParameteri(target, pname, param); | 5056 glTexParameteri(target, pname, param); |
| 5054 } | 5057 } |
| 5055 | 5058 |
| 5056 void GLES2DecoderImpl::DoTexParameterfv( | 5059 void GLES2DecoderImpl::DoTexParameterfv( |
| 5057 GLenum target, GLenum pname, const GLfloat* params) { | 5060 GLenum target, GLenum pname, const GLfloat* params) { |
| 5058 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 5061 Texture* info = GetTextureInfoForTarget(target); |
| 5059 if (!info) { | 5062 if (!info) { |
| 5060 SetGLError(GL_INVALID_VALUE, "glTexParameterfv", "unknown texture"); | 5063 SetGLError(GL_INVALID_VALUE, "glTexParameterfv", "unknown texture"); |
| 5061 return; | 5064 return; |
| 5062 } | 5065 } |
| 5063 | 5066 |
| 5064 GLenum error =texture_manager()->SetParameter( | 5067 GLenum error =texture_manager()->SetParameter( |
| 5065 info, pname, static_cast<GLint>(params[0])); | 5068 info, pname, static_cast<GLint>(params[0])); |
| 5066 if (error != GL_NO_ERROR) { | 5069 if (error != GL_NO_ERROR) { |
| 5067 SetGLErrorInvalidParam( | 5070 SetGLErrorInvalidParam( |
| 5068 error, "glTexParameterfv", pname, static_cast<GLint>(params[0])); | 5071 error, "glTexParameterfv", pname, static_cast<GLint>(params[0])); |
| 5069 return; | 5072 return; |
| 5070 } | 5073 } |
| 5071 glTexParameterfv(target, pname, params); | 5074 glTexParameterfv(target, pname, params); |
| 5072 } | 5075 } |
| 5073 | 5076 |
| 5074 void GLES2DecoderImpl::DoTexParameteriv( | 5077 void GLES2DecoderImpl::DoTexParameteriv( |
| 5075 GLenum target, GLenum pname, const GLint* params) { | 5078 GLenum target, GLenum pname, const GLint* params) { |
| 5076 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 5079 Texture* info = GetTextureInfoForTarget(target); |
| 5077 if (!info) { | 5080 if (!info) { |
| 5078 SetGLError(GL_INVALID_VALUE, "glTexParameteriv", "unknown texture"); | 5081 SetGLError(GL_INVALID_VALUE, "glTexParameteriv", "unknown texture"); |
| 5079 return; | 5082 return; |
| 5080 } | 5083 } |
| 5081 | 5084 |
| 5082 GLenum error = texture_manager()->SetParameter(info, pname, *params); | 5085 GLenum error = texture_manager()->SetParameter(info, pname, *params); |
| 5083 if (error != GL_NO_ERROR) { | 5086 if (error != GL_NO_ERROR) { |
| 5084 SetGLErrorInvalidParam(error, "glTexParameteriv", pname, *params); | 5087 SetGLErrorInvalidParam(error, "glTexParameteriv", pname, *params); |
| 5085 return; | 5088 return; |
| 5086 } | 5089 } |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5228 const GLES2DecoderImpl::BaseUniformInfo& base_info, | 5231 const GLES2DecoderImpl::BaseUniformInfo& base_info, |
| 5229 GLint* real_location, GLenum* type, GLsizei* count) { | 5232 GLint* real_location, GLenum* type, GLsizei* count) { |
| 5230 DCHECK(type); | 5233 DCHECK(type); |
| 5231 DCHECK(count); | 5234 DCHECK(count); |
| 5232 DCHECK(real_location); | 5235 DCHECK(real_location); |
| 5233 | 5236 |
| 5234 if (!CheckCurrentProgramForUniform(fake_location, function_name)) { | 5237 if (!CheckCurrentProgramForUniform(fake_location, function_name)) { |
| 5235 return false; | 5238 return false; |
| 5236 } | 5239 } |
| 5237 GLint array_index = -1; | 5240 GLint array_index = -1; |
| 5238 const ProgramManager::ProgramInfo::UniformInfo* info = | 5241 const Program::UniformInfo* info = |
| 5239 state_.current_program->GetUniformInfoByFakeLocation( | 5242 state_.current_program->GetUniformInfoByFakeLocation( |
| 5240 fake_location, real_location, &array_index); | 5243 fake_location, real_location, &array_index); |
| 5241 if (!info) { | 5244 if (!info) { |
| 5242 SetGLError(GL_INVALID_OPERATION, function_name, "unknown location"); | 5245 SetGLError(GL_INVALID_OPERATION, function_name, "unknown location"); |
| 5243 return false; | 5246 return false; |
| 5244 } | 5247 } |
| 5245 bool okay = false; | 5248 bool okay = false; |
| 5246 for (size_t ii = 0; ii < base_info.num_valid_types; ++ii) { | 5249 for (size_t ii = 0; ii < base_info.num_valid_types; ++ii) { |
| 5247 if (base_info.valid_types[ii] == info->type) { | 5250 if (base_info.valid_types[ii] == info->type) { |
| 5248 okay = true; | 5251 okay = true; |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5457 if (!PrepForSetUniformByLocation( | 5460 if (!PrepForSetUniformByLocation( |
| 5458 fake_location, "glUniformMatrix4fv", valid_float_mat4_base_info, | 5461 fake_location, "glUniformMatrix4fv", valid_float_mat4_base_info, |
| 5459 &real_location, &type, &count)) { | 5462 &real_location, &type, &count)) { |
| 5460 return; | 5463 return; |
| 5461 } | 5464 } |
| 5462 glUniformMatrix4fv(real_location, count, transpose, value); | 5465 glUniformMatrix4fv(real_location, count, transpose, value); |
| 5463 } | 5466 } |
| 5464 | 5467 |
| 5465 void GLES2DecoderImpl::DoUseProgram(GLuint program) { | 5468 void GLES2DecoderImpl::DoUseProgram(GLuint program) { |
| 5466 GLuint service_id = 0; | 5469 GLuint service_id = 0; |
| 5467 ProgramManager::ProgramInfo* info = NULL; | 5470 Program* info = NULL; |
| 5468 if (program) { | 5471 if (program) { |
| 5469 info = GetProgramInfoNotShader(program, "glUseProgram"); | 5472 info = GetProgramInfoNotShader(program, "glUseProgram"); |
| 5470 if (!info) { | 5473 if (!info) { |
| 5471 return; | 5474 return; |
| 5472 } | 5475 } |
| 5473 if (!info->IsValid()) { | 5476 if (!info->IsValid()) { |
| 5474 // Program was not linked successfully. (ie, glLinkProgram) | 5477 // Program was not linked successfully. (ie, glLinkProgram) |
| 5475 SetGLError(GL_INVALID_OPERATION, "glUseProgram", "program not linked"); | 5478 SetGLError(GL_INVALID_OPERATION, "glUseProgram", "program not linked"); |
| 5476 return; | 5479 return; |
| 5477 } | 5480 } |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5583 | 5586 |
| 5584 void GLES2DecoderImpl::RenderWarning(const std::string& msg) { | 5587 void GLES2DecoderImpl::RenderWarning(const std::string& msg) { |
| 5585 LogMessage(std::string("RENDER WARNING: ") + msg); | 5588 LogMessage(std::string("RENDER WARNING: ") + msg); |
| 5586 } | 5589 } |
| 5587 | 5590 |
| 5588 void GLES2DecoderImpl::PerformanceWarning(const std::string& msg) { | 5591 void GLES2DecoderImpl::PerformanceWarning(const std::string& msg) { |
| 5589 LogMessage(std::string("PERFORMANCE WARNING: ") + msg); | 5592 LogMessage(std::string("PERFORMANCE WARNING: ") + msg); |
| 5590 } | 5593 } |
| 5591 | 5594 |
| 5592 void GLES2DecoderImpl::ForceCompileShaderIfPending( | 5595 void GLES2DecoderImpl::ForceCompileShaderIfPending( |
| 5593 ShaderManager::ShaderInfo* info) { | 5596 Shader* info) { |
| 5594 if (info->compilation_status() == | 5597 if (info->compilation_status() == |
| 5595 ShaderManager::ShaderInfo::PENDING_DEFERRED_COMPILE) { | 5598 Shader::PENDING_DEFERRED_COMPILE) { |
| 5596 ShaderTranslator* translator = NULL; | 5599 ShaderTranslator* translator = NULL; |
| 5597 if (use_shader_translator_) { | 5600 if (use_shader_translator_) { |
| 5598 translator = info->shader_type() == GL_VERTEX_SHADER ? | 5601 translator = info->shader_type() == GL_VERTEX_SHADER ? |
| 5599 vertex_translator_.get() : fragment_translator_.get(); | 5602 vertex_translator_.get() : fragment_translator_.get(); |
| 5600 } | 5603 } |
| 5601 // We know there will be no errors, because we only defer compilation on | 5604 // We know there will be no errors, because we only defer compilation on |
| 5602 // shaders that were previously compiled successfully. | 5605 // shaders that were previously compiled successfully. |
| 5603 program_manager()->ForceCompileShader(info->deferred_compilation_source(), | 5606 program_manager()->ForceCompileShader(info->deferred_compilation_source(), |
| 5604 info, | 5607 info, |
| 5605 translator, | 5608 translator, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 5624 } | 5627 } |
| 5625 } | 5628 } |
| 5626 | 5629 |
| 5627 bool GLES2DecoderImpl::SetBlackTextureForNonRenderableTextures() { | 5630 bool GLES2DecoderImpl::SetBlackTextureForNonRenderableTextures() { |
| 5628 DCHECK(state_.current_program); | 5631 DCHECK(state_.current_program); |
| 5629 // Only check if there are some unrenderable textures. | 5632 // Only check if there are some unrenderable textures. |
| 5630 if (!texture_manager()->HaveUnrenderableTextures()) { | 5633 if (!texture_manager()->HaveUnrenderableTextures()) { |
| 5631 return false; | 5634 return false; |
| 5632 } | 5635 } |
| 5633 bool textures_set = false; | 5636 bool textures_set = false; |
| 5634 const ProgramManager::ProgramInfo::SamplerIndices& sampler_indices = | 5637 const Program::SamplerIndices& sampler_indices = |
| 5635 state_.current_program->sampler_indices(); | 5638 state_.current_program->sampler_indices(); |
| 5636 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 5639 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
| 5637 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = | 5640 const Program::UniformInfo* uniform_info = |
| 5638 state_.current_program->GetUniformInfo(sampler_indices[ii]); | 5641 state_.current_program->GetUniformInfo(sampler_indices[ii]); |
| 5639 DCHECK(uniform_info); | 5642 DCHECK(uniform_info); |
| 5640 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 5643 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
| 5641 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 5644 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
| 5642 if (texture_unit_index < state_.texture_units.size()) { | 5645 if (texture_unit_index < state_.texture_units.size()) { |
| 5643 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; | 5646 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; |
| 5644 TextureManager::TextureInfo* texture_info = | 5647 Texture* texture_info = |
| 5645 texture_unit.GetInfoForSamplerType(uniform_info->type); | 5648 texture_unit.GetInfoForSamplerType(uniform_info->type); |
| 5646 if (!texture_info || !texture_manager()->CanRender(texture_info)) { | 5649 if (!texture_info || !texture_manager()->CanRender(texture_info)) { |
| 5647 textures_set = true; | 5650 textures_set = true; |
| 5648 glActiveTexture(GL_TEXTURE0 + texture_unit_index); | 5651 glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
| 5649 glBindTexture( | 5652 glBindTexture( |
| 5650 GetBindTargetForSamplerType(uniform_info->type), | 5653 GetBindTargetForSamplerType(uniform_info->type), |
| 5651 texture_manager()->black_texture_id(uniform_info->type)); | 5654 texture_manager()->black_texture_id(uniform_info->type)); |
| 5652 RenderWarning( | 5655 RenderWarning( |
| 5653 std::string("texture bound to texture unit ") + | 5656 std::string("texture bound to texture unit ") + |
| 5654 base::IntToString(texture_unit_index) + | 5657 base::IntToString(texture_unit_index) + |
| 5655 " is not renderable. It maybe non-power-of-2 and have " | 5658 " is not renderable. It maybe non-power-of-2 and have " |
| 5656 " incompatible texture filtering or is not " | 5659 " incompatible texture filtering or is not " |
| 5657 "'texture complete'"); | 5660 "'texture complete'"); |
| 5658 } | 5661 } |
| 5659 } | 5662 } |
| 5660 // else: should this be an error? | 5663 // else: should this be an error? |
| 5661 } | 5664 } |
| 5662 } | 5665 } |
| 5663 return textures_set; | 5666 return textures_set; |
| 5664 } | 5667 } |
| 5665 | 5668 |
| 5666 void GLES2DecoderImpl::RestoreStateForNonRenderableTextures() { | 5669 void GLES2DecoderImpl::RestoreStateForNonRenderableTextures() { |
| 5667 DCHECK(state_.current_program); | 5670 DCHECK(state_.current_program); |
| 5668 const ProgramManager::ProgramInfo::SamplerIndices& sampler_indices = | 5671 const Program::SamplerIndices& sampler_indices = |
| 5669 state_.current_program->sampler_indices(); | 5672 state_.current_program->sampler_indices(); |
| 5670 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 5673 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
| 5671 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = | 5674 const Program::UniformInfo* uniform_info = |
| 5672 state_.current_program->GetUniformInfo(sampler_indices[ii]); | 5675 state_.current_program->GetUniformInfo(sampler_indices[ii]); |
| 5673 DCHECK(uniform_info); | 5676 DCHECK(uniform_info); |
| 5674 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 5677 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
| 5675 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 5678 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
| 5676 if (texture_unit_index < state_.texture_units.size()) { | 5679 if (texture_unit_index < state_.texture_units.size()) { |
| 5677 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; | 5680 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; |
| 5678 TextureManager::TextureInfo* texture_info = | 5681 Texture* texture_info = |
| 5679 uniform_info->type == GL_SAMPLER_2D ? | 5682 uniform_info->type == GL_SAMPLER_2D ? |
| 5680 texture_unit.bound_texture_2d : | 5683 texture_unit.bound_texture_2d : |
| 5681 texture_unit.bound_texture_cube_map; | 5684 texture_unit.bound_texture_cube_map; |
| 5682 if (!texture_info || !texture_manager()->CanRender(texture_info)) { | 5685 if (!texture_info || !texture_manager()->CanRender(texture_info)) { |
| 5683 glActiveTexture(GL_TEXTURE0 + texture_unit_index); | 5686 glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
| 5684 // Get the texture info that was previously bound here. | 5687 // Get the texture info that was previously bound here. |
| 5685 texture_info = texture_unit.bind_target == GL_TEXTURE_2D ? | 5688 texture_info = texture_unit.bind_target == GL_TEXTURE_2D ? |
| 5686 texture_unit.bound_texture_2d : | 5689 texture_unit.bound_texture_2d : |
| 5687 texture_unit.bound_texture_cube_map; | 5690 texture_unit.bound_texture_cube_map; |
| 5688 glBindTexture(texture_unit.bind_target, | 5691 glBindTexture(texture_unit.bind_target, |
| 5689 texture_info ? texture_info->service_id() : 0); | 5692 texture_info ? texture_info->service_id() : 0); |
| 5690 } | 5693 } |
| 5691 } | 5694 } |
| 5692 } | 5695 } |
| 5693 } | 5696 } |
| 5694 // Set the active texture back to whatever the user had it as. | 5697 // Set the active texture back to whatever the user had it as. |
| 5695 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); | 5698 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); |
| 5696 } | 5699 } |
| 5697 | 5700 |
| 5698 bool GLES2DecoderImpl::ClearUnclearedTextures() { | 5701 bool GLES2DecoderImpl::ClearUnclearedTextures() { |
| 5699 // Only check if there are some uncleared textures. | 5702 // Only check if there are some uncleared textures. |
| 5700 if (!texture_manager()->HaveUnsafeTextures()) { | 5703 if (!texture_manager()->HaveUnsafeTextures()) { |
| 5701 return true; | 5704 return true; |
| 5702 } | 5705 } |
| 5703 | 5706 |
| 5704 // 1: Check all textures we are about to render with. | 5707 // 1: Check all textures we are about to render with. |
| 5705 if (state_.current_program) { | 5708 if (state_.current_program) { |
| 5706 const ProgramManager::ProgramInfo::SamplerIndices& sampler_indices = | 5709 const Program::SamplerIndices& sampler_indices = |
| 5707 state_.current_program->sampler_indices(); | 5710 state_.current_program->sampler_indices(); |
| 5708 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 5711 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
| 5709 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = | 5712 const Program::UniformInfo* uniform_info = |
| 5710 state_.current_program->GetUniformInfo(sampler_indices[ii]); | 5713 state_.current_program->GetUniformInfo(sampler_indices[ii]); |
| 5711 DCHECK(uniform_info); | 5714 DCHECK(uniform_info); |
| 5712 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 5715 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
| 5713 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 5716 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
| 5714 if (texture_unit_index < state_.texture_units.size()) { | 5717 if (texture_unit_index < state_.texture_units.size()) { |
| 5715 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; | 5718 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; |
| 5716 TextureManager::TextureInfo* texture_info = | 5719 Texture* texture_info = |
| 5717 texture_unit.GetInfoForSamplerType(uniform_info->type); | 5720 texture_unit.GetInfoForSamplerType(uniform_info->type); |
| 5718 if (texture_info && !texture_info->SafeToRenderFrom()) { | 5721 if (texture_info && !texture_info->SafeToRenderFrom()) { |
| 5719 if (!texture_manager()->ClearRenderableLevels(this, texture_info)) { | 5722 if (!texture_manager()->ClearRenderableLevels(this, texture_info)) { |
| 5720 return false; | 5723 return false; |
| 5721 } | 5724 } |
| 5722 } | 5725 } |
| 5723 } | 5726 } |
| 5724 } | 5727 } |
| 5725 } | 5728 } |
| 5726 } | 5729 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 5743 // true if any enabled, used divisor is zero | 5746 // true if any enabled, used divisor is zero |
| 5744 bool divisor0 = false; | 5747 bool divisor0 = false; |
| 5745 // Validate all attribs currently enabled. If they are used by the current | 5748 // Validate all attribs currently enabled. If they are used by the current |
| 5746 // program then check that they have enough elements to handle the draw call. | 5749 // program then check that they have enough elements to handle the draw call. |
| 5747 // If they are not used by the current program check that they have a buffer | 5750 // If they are not used by the current program check that they have a buffer |
| 5748 // assigned. | 5751 // assigned. |
| 5749 const VertexAttribManager::VertexAttribInfoList& infos = | 5752 const VertexAttribManager::VertexAttribInfoList& infos = |
| 5750 state_.vertex_attrib_manager->GetEnabledVertexAttribInfos(); | 5753 state_.vertex_attrib_manager->GetEnabledVertexAttribInfos(); |
| 5751 for (VertexAttribManager::VertexAttribInfoList::const_iterator it = | 5754 for (VertexAttribManager::VertexAttribInfoList::const_iterator it = |
| 5752 infos.begin(); it != infos.end(); ++it) { | 5755 infos.begin(); it != infos.end(); ++it) { |
| 5753 const VertexAttribManager::VertexAttribInfo* info = *it; | 5756 const VertexAttrib* info = *it; |
| 5754 const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = | 5757 const Program::VertexAttrib* attrib_info = |
| 5755 state_.current_program->GetAttribInfoByLocation(info->index()); | 5758 state_.current_program->GetAttribInfoByLocation(info->index()); |
| 5756 if (attrib_info) { | 5759 if (attrib_info) { |
| 5757 divisor0 |= (info->divisor() == 0); | 5760 divisor0 |= (info->divisor() == 0); |
| 5758 GLuint count = info->MaxVertexAccessed(primcount, max_vertex_accessed); | 5761 GLuint count = info->MaxVertexAccessed(primcount, max_vertex_accessed); |
| 5759 // This attrib is used in the current program. | 5762 // This attrib is used in the current program. |
| 5760 if (!info->CanAccess(count)) { | 5763 if (!info->CanAccess(count)) { |
| 5761 SetGLError( | 5764 SetGLError( |
| 5762 GL_INVALID_OPERATION, function_name, | 5765 GL_INVALID_OPERATION, function_name, |
| 5763 (std::string( | 5766 (std::string( |
| 5764 "attempt to access out of range vertices in attribute ") + | 5767 "attempt to access out of range vertices in attribute ") + |
| (...skipping 26 matching lines...) Expand all Loading... |
| 5791 } | 5794 } |
| 5792 | 5795 |
| 5793 bool GLES2DecoderImpl::SimulateAttrib0( | 5796 bool GLES2DecoderImpl::SimulateAttrib0( |
| 5794 const char* function_name, GLuint max_vertex_accessed, bool* simulated) { | 5797 const char* function_name, GLuint max_vertex_accessed, bool* simulated) { |
| 5795 DCHECK(simulated); | 5798 DCHECK(simulated); |
| 5796 *simulated = false; | 5799 *simulated = false; |
| 5797 | 5800 |
| 5798 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) | 5801 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) |
| 5799 return true; | 5802 return true; |
| 5800 | 5803 |
| 5801 const VertexAttribManager::VertexAttribInfo* info = | 5804 const VertexAttrib* info = |
| 5802 state_.vertex_attrib_manager->GetVertexAttribInfo(0); | 5805 state_.vertex_attrib_manager->GetVertexAttrib(0); |
| 5803 // If it's enabled or it's not used then we don't need to do anything. | 5806 // If it's enabled or it's not used then we don't need to do anything. |
| 5804 bool attrib_0_used = | 5807 bool attrib_0_used = |
| 5805 state_.current_program->GetAttribInfoByLocation(0) != NULL; | 5808 state_.current_program->GetAttribInfoByLocation(0) != NULL; |
| 5806 if (info->enabled() && attrib_0_used) { | 5809 if (info->enabled() && attrib_0_used) { |
| 5807 return true; | 5810 return true; |
| 5808 } | 5811 } |
| 5809 | 5812 |
| 5810 // Make a buffer with a single repeated vec4 value enough to | 5813 // Make a buffer with a single repeated vec4 value enough to |
| 5811 // simulate the constant value that is supposed to be here. | 5814 // simulate the constant value that is supposed to be here. |
| 5812 // This is required to emulate GLES2 on GL. | 5815 // This is required to emulate GLES2 on GL. |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5854 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL); | 5857 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL); |
| 5855 | 5858 |
| 5856 if (info->divisor()) | 5859 if (info->divisor()) |
| 5857 glVertexAttribDivisorANGLE(0, 0); | 5860 glVertexAttribDivisorANGLE(0, 0); |
| 5858 | 5861 |
| 5859 *simulated = true; | 5862 *simulated = true; |
| 5860 return true; | 5863 return true; |
| 5861 } | 5864 } |
| 5862 | 5865 |
| 5863 void GLES2DecoderImpl::RestoreStateForAttrib(GLuint attrib) { | 5866 void GLES2DecoderImpl::RestoreStateForAttrib(GLuint attrib) { |
| 5864 const VertexAttribManager::VertexAttribInfo* info = | 5867 const VertexAttrib* info = |
| 5865 state_.vertex_attrib_manager->GetVertexAttribInfo(attrib); | 5868 state_.vertex_attrib_manager->GetVertexAttrib(attrib); |
| 5866 const void* ptr = reinterpret_cast<const void*>(info->offset()); | 5869 const void* ptr = reinterpret_cast<const void*>(info->offset()); |
| 5867 BufferManager::BufferInfo* buffer_info = info->buffer(); | 5870 BufferManager::Buffer* buffer_info = info->buffer(); |
| 5868 glBindBuffer(GL_ARRAY_BUFFER, buffer_info ? buffer_info->service_id() : 0); | 5871 glBindBuffer(GL_ARRAY_BUFFER, buffer_info ? buffer_info->service_id() : 0); |
| 5869 glVertexAttribPointer( | 5872 glVertexAttribPointer( |
| 5870 attrib, info->size(), info->type(), info->normalized(), info->gl_stride(), | 5873 attrib, info->size(), info->type(), info->normalized(), info->gl_stride(), |
| 5871 ptr); | 5874 ptr); |
| 5872 if (info->divisor()) | 5875 if (info->divisor()) |
| 5873 glVertexAttribDivisorANGLE(attrib, info->divisor()); | 5876 glVertexAttribDivisorANGLE(attrib, info->divisor()); |
| 5874 glBindBuffer( | 5877 glBindBuffer( |
| 5875 GL_ARRAY_BUFFER, | 5878 GL_ARRAY_BUFFER, |
| 5876 state_.bound_array_buffer ? state_.bound_array_buffer->service_id() : 0); | 5879 state_.bound_array_buffer ? state_.bound_array_buffer->service_id() : 0); |
| 5877 | 5880 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 5907 // twice in 2 different attribs, find the overlapping parts and therefore | 5910 // twice in 2 different attribs, find the overlapping parts and therefore |
| 5908 // duplicate the minimum amount of data but this whole code path is not meant | 5911 // duplicate the minimum amount of data but this whole code path is not meant |
| 5909 // to be used normally. It's just here to pass that OpenGL ES 2.0 conformance | 5912 // to be used normally. It's just here to pass that OpenGL ES 2.0 conformance |
| 5910 // tests so we just add to the buffer attrib used. | 5913 // tests so we just add to the buffer attrib used. |
| 5911 | 5914 |
| 5912 GLuint elements_needed = 0; | 5915 GLuint elements_needed = 0; |
| 5913 const VertexAttribManager::VertexAttribInfoList& infos = | 5916 const VertexAttribManager::VertexAttribInfoList& infos = |
| 5914 state_.vertex_attrib_manager->GetEnabledVertexAttribInfos(); | 5917 state_.vertex_attrib_manager->GetEnabledVertexAttribInfos(); |
| 5915 for (VertexAttribManager::VertexAttribInfoList::const_iterator it = | 5918 for (VertexAttribManager::VertexAttribInfoList::const_iterator it = |
| 5916 infos.begin(); it != infos.end(); ++it) { | 5919 infos.begin(); it != infos.end(); ++it) { |
| 5917 const VertexAttribManager::VertexAttribInfo* info = *it; | 5920 const VertexAttrib* info = *it; |
| 5918 const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = | 5921 const Program::VertexAttrib* attrib_info = |
| 5919 state_.current_program->GetAttribInfoByLocation(info->index()); | 5922 state_.current_program->GetAttribInfoByLocation(info->index()); |
| 5920 GLuint max_accessed = info->MaxVertexAccessed(primcount, | 5923 GLuint max_accessed = info->MaxVertexAccessed(primcount, |
| 5921 max_vertex_accessed); | 5924 max_vertex_accessed); |
| 5922 GLuint num_vertices = max_accessed + 1; | 5925 GLuint num_vertices = max_accessed + 1; |
| 5923 if (num_vertices == 0) { | 5926 if (num_vertices == 0) { |
| 5924 SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); | 5927 SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); |
| 5925 return false; | 5928 return false; |
| 5926 } | 5929 } |
| 5927 if (attrib_info && | 5930 if (attrib_info && |
| 5928 info->CanAccess(max_accessed) && | 5931 info->CanAccess(max_accessed) && |
| (...skipping 26 matching lines...) Expand all Loading... |
| 5955 SetGLError( | 5958 SetGLError( |
| 5956 GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs"); | 5959 GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs"); |
| 5957 return false; | 5960 return false; |
| 5958 } | 5961 } |
| 5959 } | 5962 } |
| 5960 | 5963 |
| 5961 // Copy the elements and convert to float | 5964 // Copy the elements and convert to float |
| 5962 GLintptr offset = 0; | 5965 GLintptr offset = 0; |
| 5963 for (VertexAttribManager::VertexAttribInfoList::const_iterator it = | 5966 for (VertexAttribManager::VertexAttribInfoList::const_iterator it = |
| 5964 infos.begin(); it != infos.end(); ++it) { | 5967 infos.begin(); it != infos.end(); ++it) { |
| 5965 const VertexAttribManager::VertexAttribInfo* info = *it; | 5968 const VertexAttrib* info = *it; |
| 5966 const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = | 5969 const Program::VertexAttrib* attrib_info = |
| 5967 state_.current_program->GetAttribInfoByLocation(info->index()); | 5970 state_.current_program->GetAttribInfoByLocation(info->index()); |
| 5968 GLuint max_accessed = info->MaxVertexAccessed(primcount, | 5971 GLuint max_accessed = info->MaxVertexAccessed(primcount, |
| 5969 max_vertex_accessed); | 5972 max_vertex_accessed); |
| 5970 GLuint num_vertices = max_accessed + 1; | 5973 GLuint num_vertices = max_accessed + 1; |
| 5971 if (num_vertices == 0) { | 5974 if (num_vertices == 0) { |
| 5972 SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); | 5975 SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); |
| 5973 return false; | 5976 return false; |
| 5974 } | 5977 } |
| 5975 if (attrib_info && | 5978 if (attrib_info && |
| 5976 info->CanAccess(max_accessed) && | 5979 info->CanAccess(max_accessed) && |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6071 } | 6074 } |
| 6072 } | 6075 } |
| 6073 if (simulated_attrib_0) { | 6076 if (simulated_attrib_0) { |
| 6074 RestoreStateForAttrib(0); | 6077 RestoreStateForAttrib(0); |
| 6075 } | 6078 } |
| 6076 } | 6079 } |
| 6077 return error::kNoError; | 6080 return error::kNoError; |
| 6078 } | 6081 } |
| 6079 | 6082 |
| 6080 error::Error GLES2DecoderImpl::HandleDrawArrays( | 6083 error::Error GLES2DecoderImpl::HandleDrawArrays( |
| 6081 uint32 immediate_data_size, const gles2::DrawArrays& c) { | 6084 uint32 immediate_data_size, const cmds::DrawArrays& c) { |
| 6082 return DoDrawArrays("glDrawArrays", | 6085 return DoDrawArrays("glDrawArrays", |
| 6083 false, | 6086 false, |
| 6084 static_cast<GLenum>(c.mode), | 6087 static_cast<GLenum>(c.mode), |
| 6085 static_cast<GLint>(c.first), | 6088 static_cast<GLint>(c.first), |
| 6086 static_cast<GLsizei>(c.count), | 6089 static_cast<GLsizei>(c.count), |
| 6087 0); | 6090 0); |
| 6088 } | 6091 } |
| 6089 | 6092 |
| 6090 error::Error GLES2DecoderImpl::HandleDrawArraysInstancedANGLE( | 6093 error::Error GLES2DecoderImpl::HandleDrawArraysInstancedANGLE( |
| 6091 uint32 immediate_data_size, const gles2::DrawArraysInstancedANGLE& c) { | 6094 uint32 immediate_data_size, const cmds::DrawArraysInstancedANGLE& c) { |
| 6092 if (!features().angle_instanced_arrays) { | 6095 if (!features().angle_instanced_arrays) { |
| 6093 SetGLError(GL_INVALID_OPERATION, | 6096 SetGLError(GL_INVALID_OPERATION, |
| 6094 "glDrawArraysInstancedANGLE", "function not available"); | 6097 "glDrawArraysInstancedANGLE", "function not available"); |
| 6095 return error::kNoError; | 6098 return error::kNoError; |
| 6096 } | 6099 } |
| 6097 return DoDrawArrays("glDrawArraysIntancedANGLE", | 6100 return DoDrawArrays("glDrawArraysIntancedANGLE", |
| 6098 true, | 6101 true, |
| 6099 static_cast<GLenum>(c.mode), | 6102 static_cast<GLenum>(c.mode), |
| 6100 static_cast<GLint>(c.first), | 6103 static_cast<GLint>(c.first), |
| 6101 static_cast<GLsizei>(c.count), | 6104 static_cast<GLsizei>(c.count), |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6186 } | 6189 } |
| 6187 } | 6190 } |
| 6188 if (simulated_attrib_0) { | 6191 if (simulated_attrib_0) { |
| 6189 RestoreStateForAttrib(0); | 6192 RestoreStateForAttrib(0); |
| 6190 } | 6193 } |
| 6191 } | 6194 } |
| 6192 return error::kNoError; | 6195 return error::kNoError; |
| 6193 } | 6196 } |
| 6194 | 6197 |
| 6195 error::Error GLES2DecoderImpl::HandleDrawElements( | 6198 error::Error GLES2DecoderImpl::HandleDrawElements( |
| 6196 uint32 immediate_data_size, const gles2::DrawElements& c) { | 6199 uint32 immediate_data_size, const cmds::DrawElements& c) { |
| 6197 return DoDrawElements("glDrawElements", | 6200 return DoDrawElements("glDrawElements", |
| 6198 false, | 6201 false, |
| 6199 static_cast<GLenum>(c.mode), | 6202 static_cast<GLenum>(c.mode), |
| 6200 static_cast<GLsizei>(c.count), | 6203 static_cast<GLsizei>(c.count), |
| 6201 static_cast<GLenum>(c.type), | 6204 static_cast<GLenum>(c.type), |
| 6202 static_cast<int32>(c.index_offset), | 6205 static_cast<int32>(c.index_offset), |
| 6203 0); | 6206 0); |
| 6204 } | 6207 } |
| 6205 | 6208 |
| 6206 error::Error GLES2DecoderImpl::HandleDrawElementsInstancedANGLE( | 6209 error::Error GLES2DecoderImpl::HandleDrawElementsInstancedANGLE( |
| 6207 uint32 immediate_data_size, const gles2::DrawElementsInstancedANGLE& c) { | 6210 uint32 immediate_data_size, const cmds::DrawElementsInstancedANGLE& c) { |
| 6208 if (!features().angle_instanced_arrays) { | 6211 if (!features().angle_instanced_arrays) { |
| 6209 SetGLError(GL_INVALID_OPERATION, | 6212 SetGLError(GL_INVALID_OPERATION, |
| 6210 "glDrawElementsInstancedANGLE", "function not available"); | 6213 "glDrawElementsInstancedANGLE", "function not available"); |
| 6211 return error::kNoError; | 6214 return error::kNoError; |
| 6212 } | 6215 } |
| 6213 return DoDrawElements("glDrawElementsInstancedANGLE", | 6216 return DoDrawElements("glDrawElementsInstancedANGLE", |
| 6214 true, | 6217 true, |
| 6215 static_cast<GLenum>(c.mode), | 6218 static_cast<GLenum>(c.mode), |
| 6216 static_cast<GLsizei>(c.count), | 6219 static_cast<GLsizei>(c.count), |
| 6217 static_cast<GLenum>(c.type), | 6220 static_cast<GLenum>(c.type), |
| 6218 static_cast<int32>(c.index_offset), | 6221 static_cast<int32>(c.index_offset), |
| 6219 static_cast<GLsizei>(c.primcount)); | 6222 static_cast<GLsizei>(c.primcount)); |
| 6220 } | 6223 } |
| 6221 | 6224 |
| 6222 GLuint GLES2DecoderImpl::DoGetMaxValueInBufferCHROMIUM( | 6225 GLuint GLES2DecoderImpl::DoGetMaxValueInBufferCHROMIUM( |
| 6223 GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) { | 6226 GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) { |
| 6224 GLuint max_vertex_accessed = 0; | 6227 GLuint max_vertex_accessed = 0; |
| 6225 BufferManager::BufferInfo* info = GetBufferInfo(buffer_id); | 6228 BufferManager::Buffer* info = GetBuffer(buffer_id); |
| 6226 if (!info) { | 6229 if (!info) { |
| 6227 // TODO(gman): Should this be a GL error or a command buffer error? | 6230 // TODO(gman): Should this be a GL error or a command buffer error? |
| 6228 SetGLError(GL_INVALID_VALUE, | 6231 SetGLError(GL_INVALID_VALUE, |
| 6229 "GetMaxValueInBufferCHROMIUM", "unknown buffer"); | 6232 "GetMaxValueInBufferCHROMIUM", "unknown buffer"); |
| 6230 } else { | 6233 } else { |
| 6231 if (!info->GetMaxValueForRange(offset, count, type, &max_vertex_accessed)) { | 6234 if (!info->GetMaxValueForRange(offset, count, type, &max_vertex_accessed)) { |
| 6232 // TODO(gman): Should this be a GL error or a command buffer error? | 6235 // TODO(gman): Should this be a GL error or a command buffer error? |
| 6233 SetGLError( | 6236 SetGLError( |
| 6234 GL_INVALID_OPERATION, | 6237 GL_INVALID_OPERATION, |
| 6235 "GetMaxValueInBufferCHROMIUM", "range out of bounds for buffer"); | 6238 "GetMaxValueInBufferCHROMIUM", "range out of bounds for buffer"); |
| 6236 } | 6239 } |
| 6237 } | 6240 } |
| 6238 return max_vertex_accessed; | 6241 return max_vertex_accessed; |
| 6239 } | 6242 } |
| 6240 | 6243 |
| 6241 // Calls glShaderSource for the various versions of the ShaderSource command. | 6244 // Calls glShaderSource for the various versions of the ShaderSource command. |
| 6242 // Assumes that data / data_size points to a piece of memory that is in range | 6245 // Assumes that data / data_size points to a piece of memory that is in range |
| 6243 // of whatever context it came from (shared memory, immediate memory, bucket | 6246 // of whatever context it came from (shared memory, immediate memory, bucket |
| 6244 // memory.) | 6247 // memory.) |
| 6245 error::Error GLES2DecoderImpl::ShaderSourceHelper( | 6248 error::Error GLES2DecoderImpl::ShaderSourceHelper( |
| 6246 GLuint client_id, const char* data, uint32 data_size) { | 6249 GLuint client_id, const char* data, uint32 data_size) { |
| 6247 std::string str(data, data + data_size); | 6250 std::string str(data, data + data_size); |
| 6248 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram( | 6251 Shader* info = GetShaderInfoNotProgram( |
| 6249 client_id, "glShaderSource"); | 6252 client_id, "glShaderSource"); |
| 6250 if (!info) { | 6253 if (!info) { |
| 6251 return error::kNoError; | 6254 return error::kNoError; |
| 6252 } | 6255 } |
| 6253 // Note: We don't actually call glShaderSource here. We wait until | 6256 // Note: We don't actually call glShaderSource here. We wait until |
| 6254 // the call to glCompileShader. | 6257 // the call to glCompileShader. |
| 6255 info->UpdateSource(str.c_str()); | 6258 info->UpdateSource(str.c_str()); |
| 6256 return error::kNoError; | 6259 return error::kNoError; |
| 6257 } | 6260 } |
| 6258 | 6261 |
| 6259 error::Error GLES2DecoderImpl::HandleShaderSource( | 6262 error::Error GLES2DecoderImpl::HandleShaderSource( |
| 6260 uint32 immediate_data_size, const gles2::ShaderSource& c) { | 6263 uint32 immediate_data_size, const cmds::ShaderSource& c) { |
| 6261 uint32 data_size = c.data_size; | 6264 uint32 data_size = c.data_size; |
| 6262 const char* data = GetSharedMemoryAs<const char*>( | 6265 const char* data = GetSharedMemoryAs<const char*>( |
| 6263 c.data_shm_id, c.data_shm_offset, data_size); | 6266 c.data_shm_id, c.data_shm_offset, data_size); |
| 6264 if (!data) { | 6267 if (!data) { |
| 6265 return error::kOutOfBounds; | 6268 return error::kOutOfBounds; |
| 6266 } | 6269 } |
| 6267 return ShaderSourceHelper(c.shader, data, data_size); | 6270 return ShaderSourceHelper(c.shader, data, data_size); |
| 6268 } | 6271 } |
| 6269 | 6272 |
| 6270 error::Error GLES2DecoderImpl::HandleShaderSourceImmediate( | 6273 error::Error GLES2DecoderImpl::HandleShaderSourceImmediate( |
| 6271 uint32 immediate_data_size, const gles2::ShaderSourceImmediate& c) { | 6274 uint32 immediate_data_size, const cmds::ShaderSourceImmediate& c) { |
| 6272 uint32 data_size = c.data_size; | 6275 uint32 data_size = c.data_size; |
| 6273 const char* data = GetImmediateDataAs<const char*>( | 6276 const char* data = GetImmediateDataAs<const char*>( |
| 6274 c, data_size, immediate_data_size); | 6277 c, data_size, immediate_data_size); |
| 6275 if (!data) { | 6278 if (!data) { |
| 6276 return error::kOutOfBounds; | 6279 return error::kOutOfBounds; |
| 6277 } | 6280 } |
| 6278 return ShaderSourceHelper(c.shader, data, data_size); | 6281 return ShaderSourceHelper(c.shader, data, data_size); |
| 6279 } | 6282 } |
| 6280 | 6283 |
| 6281 error::Error GLES2DecoderImpl::HandleShaderSourceBucket( | 6284 error::Error GLES2DecoderImpl::HandleShaderSourceBucket( |
| 6282 uint32 immediate_data_size, const gles2::ShaderSourceBucket& c) { | 6285 uint32 immediate_data_size, const cmds::ShaderSourceBucket& c) { |
| 6283 Bucket* bucket = GetBucket(c.data_bucket_id); | 6286 Bucket* bucket = GetBucket(c.data_bucket_id); |
| 6284 if (!bucket || bucket->size() == 0) { | 6287 if (!bucket || bucket->size() == 0) { |
| 6285 return error::kInvalidArguments; | 6288 return error::kInvalidArguments; |
| 6286 } | 6289 } |
| 6287 return ShaderSourceHelper( | 6290 return ShaderSourceHelper( |
| 6288 c.shader, bucket->GetDataAs<const char*>(0, bucket->size() - 1), | 6291 c.shader, bucket->GetDataAs<const char*>(0, bucket->size() - 1), |
| 6289 bucket->size() - 1); | 6292 bucket->size() - 1); |
| 6290 } | 6293 } |
| 6291 | 6294 |
| 6292 void GLES2DecoderImpl::DoCompileShader(GLuint client_id) { | 6295 void GLES2DecoderImpl::DoCompileShader(GLuint client_id) { |
| 6293 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompileShader"); | 6296 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompileShader"); |
| 6294 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram( | 6297 Shader* info = GetShaderInfoNotProgram( |
| 6295 client_id, "glCompileShader"); | 6298 client_id, "glCompileShader"); |
| 6296 if (!info) { | 6299 if (!info) { |
| 6297 return; | 6300 return; |
| 6298 } | 6301 } |
| 6299 ShaderTranslator* translator = NULL; | 6302 ShaderTranslator* translator = NULL; |
| 6300 if (use_shader_translator_) { | 6303 if (use_shader_translator_) { |
| 6301 translator = info->shader_type() == GL_VERTEX_SHADER ? | 6304 translator = info->shader_type() == GL_VERTEX_SHADER ? |
| 6302 vertex_translator_.get() : fragment_translator_.get(); | 6305 vertex_translator_.get() : fragment_translator_.get(); |
| 6303 } | 6306 } |
| 6304 | 6307 |
| 6305 program_manager()->DoCompileShader(info, translator, feature_info_); | 6308 program_manager()->DoCompileShader(info, translator, feature_info_); |
| 6306 }; | 6309 }; |
| 6307 | 6310 |
| 6308 void GLES2DecoderImpl::DoGetShaderiv( | 6311 void GLES2DecoderImpl::DoGetShaderiv( |
| 6309 GLuint shader, GLenum pname, GLint* params) { | 6312 GLuint shader, GLenum pname, GLint* params) { |
| 6310 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram( | 6313 Shader* info = GetShaderInfoNotProgram( |
| 6311 shader, "glGetShaderiv"); | 6314 shader, "glGetShaderiv"); |
| 6312 if (!info) { | 6315 if (!info) { |
| 6313 return; | 6316 return; |
| 6314 } | 6317 } |
| 6315 switch (pname) { | 6318 switch (pname) { |
| 6316 case GL_SHADER_SOURCE_LENGTH: | 6319 case GL_SHADER_SOURCE_LENGTH: |
| 6317 *params = info->source() ? info->source()->size() + 1 : 0; | 6320 *params = info->source() ? info->source()->size() + 1 : 0; |
| 6318 return; | 6321 return; |
| 6319 case GL_COMPILE_STATUS: | 6322 case GL_COMPILE_STATUS: |
| 6320 *params = compile_shader_always_succeeds_ ? true : info->IsValid(); | 6323 *params = compile_shader_always_succeeds_ ? true : info->IsValid(); |
| 6321 return; | 6324 return; |
| 6322 case GL_INFO_LOG_LENGTH: | 6325 case GL_INFO_LOG_LENGTH: |
| 6323 *params = info->log_info() ? info->log_info()->size() + 1 : 0; | 6326 *params = info->log_info() ? info->log_info()->size() + 1 : 0; |
| 6324 return; | 6327 return; |
| 6325 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE: | 6328 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE: |
| 6326 ForceCompileShaderIfPending(info); | 6329 ForceCompileShaderIfPending(info); |
| 6327 *params = info->translated_source() ? | 6330 *params = info->translated_source() ? |
| 6328 info->translated_source()->size() + 1 : 0; | 6331 info->translated_source()->size() + 1 : 0; |
| 6329 return; | 6332 return; |
| 6330 default: | 6333 default: |
| 6331 break; | 6334 break; |
| 6332 } | 6335 } |
| 6333 glGetShaderiv(info->service_id(), pname, params); | 6336 glGetShaderiv(info->service_id(), pname, params); |
| 6334 } | 6337 } |
| 6335 | 6338 |
| 6336 error::Error GLES2DecoderImpl::HandleGetShaderSource( | 6339 error::Error GLES2DecoderImpl::HandleGetShaderSource( |
| 6337 uint32 immediate_data_size, const gles2::GetShaderSource& c) { | 6340 uint32 immediate_data_size, const cmds::GetShaderSource& c) { |
| 6338 GLuint shader = c.shader; | 6341 GLuint shader = c.shader; |
| 6339 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 6342 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
| 6340 Bucket* bucket = CreateBucket(bucket_id); | 6343 Bucket* bucket = CreateBucket(bucket_id); |
| 6341 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram( | 6344 Shader* info = GetShaderInfoNotProgram( |
| 6342 shader, "glGetShaderSource"); | 6345 shader, "glGetShaderSource"); |
| 6343 if (!info || !info->source()) { | 6346 if (!info || !info->source()) { |
| 6344 bucket->SetSize(0); | 6347 bucket->SetSize(0); |
| 6345 return error::kNoError; | 6348 return error::kNoError; |
| 6346 } | 6349 } |
| 6347 bucket->SetFromString(info->source()->c_str()); | 6350 bucket->SetFromString(info->source()->c_str()); |
| 6348 return error::kNoError; | 6351 return error::kNoError; |
| 6349 } | 6352 } |
| 6350 | 6353 |
| 6351 error::Error GLES2DecoderImpl::HandleGetTranslatedShaderSourceANGLE( | 6354 error::Error GLES2DecoderImpl::HandleGetTranslatedShaderSourceANGLE( |
| 6352 uint32 immediate_data_size, | 6355 uint32 immediate_data_size, |
| 6353 const gles2::GetTranslatedShaderSourceANGLE& c) { | 6356 const cmds::GetTranslatedShaderSourceANGLE& c) { |
| 6354 GLuint shader = c.shader; | 6357 GLuint shader = c.shader; |
| 6355 | 6358 |
| 6356 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 6359 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
| 6357 Bucket* bucket = CreateBucket(bucket_id); | 6360 Bucket* bucket = CreateBucket(bucket_id); |
| 6358 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram( | 6361 Shader* info = GetShaderInfoNotProgram( |
| 6359 shader, "glTranslatedGetShaderSourceANGLE"); | 6362 shader, "glTranslatedGetShaderSourceANGLE"); |
| 6360 if (!info) { | 6363 if (!info) { |
| 6361 bucket->SetSize(0); | 6364 bucket->SetSize(0); |
| 6362 return error::kNoError; | 6365 return error::kNoError; |
| 6363 } | 6366 } |
| 6364 ForceCompileShaderIfPending(info); | 6367 ForceCompileShaderIfPending(info); |
| 6365 | 6368 |
| 6366 bucket->SetFromString(info->translated_source() ? | 6369 bucket->SetFromString(info->translated_source() ? |
| 6367 info->translated_source()->c_str() : NULL); | 6370 info->translated_source()->c_str() : NULL); |
| 6368 return error::kNoError; | 6371 return error::kNoError; |
| 6369 } | 6372 } |
| 6370 | 6373 |
| 6371 error::Error GLES2DecoderImpl::HandleGetProgramInfoLog( | 6374 error::Error GLES2DecoderImpl::HandleGetProgramInfoLog( |
| 6372 uint32 immediate_data_size, const gles2::GetProgramInfoLog& c) { | 6375 uint32 immediate_data_size, const cmds::GetProgramInfoLog& c) { |
| 6373 GLuint program = c.program; | 6376 GLuint program = c.program; |
| 6374 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 6377 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
| 6375 Bucket* bucket = CreateBucket(bucket_id); | 6378 Bucket* bucket = CreateBucket(bucket_id); |
| 6376 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 6379 Program* info = GetProgramInfoNotShader( |
| 6377 program, "glGetProgramInfoLog"); | 6380 program, "glGetProgramInfoLog"); |
| 6378 if (!info || !info->log_info()) { | 6381 if (!info || !info->log_info()) { |
| 6379 bucket->SetFromString(""); | 6382 bucket->SetFromString(""); |
| 6380 return error::kNoError; | 6383 return error::kNoError; |
| 6381 } | 6384 } |
| 6382 bucket->SetFromString(info->log_info()->c_str()); | 6385 bucket->SetFromString(info->log_info()->c_str()); |
| 6383 return error::kNoError; | 6386 return error::kNoError; |
| 6384 } | 6387 } |
| 6385 | 6388 |
| 6386 error::Error GLES2DecoderImpl::HandleGetShaderInfoLog( | 6389 error::Error GLES2DecoderImpl::HandleGetShaderInfoLog( |
| 6387 uint32 immediate_data_size, const gles2::GetShaderInfoLog& c) { | 6390 uint32 immediate_data_size, const cmds::GetShaderInfoLog& c) { |
| 6388 GLuint shader = c.shader; | 6391 GLuint shader = c.shader; |
| 6389 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 6392 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
| 6390 Bucket* bucket = CreateBucket(bucket_id); | 6393 Bucket* bucket = CreateBucket(bucket_id); |
| 6391 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram( | 6394 Shader* info = GetShaderInfoNotProgram( |
| 6392 shader, "glGetShaderInfoLog"); | 6395 shader, "glGetShaderInfoLog"); |
| 6393 if (!info || !info->log_info()) { | 6396 if (!info || !info->log_info()) { |
| 6394 bucket->SetFromString(""); | 6397 bucket->SetFromString(""); |
| 6395 return error::kNoError; | 6398 return error::kNoError; |
| 6396 } | 6399 } |
| 6397 bucket->SetFromString(info->log_info()->c_str()); | 6400 bucket->SetFromString(info->log_info()->c_str()); |
| 6398 return error::kNoError; | 6401 return error::kNoError; |
| 6399 } | 6402 } |
| 6400 | 6403 |
| 6401 bool GLES2DecoderImpl::DoIsEnabled(GLenum cap) { | 6404 bool GLES2DecoderImpl::DoIsEnabled(GLenum cap) { |
| 6402 return state_.GetEnabled(cap); | 6405 return state_.GetEnabled(cap); |
| 6403 } | 6406 } |
| 6404 | 6407 |
| 6405 bool GLES2DecoderImpl::DoIsBuffer(GLuint client_id) { | 6408 bool GLES2DecoderImpl::DoIsBuffer(GLuint client_id) { |
| 6406 const BufferManager::BufferInfo* buffer = GetBufferInfo(client_id); | 6409 const BufferManager::Buffer* buffer = GetBuffer(client_id); |
| 6407 return buffer && buffer->IsValid() && !buffer->IsDeleted(); | 6410 return buffer && buffer->IsValid() && !buffer->IsDeleted(); |
| 6408 } | 6411 } |
| 6409 | 6412 |
| 6410 bool GLES2DecoderImpl::DoIsFramebuffer(GLuint client_id) { | 6413 bool GLES2DecoderImpl::DoIsFramebuffer(GLuint client_id) { |
| 6411 const FramebufferManager::FramebufferInfo* framebuffer = | 6414 const Framebuffer* framebuffer = |
| 6412 GetFramebufferInfo(client_id); | 6415 GetFramebuffer(client_id); |
| 6413 return framebuffer && framebuffer->IsValid() && !framebuffer->IsDeleted(); | 6416 return framebuffer && framebuffer->IsValid() && !framebuffer->IsDeleted(); |
| 6414 } | 6417 } |
| 6415 | 6418 |
| 6416 bool GLES2DecoderImpl::DoIsProgram(GLuint client_id) { | 6419 bool GLES2DecoderImpl::DoIsProgram(GLuint client_id) { |
| 6417 // IsProgram is true for programs as soon as they are created, until they are | 6420 // IsProgram is true for programs as soon as they are created, until they are |
| 6418 // deleted and no longer in use. | 6421 // deleted and no longer in use. |
| 6419 const ProgramManager::ProgramInfo* program = GetProgramInfo(client_id); | 6422 const Program* program = GetProgram(client_id); |
| 6420 return program != NULL && !program->IsDeleted(); | 6423 return program != NULL && !program->IsDeleted(); |
| 6421 } | 6424 } |
| 6422 | 6425 |
| 6423 bool GLES2DecoderImpl::DoIsRenderbuffer(GLuint client_id) { | 6426 bool GLES2DecoderImpl::DoIsRenderbuffer(GLuint client_id) { |
| 6424 const RenderbufferManager::RenderbufferInfo* renderbuffer = | 6427 const Renderbuffer* renderbuffer = |
| 6425 GetRenderbufferInfo(client_id); | 6428 GetRenderbuffer(client_id); |
| 6426 return renderbuffer && renderbuffer->IsValid() && !renderbuffer->IsDeleted(); | 6429 return renderbuffer && renderbuffer->IsValid() && !renderbuffer->IsDeleted(); |
| 6427 } | 6430 } |
| 6428 | 6431 |
| 6429 bool GLES2DecoderImpl::DoIsShader(GLuint client_id) { | 6432 bool GLES2DecoderImpl::DoIsShader(GLuint client_id) { |
| 6430 // IsShader is true for shaders as soon as they are created, until they | 6433 // IsShader is true for shaders as soon as they are created, until they |
| 6431 // are deleted and not attached to any programs. | 6434 // are deleted and not attached to any programs. |
| 6432 const ShaderManager::ShaderInfo* shader = GetShaderInfo(client_id); | 6435 const Shader* shader = GetShader(client_id); |
| 6433 return shader != NULL && !shader->IsDeleted(); | 6436 return shader != NULL && !shader->IsDeleted(); |
| 6434 } | 6437 } |
| 6435 | 6438 |
| 6436 bool GLES2DecoderImpl::DoIsTexture(GLuint client_id) { | 6439 bool GLES2DecoderImpl::DoIsTexture(GLuint client_id) { |
| 6437 const TextureManager::TextureInfo* texture = GetTextureInfo(client_id); | 6440 const Texture* texture = GetTexture(client_id); |
| 6438 return texture && texture->IsValid() && !texture->IsDeleted(); | 6441 return texture && texture->IsValid() && !texture->IsDeleted(); |
| 6439 } | 6442 } |
| 6440 | 6443 |
| 6441 void GLES2DecoderImpl::DoAttachShader( | 6444 void GLES2DecoderImpl::DoAttachShader( |
| 6442 GLuint program_client_id, GLint shader_client_id) { | 6445 GLuint program_client_id, GLint shader_client_id) { |
| 6443 ProgramManager::ProgramInfo* program_info = GetProgramInfoNotShader( | 6446 Program* program_info = GetProgramInfoNotShader( |
| 6444 program_client_id, "glAttachShader"); | 6447 program_client_id, "glAttachShader"); |
| 6445 if (!program_info) { | 6448 if (!program_info) { |
| 6446 return; | 6449 return; |
| 6447 } | 6450 } |
| 6448 ShaderManager::ShaderInfo* shader_info = GetShaderInfoNotProgram( | 6451 Shader* shader_info = GetShaderInfoNotProgram( |
| 6449 shader_client_id, "glAttachShader"); | 6452 shader_client_id, "glAttachShader"); |
| 6450 if (!shader_info) { | 6453 if (!shader_info) { |
| 6451 return; | 6454 return; |
| 6452 } | 6455 } |
| 6453 if (!program_info->AttachShader(shader_manager(), shader_info)) { | 6456 if (!program_info->AttachShader(shader_manager(), shader_info)) { |
| 6454 SetGLError(GL_INVALID_OPERATION, | 6457 SetGLError(GL_INVALID_OPERATION, |
| 6455 "glAttachShader", "can not attach more than" | 6458 "glAttachShader", "can not attach more than" |
| 6456 " one shader of the same type."); | 6459 " one shader of the same type."); |
| 6457 return; | 6460 return; |
| 6458 } | 6461 } |
| 6459 glAttachShader(program_info->service_id(), shader_info->service_id()); | 6462 glAttachShader(program_info->service_id(), shader_info->service_id()); |
| 6460 } | 6463 } |
| 6461 | 6464 |
| 6462 void GLES2DecoderImpl::DoDetachShader( | 6465 void GLES2DecoderImpl::DoDetachShader( |
| 6463 GLuint program_client_id, GLint shader_client_id) { | 6466 GLuint program_client_id, GLint shader_client_id) { |
| 6464 ProgramManager::ProgramInfo* program_info = GetProgramInfoNotShader( | 6467 Program* program_info = GetProgramInfoNotShader( |
| 6465 program_client_id, "glDetachShader"); | 6468 program_client_id, "glDetachShader"); |
| 6466 if (!program_info) { | 6469 if (!program_info) { |
| 6467 return; | 6470 return; |
| 6468 } | 6471 } |
| 6469 ShaderManager::ShaderInfo* shader_info = GetShaderInfoNotProgram( | 6472 Shader* shader_info = GetShaderInfoNotProgram( |
| 6470 shader_client_id, "glDetachShader"); | 6473 shader_client_id, "glDetachShader"); |
| 6471 if (!shader_info) { | 6474 if (!shader_info) { |
| 6472 return; | 6475 return; |
| 6473 } | 6476 } |
| 6474 if (!program_info->DetachShader(shader_manager(), shader_info)) { | 6477 if (!program_info->DetachShader(shader_manager(), shader_info)) { |
| 6475 SetGLError(GL_INVALID_OPERATION, | 6478 SetGLError(GL_INVALID_OPERATION, |
| 6476 "glDetachShader", "shader not attached to program"); | 6479 "glDetachShader", "shader not attached to program"); |
| 6477 return; | 6480 return; |
| 6478 } | 6481 } |
| 6479 glDetachShader(program_info->service_id(), shader_info->service_id()); | 6482 glDetachShader(program_info->service_id(), shader_info->service_id()); |
| 6480 } | 6483 } |
| 6481 | 6484 |
| 6482 void GLES2DecoderImpl::DoValidateProgram(GLuint program_client_id) { | 6485 void GLES2DecoderImpl::DoValidateProgram(GLuint program_client_id) { |
| 6483 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 6486 Program* info = GetProgramInfoNotShader( |
| 6484 program_client_id, "glValidateProgram"); | 6487 program_client_id, "glValidateProgram"); |
| 6485 if (!info) { | 6488 if (!info) { |
| 6486 return; | 6489 return; |
| 6487 } | 6490 } |
| 6488 info->Validate(); | 6491 info->Validate(); |
| 6489 } | 6492 } |
| 6490 | 6493 |
| 6491 void GLES2DecoderImpl::DoGetVertexAttribfv( | 6494 void GLES2DecoderImpl::DoGetVertexAttribfv( |
| 6492 GLuint index, GLenum pname, GLfloat* params) { | 6495 GLuint index, GLenum pname, GLfloat* params) { |
| 6493 VertexAttribManager::VertexAttribInfo* info = | 6496 VertexAttrib* info = |
| 6494 state_.vertex_attrib_manager->GetVertexAttribInfo(index); | 6497 state_.vertex_attrib_manager->GetVertexAttrib(index); |
| 6495 if (!info) { | 6498 if (!info) { |
| 6496 SetGLError(GL_INVALID_VALUE, "glGetVertexAttribfv", "index out of range"); | 6499 SetGLError(GL_INVALID_VALUE, "glGetVertexAttribfv", "index out of range"); |
| 6497 return; | 6500 return; |
| 6498 } | 6501 } |
| 6499 switch (pname) { | 6502 switch (pname) { |
| 6500 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: { | 6503 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: { |
| 6501 BufferManager::BufferInfo* buffer = info->buffer(); | 6504 BufferManager::Buffer* buffer = info->buffer(); |
| 6502 if (buffer && !buffer->IsDeleted()) { | 6505 if (buffer && !buffer->IsDeleted()) { |
| 6503 GLuint client_id; | 6506 GLuint client_id; |
| 6504 buffer_manager()->GetClientId(buffer->service_id(), &client_id); | 6507 buffer_manager()->GetClientId(buffer->service_id(), &client_id); |
| 6505 *params = static_cast<GLfloat>(client_id); | 6508 *params = static_cast<GLfloat>(client_id); |
| 6506 } | 6509 } |
| 6507 break; | 6510 break; |
| 6508 } | 6511 } |
| 6509 case GL_VERTEX_ATTRIB_ARRAY_ENABLED: | 6512 case GL_VERTEX_ATTRIB_ARRAY_ENABLED: |
| 6510 *params = static_cast<GLfloat>(info->enabled()); | 6513 *params = static_cast<GLfloat>(info->enabled()); |
| 6511 break; | 6514 break; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 6533 *params = static_cast<GLfloat>(info->divisor()); | 6536 *params = static_cast<GLfloat>(info->divisor()); |
| 6534 break; | 6537 break; |
| 6535 default: | 6538 default: |
| 6536 NOTREACHED(); | 6539 NOTREACHED(); |
| 6537 break; | 6540 break; |
| 6538 } | 6541 } |
| 6539 } | 6542 } |
| 6540 | 6543 |
| 6541 void GLES2DecoderImpl::DoGetVertexAttribiv( | 6544 void GLES2DecoderImpl::DoGetVertexAttribiv( |
| 6542 GLuint index, GLenum pname, GLint* params) { | 6545 GLuint index, GLenum pname, GLint* params) { |
| 6543 VertexAttribManager::VertexAttribInfo* info = | 6546 VertexAttrib* info = |
| 6544 state_.vertex_attrib_manager->GetVertexAttribInfo(index); | 6547 state_.vertex_attrib_manager->GetVertexAttrib(index); |
| 6545 if (!info) { | 6548 if (!info) { |
| 6546 SetGLError(GL_INVALID_VALUE, "glGetVertexAttribiv", "index out of range"); | 6549 SetGLError(GL_INVALID_VALUE, "glGetVertexAttribiv", "index out of range"); |
| 6547 return; | 6550 return; |
| 6548 } | 6551 } |
| 6549 switch (pname) { | 6552 switch (pname) { |
| 6550 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: { | 6553 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: { |
| 6551 BufferManager::BufferInfo* buffer = info->buffer(); | 6554 BufferManager::Buffer* buffer = info->buffer(); |
| 6552 if (buffer && !buffer->IsDeleted()) { | 6555 if (buffer && !buffer->IsDeleted()) { |
| 6553 GLuint client_id; | 6556 GLuint client_id; |
| 6554 buffer_manager()->GetClientId(buffer->service_id(), &client_id); | 6557 buffer_manager()->GetClientId(buffer->service_id(), &client_id); |
| 6555 *params = client_id; | 6558 *params = client_id; |
| 6556 } | 6559 } |
| 6557 break; | 6560 break; |
| 6558 } | 6561 } |
| 6559 case GL_VERTEX_ATTRIB_ARRAY_ENABLED: | 6562 case GL_VERTEX_ATTRIB_ARRAY_ENABLED: |
| 6560 *params = info->enabled(); | 6563 *params = info->enabled(); |
| 6561 break; | 6564 break; |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6653 } | 6656 } |
| 6654 } | 6657 } |
| 6655 | 6658 |
| 6656 void GLES2DecoderImpl::DoVertexAttrib4fv(GLuint index, const GLfloat* v) { | 6659 void GLES2DecoderImpl::DoVertexAttrib4fv(GLuint index, const GLfloat* v) { |
| 6657 if (SetVertexAttribValue("glVertexAttrib4fv", index, v)) { | 6660 if (SetVertexAttribValue("glVertexAttrib4fv", index, v)) { |
| 6658 glVertexAttrib4fv(index, v); | 6661 glVertexAttrib4fv(index, v); |
| 6659 } | 6662 } |
| 6660 } | 6663 } |
| 6661 | 6664 |
| 6662 error::Error GLES2DecoderImpl::HandleVertexAttribPointer( | 6665 error::Error GLES2DecoderImpl::HandleVertexAttribPointer( |
| 6663 uint32 immediate_data_size, const gles2::VertexAttribPointer& c) { | 6666 uint32 immediate_data_size, const cmds::VertexAttribPointer& c) { |
| 6664 | 6667 |
| 6665 if (!state_.bound_array_buffer || state_.bound_array_buffer->IsDeleted()) { | 6668 if (!state_.bound_array_buffer || state_.bound_array_buffer->IsDeleted()) { |
| 6666 if (state_.vertex_attrib_manager == default_vertex_attrib_manager_) { | 6669 if (state_.vertex_attrib_manager == default_vertex_attrib_manager_) { |
| 6667 SetGLError(GL_INVALID_VALUE, | 6670 SetGLError(GL_INVALID_VALUE, |
| 6668 "glVertexAttribPointer", "no array buffer bound"); | 6671 "glVertexAttribPointer", "no array buffer bound"); |
| 6669 return error::kNoError; | 6672 return error::kNoError; |
| 6670 } else if (c.offset != 0) { | 6673 } else if (c.offset != 0) { |
| 6671 SetGLError(GL_INVALID_VALUE, | 6674 SetGLError(GL_INVALID_VALUE, |
| 6672 "glVertexAttribPointer", "client side arrays are not allowed"); | 6675 "glVertexAttribPointer", "client side arrays are not allowed"); |
| 6673 return error::kNoError; | 6676 return error::kNoError; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6739 void GLES2DecoderImpl::DoViewport(GLint x, GLint y, GLsizei width, | 6742 void GLES2DecoderImpl::DoViewport(GLint x, GLint y, GLsizei width, |
| 6740 GLsizei height) { | 6743 GLsizei height) { |
| 6741 state_.viewport_x = x; | 6744 state_.viewport_x = x; |
| 6742 state_.viewport_y = y; | 6745 state_.viewport_y = y; |
| 6743 state_.viewport_width = std::min(width, viewport_max_width_); | 6746 state_.viewport_width = std::min(width, viewport_max_width_); |
| 6744 state_.viewport_height = std::min(height, viewport_max_height_); | 6747 state_.viewport_height = std::min(height, viewport_max_height_); |
| 6745 glViewport(x, y, width, height); | 6748 glViewport(x, y, width, height); |
| 6746 } | 6749 } |
| 6747 | 6750 |
| 6748 error::Error GLES2DecoderImpl::HandleVertexAttribDivisorANGLE( | 6751 error::Error GLES2DecoderImpl::HandleVertexAttribDivisorANGLE( |
| 6749 uint32 immediate_data_size, const gles2::VertexAttribDivisorANGLE& c) { | 6752 uint32 immediate_data_size, const cmds::VertexAttribDivisorANGLE& c) { |
| 6750 if (!features().angle_instanced_arrays) { | 6753 if (!features().angle_instanced_arrays) { |
| 6751 SetGLError(GL_INVALID_OPERATION, | 6754 SetGLError(GL_INVALID_OPERATION, |
| 6752 "glVertexAttribDivisorANGLE", "function not available"); | 6755 "glVertexAttribDivisorANGLE", "function not available"); |
| 6753 } | 6756 } |
| 6754 GLuint index = c.index; | 6757 GLuint index = c.index; |
| 6755 GLuint divisor = c.divisor; | 6758 GLuint divisor = c.divisor; |
| 6756 if (index >= group_->max_vertex_attribs()) { | 6759 if (index >= group_->max_vertex_attribs()) { |
| 6757 SetGLError(GL_INVALID_VALUE, | 6760 SetGLError(GL_INVALID_VALUE, |
| 6758 "glVertexAttribDivisorANGLE", "index out of range"); | 6761 "glVertexAttribDivisorANGLE", "index out of range"); |
| 6759 return error::kNoError; | 6762 return error::kNoError; |
| 6760 } | 6763 } |
| 6761 | 6764 |
| 6762 state_.vertex_attrib_manager->SetDivisor( | 6765 state_.vertex_attrib_manager->SetDivisor( |
| 6763 index, | 6766 index, |
| 6764 divisor); | 6767 divisor); |
| 6765 glVertexAttribDivisorANGLE(index, divisor); | 6768 glVertexAttribDivisorANGLE(index, divisor); |
| 6766 return error::kNoError; | 6769 return error::kNoError; |
| 6767 } | 6770 } |
| 6768 | 6771 |
| 6769 error::Error GLES2DecoderImpl::HandleReadPixels( | 6772 error::Error GLES2DecoderImpl::HandleReadPixels( |
| 6770 uint32 immediate_data_size, const gles2::ReadPixels& c) { | 6773 uint32 immediate_data_size, const cmds::ReadPixels& c) { |
| 6771 if (ShouldDeferReads()) | 6774 if (ShouldDeferReads()) |
| 6772 return error::kDeferCommandUntilLater; | 6775 return error::kDeferCommandUntilLater; |
| 6773 GLint x = c.x; | 6776 GLint x = c.x; |
| 6774 GLint y = c.y; | 6777 GLint y = c.y; |
| 6775 GLsizei width = c.width; | 6778 GLsizei width = c.width; |
| 6776 GLsizei height = c.height; | 6779 GLsizei height = c.height; |
| 6777 GLenum format = c.format; | 6780 GLenum format = c.format; |
| 6778 GLenum type = c.type; | 6781 GLenum type = c.type; |
| 6779 if (width < 0 || height < 0) { | 6782 if (width < 0 || height < 0) { |
| 6780 SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions < 0"); | 6783 SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions < 0"); |
| 6781 return error::kNoError; | 6784 return error::kNoError; |
| 6782 } | 6785 } |
| 6783 typedef gles2::ReadPixels::Result Result; | 6786 typedef cmds::ReadPixels::Result Result; |
| 6784 uint32 pixels_size; | 6787 uint32 pixels_size; |
| 6785 if (!GLES2Util::ComputeImageDataSizes( | 6788 if (!GLES2Util::ComputeImageDataSizes( |
| 6786 width, height, format, type, state_.pack_alignment, &pixels_size, | 6789 width, height, format, type, state_.pack_alignment, &pixels_size, |
| 6787 NULL, NULL)) { | 6790 NULL, NULL)) { |
| 6788 return error::kOutOfBounds; | 6791 return error::kOutOfBounds; |
| 6789 } | 6792 } |
| 6790 void* pixels = GetSharedMemoryAs<void*>( | 6793 void* pixels = GetSharedMemoryAs<void*>( |
| 6791 c.pixels_shm_id, c.pixels_shm_offset, pixels_size); | 6794 c.pixels_shm_id, c.pixels_shm_offset, pixels_size); |
| 6792 Result* result = GetSharedMemoryAs<Result*>( | 6795 Result* result = GetSharedMemoryAs<Result*>( |
| 6793 c.result_shm_id, c.result_shm_offset, sizeof(*result)); | 6796 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6914 default: | 6917 default: |
| 6915 break; | 6918 break; |
| 6916 } | 6919 } |
| 6917 } | 6920 } |
| 6918 } | 6921 } |
| 6919 | 6922 |
| 6920 return error::kNoError; | 6923 return error::kNoError; |
| 6921 } | 6924 } |
| 6922 | 6925 |
| 6923 error::Error GLES2DecoderImpl::HandlePixelStorei( | 6926 error::Error GLES2DecoderImpl::HandlePixelStorei( |
| 6924 uint32 immediate_data_size, const gles2::PixelStorei& c) { | 6927 uint32 immediate_data_size, const cmds::PixelStorei& c) { |
| 6925 GLenum pname = c.pname; | 6928 GLenum pname = c.pname; |
| 6926 GLenum param = c.param; | 6929 GLenum param = c.param; |
| 6927 if (!validators_->pixel_store.IsValid(pname)) { | 6930 if (!validators_->pixel_store.IsValid(pname)) { |
| 6928 SetGLErrorInvalidEnum("glPixelStorei", pname, "pname"); | 6931 SetGLErrorInvalidEnum("glPixelStorei", pname, "pname"); |
| 6929 return error::kNoError; | 6932 return error::kNoError; |
| 6930 } | 6933 } |
| 6931 switch (pname) { | 6934 switch (pname) { |
| 6932 case GL_PACK_ALIGNMENT: | 6935 case GL_PACK_ALIGNMENT: |
| 6933 case GL_UNPACK_ALIGNMENT: | 6936 case GL_UNPACK_ALIGNMENT: |
| 6934 if (!validators_->pixel_store_alignment.IsValid(param)) { | 6937 if (!validators_->pixel_store_alignment.IsValid(param)) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 6962 break; | 6965 break; |
| 6963 default: | 6966 default: |
| 6964 // Validation should have prevented us from getting here. | 6967 // Validation should have prevented us from getting here. |
| 6965 NOTREACHED(); | 6968 NOTREACHED(); |
| 6966 break; | 6969 break; |
| 6967 } | 6970 } |
| 6968 return error::kNoError; | 6971 return error::kNoError; |
| 6969 } | 6972 } |
| 6970 | 6973 |
| 6971 error::Error GLES2DecoderImpl::HandlePostSubBufferCHROMIUM( | 6974 error::Error GLES2DecoderImpl::HandlePostSubBufferCHROMIUM( |
| 6972 uint32 immediate_data_size, const gles2::PostSubBufferCHROMIUM& c) { | 6975 uint32 immediate_data_size, const cmds::PostSubBufferCHROMIUM& c) { |
| 6973 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandlePostSubBufferCHROMIUM"); | 6976 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandlePostSubBufferCHROMIUM"); |
| 6974 if (!surface_->HasExtension("GL_CHROMIUM_post_sub_buffer")) { | 6977 if (!surface_->HasExtension("GL_CHROMIUM_post_sub_buffer")) { |
| 6975 SetGLError(GL_INVALID_OPERATION, | 6978 SetGLError(GL_INVALID_OPERATION, |
| 6976 "glPostSubBufferCHROMIUM", "command not supported by surface"); | 6979 "glPostSubBufferCHROMIUM", "command not supported by surface"); |
| 6977 return error::kNoError; | 6980 return error::kNoError; |
| 6978 } | 6981 } |
| 6979 if (surface_->PostSubBuffer(c.x, c.y, c.width, c.height)) { | 6982 if (surface_->PostSubBuffer(c.x, c.y, c.width, c.height)) { |
| 6980 return error::kNoError; | 6983 return error::kNoError; |
| 6981 } else { | 6984 } else { |
| 6982 LOG(ERROR) << "Context lost because PostSubBuffer failed."; | 6985 LOG(ERROR) << "Context lost because PostSubBuffer failed."; |
| 6983 return error::kLostContext; | 6986 return error::kLostContext; |
| 6984 } | 6987 } |
| 6985 } | 6988 } |
| 6986 | 6989 |
| 6987 error::Error GLES2DecoderImpl::GetAttribLocationHelper( | 6990 error::Error GLES2DecoderImpl::GetAttribLocationHelper( |
| 6988 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, | 6991 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, |
| 6989 const std::string& name_str) { | 6992 const std::string& name_str) { |
| 6990 if (!StringIsValidForGLES(name_str.c_str())) { | 6993 if (!StringIsValidForGLES(name_str.c_str())) { |
| 6991 SetGLError(GL_INVALID_VALUE, "glGetAttribLocation", "Invalid character"); | 6994 SetGLError(GL_INVALID_VALUE, "glGetAttribLocation", "Invalid character"); |
| 6992 return error::kNoError; | 6995 return error::kNoError; |
| 6993 } | 6996 } |
| 6994 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 6997 Program* info = GetProgramInfoNotShader( |
| 6995 client_id, "glGetAttribLocation"); | 6998 client_id, "glGetAttribLocation"); |
| 6996 if (!info) { | 6999 if (!info) { |
| 6997 return error::kNoError; | 7000 return error::kNoError; |
| 6998 } | 7001 } |
| 6999 if (!info->IsValid()) { | 7002 if (!info->IsValid()) { |
| 7000 SetGLError( | 7003 SetGLError( |
| 7001 GL_INVALID_OPERATION, "glGetAttribLocation", "program not linked"); | 7004 GL_INVALID_OPERATION, "glGetAttribLocation", "program not linked"); |
| 7002 return error::kNoError; | 7005 return error::kNoError; |
| 7003 } | 7006 } |
| 7004 GLint* location = GetSharedMemoryAs<GLint*>( | 7007 GLint* location = GetSharedMemoryAs<GLint*>( |
| 7005 location_shm_id, location_shm_offset, sizeof(GLint)); | 7008 location_shm_id, location_shm_offset, sizeof(GLint)); |
| 7006 if (!location) { | 7009 if (!location) { |
| 7007 return error::kOutOfBounds; | 7010 return error::kOutOfBounds; |
| 7008 } | 7011 } |
| 7009 // Require the client to init this incase the context is lost and we are no | 7012 // Require the client to init this incase the context is lost and we are no |
| 7010 // longer executing commands. | 7013 // longer executing commands. |
| 7011 if (*location != -1) { | 7014 if (*location != -1) { |
| 7012 return error::kGenericError; | 7015 return error::kGenericError; |
| 7013 } | 7016 } |
| 7014 *location = info->GetAttribLocation(name_str); | 7017 *location = info->GetAttribLocation(name_str); |
| 7015 return error::kNoError; | 7018 return error::kNoError; |
| 7016 } | 7019 } |
| 7017 | 7020 |
| 7018 error::Error GLES2DecoderImpl::HandleGetAttribLocation( | 7021 error::Error GLES2DecoderImpl::HandleGetAttribLocation( |
| 7019 uint32 immediate_data_size, const gles2::GetAttribLocation& c) { | 7022 uint32 immediate_data_size, const cmds::GetAttribLocation& c) { |
| 7020 uint32 name_size = c.data_size; | 7023 uint32 name_size = c.data_size; |
| 7021 const char* name = GetSharedMemoryAs<const char*>( | 7024 const char* name = GetSharedMemoryAs<const char*>( |
| 7022 c.name_shm_id, c.name_shm_offset, name_size); | 7025 c.name_shm_id, c.name_shm_offset, name_size); |
| 7023 if (!name) { | 7026 if (!name) { |
| 7024 return error::kOutOfBounds; | 7027 return error::kOutOfBounds; |
| 7025 } | 7028 } |
| 7026 String name_str(name, name_size); | 7029 String name_str(name, name_size); |
| 7027 return GetAttribLocationHelper( | 7030 return GetAttribLocationHelper( |
| 7028 c.program, c.location_shm_id, c.location_shm_offset, name_str); | 7031 c.program, c.location_shm_id, c.location_shm_offset, name_str); |
| 7029 } | 7032 } |
| 7030 | 7033 |
| 7031 error::Error GLES2DecoderImpl::HandleGetAttribLocationImmediate( | 7034 error::Error GLES2DecoderImpl::HandleGetAttribLocationImmediate( |
| 7032 uint32 immediate_data_size, const gles2::GetAttribLocationImmediate& c) { | 7035 uint32 immediate_data_size, const cmds::GetAttribLocationImmediate& c) { |
| 7033 uint32 name_size = c.data_size; | 7036 uint32 name_size = c.data_size; |
| 7034 const char* name = GetImmediateDataAs<const char*>( | 7037 const char* name = GetImmediateDataAs<const char*>( |
| 7035 c, name_size, immediate_data_size); | 7038 c, name_size, immediate_data_size); |
| 7036 if (!name) { | 7039 if (!name) { |
| 7037 return error::kOutOfBounds; | 7040 return error::kOutOfBounds; |
| 7038 } | 7041 } |
| 7039 String name_str(name, name_size); | 7042 String name_str(name, name_size); |
| 7040 return GetAttribLocationHelper( | 7043 return GetAttribLocationHelper( |
| 7041 c.program, c.location_shm_id, c.location_shm_offset, name_str); | 7044 c.program, c.location_shm_id, c.location_shm_offset, name_str); |
| 7042 } | 7045 } |
| 7043 | 7046 |
| 7044 error::Error GLES2DecoderImpl::HandleGetAttribLocationBucket( | 7047 error::Error GLES2DecoderImpl::HandleGetAttribLocationBucket( |
| 7045 uint32 immediate_data_size, const gles2::GetAttribLocationBucket& c) { | 7048 uint32 immediate_data_size, const cmds::GetAttribLocationBucket& c) { |
| 7046 Bucket* bucket = GetBucket(c.name_bucket_id); | 7049 Bucket* bucket = GetBucket(c.name_bucket_id); |
| 7047 if (!bucket) { | 7050 if (!bucket) { |
| 7048 return error::kInvalidArguments; | 7051 return error::kInvalidArguments; |
| 7049 } | 7052 } |
| 7050 std::string name_str; | 7053 std::string name_str; |
| 7051 if (!bucket->GetAsString(&name_str)) { | 7054 if (!bucket->GetAsString(&name_str)) { |
| 7052 return error::kInvalidArguments; | 7055 return error::kInvalidArguments; |
| 7053 } | 7056 } |
| 7054 return GetAttribLocationHelper( | 7057 return GetAttribLocationHelper( |
| 7055 c.program, c.location_shm_id, c.location_shm_offset, name_str); | 7058 c.program, c.location_shm_id, c.location_shm_offset, name_str); |
| 7056 } | 7059 } |
| 7057 | 7060 |
| 7058 error::Error GLES2DecoderImpl::GetUniformLocationHelper( | 7061 error::Error GLES2DecoderImpl::GetUniformLocationHelper( |
| 7059 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, | 7062 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, |
| 7060 const std::string& name_str) { | 7063 const std::string& name_str) { |
| 7061 if (!StringIsValidForGLES(name_str.c_str())) { | 7064 if (!StringIsValidForGLES(name_str.c_str())) { |
| 7062 SetGLError(GL_INVALID_VALUE, "glGetUniformLocation", "Invalid character"); | 7065 SetGLError(GL_INVALID_VALUE, "glGetUniformLocation", "Invalid character"); |
| 7063 return error::kNoError; | 7066 return error::kNoError; |
| 7064 } | 7067 } |
| 7065 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 7068 Program* info = GetProgramInfoNotShader( |
| 7066 client_id, "glUniformLocation"); | 7069 client_id, "glUniformLocation"); |
| 7067 if (!info) { | 7070 if (!info) { |
| 7068 return error::kNoError; | 7071 return error::kNoError; |
| 7069 } | 7072 } |
| 7070 if (!info->IsValid()) { | 7073 if (!info->IsValid()) { |
| 7071 SetGLError( | 7074 SetGLError( |
| 7072 GL_INVALID_OPERATION, "glGetUniformLocation", "program not linked"); | 7075 GL_INVALID_OPERATION, "glGetUniformLocation", "program not linked"); |
| 7073 return error::kNoError; | 7076 return error::kNoError; |
| 7074 } | 7077 } |
| 7075 GLint* location = GetSharedMemoryAs<GLint*>( | 7078 GLint* location = GetSharedMemoryAs<GLint*>( |
| 7076 location_shm_id, location_shm_offset, sizeof(GLint)); | 7079 location_shm_id, location_shm_offset, sizeof(GLint)); |
| 7077 if (!location) { | 7080 if (!location) { |
| 7078 return error::kOutOfBounds; | 7081 return error::kOutOfBounds; |
| 7079 } | 7082 } |
| 7080 // Require the client to init this incase the context is lost an we are no | 7083 // Require the client to init this incase the context is lost an we are no |
| 7081 // longer executing commands. | 7084 // longer executing commands. |
| 7082 if (*location != -1) { | 7085 if (*location != -1) { |
| 7083 return error::kGenericError; | 7086 return error::kGenericError; |
| 7084 } | 7087 } |
| 7085 *location = info->GetUniformFakeLocation(name_str); | 7088 *location = info->GetUniformFakeLocation(name_str); |
| 7086 return error::kNoError; | 7089 return error::kNoError; |
| 7087 } | 7090 } |
| 7088 | 7091 |
| 7089 error::Error GLES2DecoderImpl::HandleGetUniformLocation( | 7092 error::Error GLES2DecoderImpl::HandleGetUniformLocation( |
| 7090 uint32 immediate_data_size, const gles2::GetUniformLocation& c) { | 7093 uint32 immediate_data_size, const cmds::GetUniformLocation& c) { |
| 7091 uint32 name_size = c.data_size; | 7094 uint32 name_size = c.data_size; |
| 7092 const char* name = GetSharedMemoryAs<const char*>( | 7095 const char* name = GetSharedMemoryAs<const char*>( |
| 7093 c.name_shm_id, c.name_shm_offset, name_size); | 7096 c.name_shm_id, c.name_shm_offset, name_size); |
| 7094 if (!name) { | 7097 if (!name) { |
| 7095 return error::kOutOfBounds; | 7098 return error::kOutOfBounds; |
| 7096 } | 7099 } |
| 7097 String name_str(name, name_size); | 7100 String name_str(name, name_size); |
| 7098 return GetUniformLocationHelper( | 7101 return GetUniformLocationHelper( |
| 7099 c.program, c.location_shm_id, c.location_shm_offset, name_str); | 7102 c.program, c.location_shm_id, c.location_shm_offset, name_str); |
| 7100 } | 7103 } |
| 7101 | 7104 |
| 7102 error::Error GLES2DecoderImpl::HandleGetUniformLocationImmediate( | 7105 error::Error GLES2DecoderImpl::HandleGetUniformLocationImmediate( |
| 7103 uint32 immediate_data_size, const gles2::GetUniformLocationImmediate& c) { | 7106 uint32 immediate_data_size, const cmds::GetUniformLocationImmediate& c) { |
| 7104 uint32 name_size = c.data_size; | 7107 uint32 name_size = c.data_size; |
| 7105 const char* name = GetImmediateDataAs<const char*>( | 7108 const char* name = GetImmediateDataAs<const char*>( |
| 7106 c, name_size, immediate_data_size); | 7109 c, name_size, immediate_data_size); |
| 7107 if (!name) { | 7110 if (!name) { |
| 7108 return error::kOutOfBounds; | 7111 return error::kOutOfBounds; |
| 7109 } | 7112 } |
| 7110 String name_str(name, name_size); | 7113 String name_str(name, name_size); |
| 7111 return GetUniformLocationHelper( | 7114 return GetUniformLocationHelper( |
| 7112 c.program, c.location_shm_id, c.location_shm_offset, name_str); | 7115 c.program, c.location_shm_id, c.location_shm_offset, name_str); |
| 7113 } | 7116 } |
| 7114 | 7117 |
| 7115 error::Error GLES2DecoderImpl::HandleGetUniformLocationBucket( | 7118 error::Error GLES2DecoderImpl::HandleGetUniformLocationBucket( |
| 7116 uint32 immediate_data_size, const gles2::GetUniformLocationBucket& c) { | 7119 uint32 immediate_data_size, const cmds::GetUniformLocationBucket& c) { |
| 7117 Bucket* bucket = GetBucket(c.name_bucket_id); | 7120 Bucket* bucket = GetBucket(c.name_bucket_id); |
| 7118 if (!bucket) { | 7121 if (!bucket) { |
| 7119 return error::kInvalidArguments; | 7122 return error::kInvalidArguments; |
| 7120 } | 7123 } |
| 7121 std::string name_str; | 7124 std::string name_str; |
| 7122 if (!bucket->GetAsString(&name_str)) { | 7125 if (!bucket->GetAsString(&name_str)) { |
| 7123 return error::kInvalidArguments; | 7126 return error::kInvalidArguments; |
| 7124 } | 7127 } |
| 7125 return GetUniformLocationHelper( | 7128 return GetUniformLocationHelper( |
| 7126 c.program, c.location_shm_id, c.location_shm_offset, name_str); | 7129 c.program, c.location_shm_id, c.location_shm_offset, name_str); |
| 7127 } | 7130 } |
| 7128 | 7131 |
| 7129 error::Error GLES2DecoderImpl::HandleGetString( | 7132 error::Error GLES2DecoderImpl::HandleGetString( |
| 7130 uint32 immediate_data_size, const gles2::GetString& c) { | 7133 uint32 immediate_data_size, const cmds::GetString& c) { |
| 7131 GLenum name = static_cast<GLenum>(c.name); | 7134 GLenum name = static_cast<GLenum>(c.name); |
| 7132 if (!validators_->string_type.IsValid(name)) { | 7135 if (!validators_->string_type.IsValid(name)) { |
| 7133 SetGLErrorInvalidEnum("glGetString", name, "name"); | 7136 SetGLErrorInvalidEnum("glGetString", name, "name"); |
| 7134 return error::kNoError; | 7137 return error::kNoError; |
| 7135 } | 7138 } |
| 7136 const char* gl_str = reinterpret_cast<const char*>(glGetString(name)); | 7139 const char* gl_str = reinterpret_cast<const char*>(glGetString(name)); |
| 7137 const char* str = NULL; | 7140 const char* str = NULL; |
| 7138 std::string extensions; | 7141 std::string extensions; |
| 7139 switch (name) { | 7142 switch (name) { |
| 7140 case GL_VERSION: | 7143 case GL_VERSION: |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7187 return; | 7190 return; |
| 7188 } | 7191 } |
| 7189 if (!validators_->buffer_usage.IsValid(usage)) { | 7192 if (!validators_->buffer_usage.IsValid(usage)) { |
| 7190 SetGLErrorInvalidEnum("glBufferData", usage, "usage"); | 7193 SetGLErrorInvalidEnum("glBufferData", usage, "usage"); |
| 7191 return; | 7194 return; |
| 7192 } | 7195 } |
| 7193 if (size < 0) { | 7196 if (size < 0) { |
| 7194 SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0"); | 7197 SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0"); |
| 7195 return; | 7198 return; |
| 7196 } | 7199 } |
| 7197 BufferManager::BufferInfo* info = GetBufferInfoForTarget(target); | 7200 BufferManager::Buffer* info = GetBufferInfoForTarget(target); |
| 7198 if (!info) { | 7201 if (!info) { |
| 7199 SetGLError(GL_INVALID_VALUE, "glBufferData", "unknown buffer"); | 7202 SetGLError(GL_INVALID_VALUE, "glBufferData", "unknown buffer"); |
| 7200 return; | 7203 return; |
| 7201 } | 7204 } |
| 7202 | 7205 |
| 7203 if (!EnsureGPUMemoryAvailable(size)) { | 7206 if (!EnsureGPUMemoryAvailable(size)) { |
| 7204 SetGLError(GL_OUT_OF_MEMORY, "glBufferData", "out of memory"); | 7207 SetGLError(GL_OUT_OF_MEMORY, "glBufferData", "out of memory"); |
| 7205 return; | 7208 return; |
| 7206 } | 7209 } |
| 7207 | 7210 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 7218 GLenum error = PeekGLError(); | 7221 GLenum error = PeekGLError(); |
| 7219 if (error == GL_NO_ERROR) { | 7222 if (error == GL_NO_ERROR) { |
| 7220 buffer_manager()->SetInfo(info, size, usage); | 7223 buffer_manager()->SetInfo(info, size, usage); |
| 7221 info->SetRange(0, size, data); | 7224 info->SetRange(0, size, data); |
| 7222 } else { | 7225 } else { |
| 7223 buffer_manager()->SetInfo(info, 0, usage); | 7226 buffer_manager()->SetInfo(info, 0, usage); |
| 7224 } | 7227 } |
| 7225 } | 7228 } |
| 7226 | 7229 |
| 7227 error::Error GLES2DecoderImpl::HandleBufferData( | 7230 error::Error GLES2DecoderImpl::HandleBufferData( |
| 7228 uint32 immediate_data_size, const gles2::BufferData& c) { | 7231 uint32 immediate_data_size, const cmds::BufferData& c) { |
| 7229 GLenum target = static_cast<GLenum>(c.target); | 7232 GLenum target = static_cast<GLenum>(c.target); |
| 7230 GLsizeiptr size = static_cast<GLsizeiptr>(c.size); | 7233 GLsizeiptr size = static_cast<GLsizeiptr>(c.size); |
| 7231 uint32 data_shm_id = static_cast<uint32>(c.data_shm_id); | 7234 uint32 data_shm_id = static_cast<uint32>(c.data_shm_id); |
| 7232 uint32 data_shm_offset = static_cast<uint32>(c.data_shm_offset); | 7235 uint32 data_shm_offset = static_cast<uint32>(c.data_shm_offset); |
| 7233 GLenum usage = static_cast<GLenum>(c.usage); | 7236 GLenum usage = static_cast<GLenum>(c.usage); |
| 7234 const void* data = NULL; | 7237 const void* data = NULL; |
| 7235 if (data_shm_id != 0 || data_shm_offset != 0) { | 7238 if (data_shm_id != 0 || data_shm_offset != 0) { |
| 7236 data = GetSharedMemoryAs<const void*>(data_shm_id, data_shm_offset, size); | 7239 data = GetSharedMemoryAs<const void*>(data_shm_id, data_shm_offset, size); |
| 7237 if (!data) { | 7240 if (!data) { |
| 7238 return error::kOutOfBounds; | 7241 return error::kOutOfBounds; |
| 7239 } | 7242 } |
| 7240 } | 7243 } |
| 7241 DoBufferData(target, size, data, usage); | 7244 DoBufferData(target, size, data, usage); |
| 7242 return error::kNoError; | 7245 return error::kNoError; |
| 7243 } | 7246 } |
| 7244 | 7247 |
| 7245 error::Error GLES2DecoderImpl::HandleBufferDataImmediate( | 7248 error::Error GLES2DecoderImpl::HandleBufferDataImmediate( |
| 7246 uint32 immediate_data_size, const gles2::BufferDataImmediate& c) { | 7249 uint32 immediate_data_size, const cmds::BufferDataImmediate& c) { |
| 7247 GLenum target = static_cast<GLenum>(c.target); | 7250 GLenum target = static_cast<GLenum>(c.target); |
| 7248 GLsizeiptr size = static_cast<GLsizeiptr>(c.size); | 7251 GLsizeiptr size = static_cast<GLsizeiptr>(c.size); |
| 7249 const void* data = GetImmediateDataAs<const void*>( | 7252 const void* data = GetImmediateDataAs<const void*>( |
| 7250 c, size, immediate_data_size); | 7253 c, size, immediate_data_size); |
| 7251 if (!data) { | 7254 if (!data) { |
| 7252 return error::kOutOfBounds; | 7255 return error::kOutOfBounds; |
| 7253 } | 7256 } |
| 7254 GLenum usage = static_cast<GLenum>(c.usage); | 7257 GLenum usage = static_cast<GLenum>(c.usage); |
| 7255 DoBufferData(target, size, data, usage); | 7258 DoBufferData(target, size, data, usage); |
| 7256 return error::kNoError; | 7259 return error::kNoError; |
| 7257 } | 7260 } |
| 7258 | 7261 |
| 7259 void GLES2DecoderImpl::DoBufferSubData( | 7262 void GLES2DecoderImpl::DoBufferSubData( |
| 7260 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { | 7263 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { |
| 7261 BufferManager::BufferInfo* info = GetBufferInfoForTarget(target); | 7264 BufferManager::Buffer* info = GetBufferInfoForTarget(target); |
| 7262 if (!info) { | 7265 if (!info) { |
| 7263 SetGLError(GL_INVALID_VALUE, "glBufferSubData", "unknown buffer"); | 7266 SetGLError(GL_INVALID_VALUE, "glBufferSubData", "unknown buffer"); |
| 7264 return; | 7267 return; |
| 7265 } | 7268 } |
| 7266 if (!info->SetRange(offset, size, data)) { | 7269 if (!info->SetRange(offset, size, data)) { |
| 7267 SetGLError(GL_INVALID_VALUE, "glBufferSubData", "out of range"); | 7270 SetGLError(GL_INVALID_VALUE, "glBufferSubData", "out of range"); |
| 7268 return; | 7271 return; |
| 7269 } | 7272 } |
| 7270 glBufferSubData(target, offset, size, data); | 7273 glBufferSubData(target, offset, size, data); |
| 7271 } | 7274 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 7302 glClearStencil(0); | 7305 glClearStencil(0); |
| 7303 glStencilMask(-1); | 7306 glStencilMask(-1); |
| 7304 glClearDepth(1.0f); | 7307 glClearDepth(1.0f); |
| 7305 glDepthMask(true); | 7308 glDepthMask(true); |
| 7306 glDisable(GL_SCISSOR_TEST); | 7309 glDisable(GL_SCISSOR_TEST); |
| 7307 glClear(GL_DEPTH_BUFFER_BIT | (have_stencil ? GL_STENCIL_BUFFER_BIT : 0)); | 7310 glClear(GL_DEPTH_BUFFER_BIT | (have_stencil ? GL_STENCIL_BUFFER_BIT : 0)); |
| 7308 | 7311 |
| 7309 RestoreClearState(); | 7312 RestoreClearState(); |
| 7310 | 7313 |
| 7311 glDeleteFramebuffersEXT(1, &fb); | 7314 glDeleteFramebuffersEXT(1, &fb); |
| 7312 FramebufferManager::FramebufferInfo* framebuffer = | 7315 Framebuffer* framebuffer = |
| 7313 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); | 7316 GetFramebufferInfoForTarget(GL_DRAW_FRAMEBUFFER_EXT); |
| 7314 GLuint fb_service_id = | 7317 GLuint fb_service_id = |
| 7315 framebuffer ? framebuffer->service_id() : GetBackbufferServiceId(); | 7318 framebuffer ? framebuffer->service_id() : GetBackbufferServiceId(); |
| 7316 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb_service_id); | 7319 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb_service_id); |
| 7317 return true; | 7320 return true; |
| 7318 } | 7321 } |
| 7319 | 7322 |
| 7320 static const uint32 kMaxZeroSize = 1024 * 1024 * 4; | 7323 static const uint32 kMaxZeroSize = 1024 * 1024 * 4; |
| 7321 | 7324 |
| 7322 uint32 size; | 7325 uint32 size; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7357 while (y < height) { | 7360 while (y < height) { |
| 7358 GLint h = y + tile_height > height ? height - y : tile_height; | 7361 GLint h = y + tile_height > height ? height - y : tile_height; |
| 7359 if (is_texture_immutable || h != height) { | 7362 if (is_texture_immutable || h != height) { |
| 7360 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); | 7363 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); |
| 7361 } else { | 7364 } else { |
| 7362 WrappedTexImage2D( | 7365 WrappedTexImage2D( |
| 7363 target, level, format, width, h, 0, format, type, zero.get()); | 7366 target, level, format, width, h, 0, format, type, zero.get()); |
| 7364 } | 7367 } |
| 7365 y += tile_height; | 7368 y += tile_height; |
| 7366 } | 7369 } |
| 7367 TextureManager::TextureInfo* info = GetTextureInfoForTarget(bind_target); | 7370 Texture* info = GetTextureInfoForTarget(bind_target); |
| 7368 glBindTexture(bind_target, info ? info->service_id() : 0); | 7371 glBindTexture(bind_target, info ? info->service_id() : 0); |
| 7369 return true; | 7372 return true; |
| 7370 } | 7373 } |
| 7371 | 7374 |
| 7372 namespace { | 7375 namespace { |
| 7373 | 7376 |
| 7374 const int kS3TCBlockWidth = 4; | 7377 const int kS3TCBlockWidth = 4; |
| 7375 const int kS3TCBlockHeight = 4; | 7378 const int kS3TCBlockHeight = 4; |
| 7376 const int kS3TCDXT1BlockSize = 8; | 7379 const int kS3TCDXT1BlockSize = 8; |
| 7377 const int kS3TCDXT3AndDXT5BlockSize = 16; | 7380 const int kS3TCDXT3AndDXT5BlockSize = 16; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7461 return true; | 7464 return true; |
| 7462 default: | 7465 default: |
| 7463 return false; | 7466 return false; |
| 7464 } | 7467 } |
| 7465 } | 7468 } |
| 7466 | 7469 |
| 7467 bool GLES2DecoderImpl::ValidateCompressedTexSubDimensions( | 7470 bool GLES2DecoderImpl::ValidateCompressedTexSubDimensions( |
| 7468 const char* function_name, | 7471 const char* function_name, |
| 7469 GLenum target, GLint level, GLint xoffset, GLint yoffset, | 7472 GLenum target, GLint level, GLint xoffset, GLint yoffset, |
| 7470 GLsizei width, GLsizei height, GLenum format, | 7473 GLsizei width, GLsizei height, GLenum format, |
| 7471 TextureManager::TextureInfo* texture) { | 7474 Texture* texture) { |
| 7472 if (xoffset < 0 || yoffset < 0) { | 7475 if (xoffset < 0 || yoffset < 0) { |
| 7473 SetGLError( | 7476 SetGLError( |
| 7474 GL_INVALID_VALUE, function_name, "xoffset or yoffset < 0"); | 7477 GL_INVALID_VALUE, function_name, "xoffset or yoffset < 0"); |
| 7475 return false; | 7478 return false; |
| 7476 } | 7479 } |
| 7477 | 7480 |
| 7478 switch (format) { | 7481 switch (format) { |
| 7479 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: | 7482 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: |
| 7480 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: | 7483 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: |
| 7481 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: | 7484 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7530 SetGLErrorInvalidEnum( | 7533 SetGLErrorInvalidEnum( |
| 7531 "glCompressedTexImage2D", internal_format, "internal_format"); | 7534 "glCompressedTexImage2D", internal_format, "internal_format"); |
| 7532 return error::kNoError; | 7535 return error::kNoError; |
| 7533 } | 7536 } |
| 7534 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || | 7537 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || |
| 7535 border != 0) { | 7538 border != 0) { |
| 7536 SetGLError(GL_INVALID_VALUE, | 7539 SetGLError(GL_INVALID_VALUE, |
| 7537 "glCompressedTexImage2D", "dimensions out of range"); | 7540 "glCompressedTexImage2D", "dimensions out of range"); |
| 7538 return error::kNoError; | 7541 return error::kNoError; |
| 7539 } | 7542 } |
| 7540 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 7543 Texture* info = GetTextureInfoForTarget(target); |
| 7541 if (!info) { | 7544 if (!info) { |
| 7542 SetGLError(GL_INVALID_VALUE, | 7545 SetGLError(GL_INVALID_VALUE, |
| 7543 "glCompressedTexImage2D", "unknown texture target"); | 7546 "glCompressedTexImage2D", "unknown texture target"); |
| 7544 return error::kNoError; | 7547 return error::kNoError; |
| 7545 } | 7548 } |
| 7546 if (info->IsImmutable()) { | 7549 if (info->IsImmutable()) { |
| 7547 SetGLError(GL_INVALID_OPERATION, | 7550 SetGLError(GL_INVALID_OPERATION, |
| 7548 "glCompressedTexImage2D", "texture is immutable"); | 7551 "glCompressedTexImage2D", "texture is immutable"); |
| 7549 return error::kNoError; | 7552 return error::kNoError; |
| 7550 } | 7553 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 7580 GLenum error = PeekGLError(); | 7583 GLenum error = PeekGLError(); |
| 7581 if (error == GL_NO_ERROR) { | 7584 if (error == GL_NO_ERROR) { |
| 7582 texture_manager()->SetLevelInfo( | 7585 texture_manager()->SetLevelInfo( |
| 7583 info, target, level, internal_format, width, height, 1, border, 0, 0, | 7586 info, target, level, internal_format, width, height, 1, border, 0, 0, |
| 7584 true); | 7587 true); |
| 7585 } | 7588 } |
| 7586 return error::kNoError; | 7589 return error::kNoError; |
| 7587 } | 7590 } |
| 7588 | 7591 |
| 7589 error::Error GLES2DecoderImpl::HandleCompressedTexImage2D( | 7592 error::Error GLES2DecoderImpl::HandleCompressedTexImage2D( |
| 7590 uint32 immediate_data_size, const gles2::CompressedTexImage2D& c) { | 7593 uint32 immediate_data_size, const cmds::CompressedTexImage2D& c) { |
| 7591 GLenum target = static_cast<GLenum>(c.target); | 7594 GLenum target = static_cast<GLenum>(c.target); |
| 7592 GLint level = static_cast<GLint>(c.level); | 7595 GLint level = static_cast<GLint>(c.level); |
| 7593 GLenum internal_format = static_cast<GLenum>(c.internalformat); | 7596 GLenum internal_format = static_cast<GLenum>(c.internalformat); |
| 7594 GLsizei width = static_cast<GLsizei>(c.width); | 7597 GLsizei width = static_cast<GLsizei>(c.width); |
| 7595 GLsizei height = static_cast<GLsizei>(c.height); | 7598 GLsizei height = static_cast<GLsizei>(c.height); |
| 7596 GLint border = static_cast<GLint>(c.border); | 7599 GLint border = static_cast<GLint>(c.border); |
| 7597 GLsizei image_size = static_cast<GLsizei>(c.imageSize); | 7600 GLsizei image_size = static_cast<GLsizei>(c.imageSize); |
| 7598 uint32 data_shm_id = static_cast<uint32>(c.data_shm_id); | 7601 uint32 data_shm_id = static_cast<uint32>(c.data_shm_id); |
| 7599 uint32 data_shm_offset = static_cast<uint32>(c.data_shm_offset); | 7602 uint32 data_shm_offset = static_cast<uint32>(c.data_shm_offset); |
| 7600 const void* data = NULL; | 7603 const void* data = NULL; |
| 7601 if (data_shm_id != 0 || data_shm_offset != 0) { | 7604 if (data_shm_id != 0 || data_shm_offset != 0) { |
| 7602 data = GetSharedMemoryAs<const void*>( | 7605 data = GetSharedMemoryAs<const void*>( |
| 7603 data_shm_id, data_shm_offset, image_size); | 7606 data_shm_id, data_shm_offset, image_size); |
| 7604 if (!data) { | 7607 if (!data) { |
| 7605 return error::kOutOfBounds; | 7608 return error::kOutOfBounds; |
| 7606 } | 7609 } |
| 7607 } | 7610 } |
| 7608 return DoCompressedTexImage2D( | 7611 return DoCompressedTexImage2D( |
| 7609 target, level, internal_format, width, height, border, image_size, data); | 7612 target, level, internal_format, width, height, border, image_size, data); |
| 7610 } | 7613 } |
| 7611 | 7614 |
| 7612 error::Error GLES2DecoderImpl::HandleCompressedTexImage2DImmediate( | 7615 error::Error GLES2DecoderImpl::HandleCompressedTexImage2DImmediate( |
| 7613 uint32 immediate_data_size, const gles2::CompressedTexImage2DImmediate& c) { | 7616 uint32 immediate_data_size, const cmds::CompressedTexImage2DImmediate& c) { |
| 7614 GLenum target = static_cast<GLenum>(c.target); | 7617 GLenum target = static_cast<GLenum>(c.target); |
| 7615 GLint level = static_cast<GLint>(c.level); | 7618 GLint level = static_cast<GLint>(c.level); |
| 7616 GLenum internal_format = static_cast<GLenum>(c.internalformat); | 7619 GLenum internal_format = static_cast<GLenum>(c.internalformat); |
| 7617 GLsizei width = static_cast<GLsizei>(c.width); | 7620 GLsizei width = static_cast<GLsizei>(c.width); |
| 7618 GLsizei height = static_cast<GLsizei>(c.height); | 7621 GLsizei height = static_cast<GLsizei>(c.height); |
| 7619 GLint border = static_cast<GLint>(c.border); | 7622 GLint border = static_cast<GLint>(c.border); |
| 7620 GLsizei image_size = static_cast<GLsizei>(c.imageSize); | 7623 GLsizei image_size = static_cast<GLsizei>(c.imageSize); |
| 7621 const void* data = GetImmediateDataAs<const void*>( | 7624 const void* data = GetImmediateDataAs<const void*>( |
| 7622 c, image_size, immediate_data_size); | 7625 c, image_size, immediate_data_size); |
| 7623 if (!data) { | 7626 if (!data) { |
| 7624 return error::kOutOfBounds; | 7627 return error::kOutOfBounds; |
| 7625 } | 7628 } |
| 7626 return DoCompressedTexImage2D( | 7629 return DoCompressedTexImage2D( |
| 7627 target, level, internal_format, width, height, border, image_size, data); | 7630 target, level, internal_format, width, height, border, image_size, data); |
| 7628 } | 7631 } |
| 7629 | 7632 |
| 7630 error::Error GLES2DecoderImpl::HandleCompressedTexImage2DBucket( | 7633 error::Error GLES2DecoderImpl::HandleCompressedTexImage2DBucket( |
| 7631 uint32 immediate_data_size, const gles2::CompressedTexImage2DBucket& c) { | 7634 uint32 immediate_data_size, const cmds::CompressedTexImage2DBucket& c) { |
| 7632 GLenum target = static_cast<GLenum>(c.target); | 7635 GLenum target = static_cast<GLenum>(c.target); |
| 7633 GLint level = static_cast<GLint>(c.level); | 7636 GLint level = static_cast<GLint>(c.level); |
| 7634 GLenum internal_format = static_cast<GLenum>(c.internalformat); | 7637 GLenum internal_format = static_cast<GLenum>(c.internalformat); |
| 7635 GLsizei width = static_cast<GLsizei>(c.width); | 7638 GLsizei width = static_cast<GLsizei>(c.width); |
| 7636 GLsizei height = static_cast<GLsizei>(c.height); | 7639 GLsizei height = static_cast<GLsizei>(c.height); |
| 7637 GLint border = static_cast<GLint>(c.border); | 7640 GLint border = static_cast<GLint>(c.border); |
| 7638 Bucket* bucket = GetBucket(c.bucket_id); | 7641 Bucket* bucket = GetBucket(c.bucket_id); |
| 7639 if (!bucket) { | 7642 if (!bucket) { |
| 7640 return error::kInvalidArguments; | 7643 return error::kInvalidArguments; |
| 7641 } | 7644 } |
| 7642 uint32 data_size = bucket->size(); | 7645 uint32 data_size = bucket->size(); |
| 7643 GLsizei imageSize = data_size; | 7646 GLsizei imageSize = data_size; |
| 7644 const void* data = bucket->GetData(0, data_size); | 7647 const void* data = bucket->GetData(0, data_size); |
| 7645 if (!data) { | 7648 if (!data) { |
| 7646 return error::kInvalidArguments; | 7649 return error::kInvalidArguments; |
| 7647 } | 7650 } |
| 7648 return DoCompressedTexImage2D( | 7651 return DoCompressedTexImage2D( |
| 7649 target, level, internal_format, width, height, border, | 7652 target, level, internal_format, width, height, border, |
| 7650 imageSize, data); | 7653 imageSize, data); |
| 7651 } | 7654 } |
| 7652 | 7655 |
| 7653 error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2DBucket( | 7656 error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2DBucket( |
| 7654 uint32 immediate_data_size, | 7657 uint32 immediate_data_size, |
| 7655 const gles2::CompressedTexSubImage2DBucket& c) { | 7658 const cmds::CompressedTexSubImage2DBucket& c) { |
| 7656 GLenum target = static_cast<GLenum>(c.target); | 7659 GLenum target = static_cast<GLenum>(c.target); |
| 7657 GLint level = static_cast<GLint>(c.level); | 7660 GLint level = static_cast<GLint>(c.level); |
| 7658 GLint xoffset = static_cast<GLint>(c.xoffset); | 7661 GLint xoffset = static_cast<GLint>(c.xoffset); |
| 7659 GLint yoffset = static_cast<GLint>(c.yoffset); | 7662 GLint yoffset = static_cast<GLint>(c.yoffset); |
| 7660 GLsizei width = static_cast<GLsizei>(c.width); | 7663 GLsizei width = static_cast<GLsizei>(c.width); |
| 7661 GLsizei height = static_cast<GLsizei>(c.height); | 7664 GLsizei height = static_cast<GLsizei>(c.height); |
| 7662 GLenum format = static_cast<GLenum>(c.format); | 7665 GLenum format = static_cast<GLenum>(c.format); |
| 7663 Bucket* bucket = GetBucket(c.bucket_id); | 7666 Bucket* bucket = GetBucket(c.bucket_id); |
| 7664 if (!bucket) { | 7667 if (!bucket) { |
| 7665 return error::kInvalidArguments; | 7668 return error::kInvalidArguments; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7759 SetGLError(GL_INVALID_VALUE, function_name, "dimensions out of range"); | 7762 SetGLError(GL_INVALID_VALUE, function_name, "dimensions out of range"); |
| 7760 return false; | 7763 return false; |
| 7761 } | 7764 } |
| 7762 if ((GLES2Util::GetChannelsForFormat(format) & | 7765 if ((GLES2Util::GetChannelsForFormat(format) & |
| 7763 (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && pixels) { | 7766 (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && pixels) { |
| 7764 SetGLError( | 7767 SetGLError( |
| 7765 GL_INVALID_OPERATION, | 7768 GL_INVALID_OPERATION, |
| 7766 function_name, "can not supply data for depth or stencil textures"); | 7769 function_name, "can not supply data for depth or stencil textures"); |
| 7767 return false; | 7770 return false; |
| 7768 } | 7771 } |
| 7769 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 7772 Texture* info = GetTextureInfoForTarget(target); |
| 7770 if (!info) { | 7773 if (!info) { |
| 7771 SetGLError(GL_INVALID_OPERATION, | 7774 SetGLError(GL_INVALID_OPERATION, |
| 7772 function_name, "unknown texture for target"); | 7775 function_name, "unknown texture for target"); |
| 7773 return false; | 7776 return false; |
| 7774 } | 7777 } |
| 7775 if (info->IsImmutable()) { | 7778 if (info->IsImmutable()) { |
| 7776 SetGLError(GL_INVALID_OPERATION, | 7779 SetGLError(GL_INVALID_OPERATION, |
| 7777 function_name, "texture is immutable"); | 7780 function_name, "texture is immutable"); |
| 7778 return false; | 7781 return false; |
| 7779 } | 7782 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 7794 if (!ValidateTexImage2D("glTexImage2D", target, level, internal_format, | 7797 if (!ValidateTexImage2D("glTexImage2D", target, level, internal_format, |
| 7795 width, height, border, format, type, pixels, pixels_size)) { | 7798 width, height, border, format, type, pixels, pixels_size)) { |
| 7796 return; | 7799 return; |
| 7797 } | 7800 } |
| 7798 | 7801 |
| 7799 if (!EnsureGPUMemoryAvailable(pixels_size)) { | 7802 if (!EnsureGPUMemoryAvailable(pixels_size)) { |
| 7800 SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory"); | 7803 SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory"); |
| 7801 return; | 7804 return; |
| 7802 } | 7805 } |
| 7803 | 7806 |
| 7804 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 7807 Texture* info = GetTextureInfoForTarget(target); |
| 7805 GLsizei tex_width = 0; | 7808 GLsizei tex_width = 0; |
| 7806 GLsizei tex_height = 0; | 7809 GLsizei tex_height = 0; |
| 7807 GLenum tex_type = 0; | 7810 GLenum tex_type = 0; |
| 7808 GLenum tex_format = 0; | 7811 GLenum tex_format = 0; |
| 7809 bool level_is_same = | 7812 bool level_is_same = |
| 7810 info->GetLevelSize(target, level, &tex_width, &tex_height) && | 7813 info->GetLevelSize(target, level, &tex_width, &tex_height) && |
| 7811 info->GetLevelType(target, level, &tex_type, &tex_format) && | 7814 info->GetLevelType(target, level, &tex_type, &tex_format) && |
| 7812 width == tex_width && height == tex_height && | 7815 width == tex_width && height == tex_height && |
| 7813 type == tex_type && format == tex_format; | 7816 type == tex_type && format == tex_format; |
| 7814 | 7817 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 7845 texture_manager()->SetLevelInfo( | 7848 texture_manager()->SetLevelInfo( |
| 7846 info, | 7849 info, |
| 7847 target, level, internal_format, width, height, 1, border, format, type, | 7850 target, level, internal_format, width, height, 1, border, format, type, |
| 7848 pixels != NULL); | 7851 pixels != NULL); |
| 7849 tex_image_2d_failed_ = false; | 7852 tex_image_2d_failed_ = false; |
| 7850 } | 7853 } |
| 7851 return; | 7854 return; |
| 7852 } | 7855 } |
| 7853 | 7856 |
| 7854 error::Error GLES2DecoderImpl::HandleTexImage2D( | 7857 error::Error GLES2DecoderImpl::HandleTexImage2D( |
| 7855 uint32 immediate_data_size, const gles2::TexImage2D& c) { | 7858 uint32 immediate_data_size, const cmds::TexImage2D& c) { |
| 7856 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexImage2D"); | 7859 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexImage2D"); |
| 7857 tex_image_2d_failed_ = true; | 7860 tex_image_2d_failed_ = true; |
| 7858 GLenum target = static_cast<GLenum>(c.target); | 7861 GLenum target = static_cast<GLenum>(c.target); |
| 7859 GLint level = static_cast<GLint>(c.level); | 7862 GLint level = static_cast<GLint>(c.level); |
| 7860 GLint internal_format = static_cast<GLint>(c.internalformat); | 7863 GLint internal_format = static_cast<GLint>(c.internalformat); |
| 7861 GLsizei width = static_cast<GLsizei>(c.width); | 7864 GLsizei width = static_cast<GLsizei>(c.width); |
| 7862 GLsizei height = static_cast<GLsizei>(c.height); | 7865 GLsizei height = static_cast<GLsizei>(c.height); |
| 7863 GLint border = static_cast<GLint>(c.border); | 7866 GLint border = static_cast<GLint>(c.border); |
| 7864 GLenum format = static_cast<GLenum>(c.format); | 7867 GLenum format = static_cast<GLenum>(c.format); |
| 7865 GLenum type = static_cast<GLenum>(c.type); | 7868 GLenum type = static_cast<GLenum>(c.type); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 7880 } | 7883 } |
| 7881 } | 7884 } |
| 7882 | 7885 |
| 7883 DoTexImage2D( | 7886 DoTexImage2D( |
| 7884 target, level, internal_format, width, height, border, format, type, | 7887 target, level, internal_format, width, height, border, format, type, |
| 7885 pixels, pixels_size); | 7888 pixels, pixels_size); |
| 7886 return error::kNoError; | 7889 return error::kNoError; |
| 7887 } | 7890 } |
| 7888 | 7891 |
| 7889 error::Error GLES2DecoderImpl::HandleTexImage2DImmediate( | 7892 error::Error GLES2DecoderImpl::HandleTexImage2DImmediate( |
| 7890 uint32 immediate_data_size, const gles2::TexImage2DImmediate& c) { | 7893 uint32 immediate_data_size, const cmds::TexImage2DImmediate& c) { |
| 7891 GLenum target = static_cast<GLenum>(c.target); | 7894 GLenum target = static_cast<GLenum>(c.target); |
| 7892 GLint level = static_cast<GLint>(c.level); | 7895 GLint level = static_cast<GLint>(c.level); |
| 7893 GLint internal_format = static_cast<GLint>(c.internalformat); | 7896 GLint internal_format = static_cast<GLint>(c.internalformat); |
| 7894 GLsizei width = static_cast<GLsizei>(c.width); | 7897 GLsizei width = static_cast<GLsizei>(c.width); |
| 7895 GLsizei height = static_cast<GLsizei>(c.height); | 7898 GLsizei height = static_cast<GLsizei>(c.height); |
| 7896 GLint border = static_cast<GLint>(c.border); | 7899 GLint border = static_cast<GLint>(c.border); |
| 7897 GLenum format = static_cast<GLenum>(c.format); | 7900 GLenum format = static_cast<GLenum>(c.format); |
| 7898 GLenum type = static_cast<GLenum>(c.type); | 7901 GLenum type = static_cast<GLenum>(c.type); |
| 7899 uint32 size; | 7902 uint32 size; |
| 7900 if (!GLES2Util::ComputeImageDataSizes( | 7903 if (!GLES2Util::ComputeImageDataSizes( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 7916 void GLES2DecoderImpl::DoCompressedTexSubImage2D( | 7919 void GLES2DecoderImpl::DoCompressedTexSubImage2D( |
| 7917 GLenum target, | 7920 GLenum target, |
| 7918 GLint level, | 7921 GLint level, |
| 7919 GLint xoffset, | 7922 GLint xoffset, |
| 7920 GLint yoffset, | 7923 GLint yoffset, |
| 7921 GLsizei width, | 7924 GLsizei width, |
| 7922 GLsizei height, | 7925 GLsizei height, |
| 7923 GLenum format, | 7926 GLenum format, |
| 7924 GLsizei image_size, | 7927 GLsizei image_size, |
| 7925 const void * data) { | 7928 const void * data) { |
| 7926 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 7929 Texture* info = GetTextureInfoForTarget(target); |
| 7927 if (!info) { | 7930 if (!info) { |
| 7928 SetGLError(GL_INVALID_OPERATION, | 7931 SetGLError(GL_INVALID_OPERATION, |
| 7929 "glCompressedTexSubImage2D", "unknown texture for target"); | 7932 "glCompressedTexSubImage2D", "unknown texture for target"); |
| 7930 return; | 7933 return; |
| 7931 } | 7934 } |
| 7932 GLenum type = 0; | 7935 GLenum type = 0; |
| 7933 GLenum internal_format = 0; | 7936 GLenum internal_format = 0; |
| 7934 if (!info->GetLevelType(target, level, &type, &internal_format)) { | 7937 if (!info->GetLevelType(target, level, &type, &internal_format)) { |
| 7935 SetGLError( | 7938 SetGLError( |
| 7936 GL_INVALID_OPERATION, | 7939 GL_INVALID_OPERATION, |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7987 void GLES2DecoderImpl::DoCopyTexImage2D( | 7990 void GLES2DecoderImpl::DoCopyTexImage2D( |
| 7988 GLenum target, | 7991 GLenum target, |
| 7989 GLint level, | 7992 GLint level, |
| 7990 GLenum internal_format, | 7993 GLenum internal_format, |
| 7991 GLint x, | 7994 GLint x, |
| 7992 GLint y, | 7995 GLint y, |
| 7993 GLsizei width, | 7996 GLsizei width, |
| 7994 GLsizei height, | 7997 GLsizei height, |
| 7995 GLint border) { | 7998 GLint border) { |
| 7996 DCHECK(!ShouldDeferReads()); | 7999 DCHECK(!ShouldDeferReads()); |
| 7997 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 8000 Texture* info = GetTextureInfoForTarget(target); |
| 7998 if (!info) { | 8001 if (!info) { |
| 7999 SetGLError(GL_INVALID_OPERATION, | 8002 SetGLError(GL_INVALID_OPERATION, |
| 8000 "glCopyTexImage2D", "unknown texture for target"); | 8003 "glCopyTexImage2D", "unknown texture for target"); |
| 8001 return; | 8004 return; |
| 8002 } | 8005 } |
| 8003 if (info->IsImmutable()) { | 8006 if (info->IsImmutable()) { |
| 8004 SetGLError(GL_INVALID_OPERATION, | 8007 SetGLError(GL_INVALID_OPERATION, |
| 8005 "glCopyTexImage2D", "texture is immutable"); | 8008 "glCopyTexImage2D", "texture is immutable"); |
| 8006 } | 8009 } |
| 8007 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || | 8010 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8103 void GLES2DecoderImpl::DoCopyTexSubImage2D( | 8106 void GLES2DecoderImpl::DoCopyTexSubImage2D( |
| 8104 GLenum target, | 8107 GLenum target, |
| 8105 GLint level, | 8108 GLint level, |
| 8106 GLint xoffset, | 8109 GLint xoffset, |
| 8107 GLint yoffset, | 8110 GLint yoffset, |
| 8108 GLint x, | 8111 GLint x, |
| 8109 GLint y, | 8112 GLint y, |
| 8110 GLsizei width, | 8113 GLsizei width, |
| 8111 GLsizei height) { | 8114 GLsizei height) { |
| 8112 DCHECK(!ShouldDeferReads()); | 8115 DCHECK(!ShouldDeferReads()); |
| 8113 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 8116 Texture* info = GetTextureInfoForTarget(target); |
| 8114 if (!info) { | 8117 if (!info) { |
| 8115 SetGLError(GL_INVALID_OPERATION, | 8118 SetGLError(GL_INVALID_OPERATION, |
| 8116 "glCopyTexSubImage2D", "unknown texture for target"); | 8119 "glCopyTexSubImage2D", "unknown texture for target"); |
| 8117 return; | 8120 return; |
| 8118 } | 8121 } |
| 8119 GLenum type = 0; | 8122 GLenum type = 0; |
| 8120 GLenum format = 0; | 8123 GLenum format = 0; |
| 8121 if (!info->GetLevelType(target, level, &type, &format) || | 8124 if (!info->GetLevelType(target, level, &type, &format) || |
| 8122 !info->ValidForTexture( | 8125 !info->ValidForTexture( |
| 8123 target, level, xoffset, yoffset, width, height, format, type)) { | 8126 target, level, xoffset, yoffset, width, height, format, type)) { |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8225 return false; | 8228 return false; |
| 8226 } | 8229 } |
| 8227 if (!validators_->texture_format.IsValid(format)) { | 8230 if (!validators_->texture_format.IsValid(format)) { |
| 8228 SetGLErrorInvalidEnum(function_name, format, "format"); | 8231 SetGLErrorInvalidEnum(function_name, format, "format"); |
| 8229 return false; | 8232 return false; |
| 8230 } | 8233 } |
| 8231 if (!validators_->pixel_type.IsValid(type)) { | 8234 if (!validators_->pixel_type.IsValid(type)) { |
| 8232 SetGLErrorInvalidEnum(function_name, type, "type"); | 8235 SetGLErrorInvalidEnum(function_name, type, "type"); |
| 8233 return false; | 8236 return false; |
| 8234 } | 8237 } |
| 8235 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 8238 Texture* info = GetTextureInfoForTarget(target); |
| 8236 if (!info) { | 8239 if (!info) { |
| 8237 SetGLError(GL_INVALID_OPERATION, | 8240 SetGLError(GL_INVALID_OPERATION, |
| 8238 function_name, "unknown texture for target"); | 8241 function_name, "unknown texture for target"); |
| 8239 return false; | 8242 return false; |
| 8240 } | 8243 } |
| 8241 GLenum current_type = 0; | 8244 GLenum current_type = 0; |
| 8242 GLenum internal_format = 0; | 8245 GLenum internal_format = 0; |
| 8243 if (!info->GetLevelType(target, level, ¤t_type, &internal_format)) { | 8246 if (!info->GetLevelType(target, level, ¤t_type, &internal_format)) { |
| 8244 SetGLError( | 8247 SetGLError( |
| 8245 GL_INVALID_OPERATION, function_name, "level does not exist."); | 8248 GL_INVALID_OPERATION, function_name, "level does not exist."); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8287 GLsizei width, | 8290 GLsizei width, |
| 8288 GLsizei height, | 8291 GLsizei height, |
| 8289 GLenum format, | 8292 GLenum format, |
| 8290 GLenum type, | 8293 GLenum type, |
| 8291 const void * data) { | 8294 const void * data) { |
| 8292 error::Error error = error::kNoError; | 8295 error::Error error = error::kNoError; |
| 8293 if (!ValidateTexSubImage2D(&error, "glTexSubImage2D", target, level, | 8296 if (!ValidateTexSubImage2D(&error, "glTexSubImage2D", target, level, |
| 8294 xoffset, yoffset, width, height, format, type, data)) { | 8297 xoffset, yoffset, width, height, format, type, data)) { |
| 8295 return error; | 8298 return error; |
| 8296 } | 8299 } |
| 8297 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 8300 Texture* info = GetTextureInfoForTarget(target); |
| 8298 GLsizei tex_width = 0; | 8301 GLsizei tex_width = 0; |
| 8299 GLsizei tex_height = 0; | 8302 GLsizei tex_height = 0; |
| 8300 bool ok = info->GetLevelSize(target, level, &tex_width, &tex_height); | 8303 bool ok = info->GetLevelSize(target, level, &tex_width, &tex_height); |
| 8301 DCHECK(ok); | 8304 DCHECK(ok); |
| 8302 if (xoffset != 0 || yoffset != 0 || | 8305 if (xoffset != 0 || yoffset != 0 || |
| 8303 width != tex_width || height != tex_height) { | 8306 width != tex_width || height != tex_height) { |
| 8304 if (!texture_manager()->ClearTextureLevel(this, info, target, level)) { | 8307 if (!texture_manager()->ClearTextureLevel(this, info, target, level)) { |
| 8305 SetGLError(GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); | 8308 SetGLError(GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); |
| 8306 return error::kNoError; | 8309 return error::kNoError; |
| 8307 } | 8310 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 8320 } else { | 8323 } else { |
| 8321 ScopedTextureUploadTimer timer(this); | 8324 ScopedTextureUploadTimer timer(this); |
| 8322 glTexSubImage2D( | 8325 glTexSubImage2D( |
| 8323 target, level, xoffset, yoffset, width, height, format, type, data); | 8326 target, level, xoffset, yoffset, width, height, format, type, data); |
| 8324 } | 8327 } |
| 8325 texture_manager()->SetLevelCleared(info, target, level, true); | 8328 texture_manager()->SetLevelCleared(info, target, level, true); |
| 8326 return error::kNoError; | 8329 return error::kNoError; |
| 8327 } | 8330 } |
| 8328 | 8331 |
| 8329 error::Error GLES2DecoderImpl::HandleTexSubImage2D( | 8332 error::Error GLES2DecoderImpl::HandleTexSubImage2D( |
| 8330 uint32 immediate_data_size, const gles2::TexSubImage2D& c) { | 8333 uint32 immediate_data_size, const cmds::TexSubImage2D& c) { |
| 8331 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D"); | 8334 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D"); |
| 8332 GLboolean internal = static_cast<GLboolean>(c.internal); | 8335 GLboolean internal = static_cast<GLboolean>(c.internal); |
| 8333 if (internal == GL_TRUE && tex_image_2d_failed_) | 8336 if (internal == GL_TRUE && tex_image_2d_failed_) |
| 8334 return error::kNoError; | 8337 return error::kNoError; |
| 8335 | 8338 |
| 8336 GLenum target = static_cast<GLenum>(c.target); | 8339 GLenum target = static_cast<GLenum>(c.target); |
| 8337 GLint level = static_cast<GLint>(c.level); | 8340 GLint level = static_cast<GLint>(c.level); |
| 8338 GLint xoffset = static_cast<GLint>(c.xoffset); | 8341 GLint xoffset = static_cast<GLint>(c.xoffset); |
| 8339 GLint yoffset = static_cast<GLint>(c.yoffset); | 8342 GLint yoffset = static_cast<GLint>(c.yoffset); |
| 8340 GLsizei width = static_cast<GLsizei>(c.width); | 8343 GLsizei width = static_cast<GLsizei>(c.width); |
| 8341 GLsizei height = static_cast<GLsizei>(c.height); | 8344 GLsizei height = static_cast<GLsizei>(c.height); |
| 8342 GLenum format = static_cast<GLenum>(c.format); | 8345 GLenum format = static_cast<GLenum>(c.format); |
| 8343 GLenum type = static_cast<GLenum>(c.type); | 8346 GLenum type = static_cast<GLenum>(c.type); |
| 8344 uint32 data_size; | 8347 uint32 data_size; |
| 8345 if (!GLES2Util::ComputeImageDataSizes( | 8348 if (!GLES2Util::ComputeImageDataSizes( |
| 8346 width, height, format, type, state_.unpack_alignment, &data_size, | 8349 width, height, format, type, state_.unpack_alignment, &data_size, |
| 8347 NULL, NULL)) { | 8350 NULL, NULL)) { |
| 8348 return error::kOutOfBounds; | 8351 return error::kOutOfBounds; |
| 8349 } | 8352 } |
| 8350 const void* pixels = GetSharedMemoryAs<const void*>( | 8353 const void* pixels = GetSharedMemoryAs<const void*>( |
| 8351 c.pixels_shm_id, c.pixels_shm_offset, data_size); | 8354 c.pixels_shm_id, c.pixels_shm_offset, data_size); |
| 8352 return DoTexSubImage2D( | 8355 return DoTexSubImage2D( |
| 8353 target, level, xoffset, yoffset, width, height, format, type, pixels); | 8356 target, level, xoffset, yoffset, width, height, format, type, pixels); |
| 8354 } | 8357 } |
| 8355 | 8358 |
| 8356 error::Error GLES2DecoderImpl::HandleTexSubImage2DImmediate( | 8359 error::Error GLES2DecoderImpl::HandleTexSubImage2DImmediate( |
| 8357 uint32 immediate_data_size, const gles2::TexSubImage2DImmediate& c) { | 8360 uint32 immediate_data_size, const cmds::TexSubImage2DImmediate& c) { |
| 8358 GLboolean internal = static_cast<GLboolean>(c.internal); | 8361 GLboolean internal = static_cast<GLboolean>(c.internal); |
| 8359 if (internal == GL_TRUE && tex_image_2d_failed_) | 8362 if (internal == GL_TRUE && tex_image_2d_failed_) |
| 8360 return error::kNoError; | 8363 return error::kNoError; |
| 8361 | 8364 |
| 8362 GLenum target = static_cast<GLenum>(c.target); | 8365 GLenum target = static_cast<GLenum>(c.target); |
| 8363 GLint level = static_cast<GLint>(c.level); | 8366 GLint level = static_cast<GLint>(c.level); |
| 8364 GLint xoffset = static_cast<GLint>(c.xoffset); | 8367 GLint xoffset = static_cast<GLint>(c.xoffset); |
| 8365 GLint yoffset = static_cast<GLint>(c.yoffset); | 8368 GLint yoffset = static_cast<GLint>(c.yoffset); |
| 8366 GLsizei width = static_cast<GLsizei>(c.width); | 8369 GLsizei width = static_cast<GLsizei>(c.width); |
| 8367 GLsizei height = static_cast<GLsizei>(c.height); | 8370 GLsizei height = static_cast<GLsizei>(c.height); |
| 8368 GLenum format = static_cast<GLenum>(c.format); | 8371 GLenum format = static_cast<GLenum>(c.format); |
| 8369 GLenum type = static_cast<GLenum>(c.type); | 8372 GLenum type = static_cast<GLenum>(c.type); |
| 8370 uint32 data_size; | 8373 uint32 data_size; |
| 8371 if (!GLES2Util::ComputeImageDataSizes( | 8374 if (!GLES2Util::ComputeImageDataSizes( |
| 8372 width, height, format, type, state_.unpack_alignment, &data_size, | 8375 width, height, format, type, state_.unpack_alignment, &data_size, |
| 8373 NULL, NULL)) { | 8376 NULL, NULL)) { |
| 8374 return error::kOutOfBounds; | 8377 return error::kOutOfBounds; |
| 8375 } | 8378 } |
| 8376 const void* pixels = GetImmediateDataAs<const void*>( | 8379 const void* pixels = GetImmediateDataAs<const void*>( |
| 8377 c, data_size, immediate_data_size); | 8380 c, data_size, immediate_data_size); |
| 8378 return DoTexSubImage2D( | 8381 return DoTexSubImage2D( |
| 8379 target, level, xoffset, yoffset, width, height, format, type, pixels); | 8382 target, level, xoffset, yoffset, width, height, format, type, pixels); |
| 8380 } | 8383 } |
| 8381 | 8384 |
| 8382 error::Error GLES2DecoderImpl::HandleGetVertexAttribPointerv( | 8385 error::Error GLES2DecoderImpl::HandleGetVertexAttribPointerv( |
| 8383 uint32 immediate_data_size, const gles2::GetVertexAttribPointerv& c) { | 8386 uint32 immediate_data_size, const cmds::GetVertexAttribPointerv& c) { |
| 8384 GLuint index = static_cast<GLuint>(c.index); | 8387 GLuint index = static_cast<GLuint>(c.index); |
| 8385 GLenum pname = static_cast<GLenum>(c.pname); | 8388 GLenum pname = static_cast<GLenum>(c.pname); |
| 8386 typedef gles2::GetVertexAttribPointerv::Result Result; | 8389 typedef cmds::GetVertexAttribPointerv::Result Result; |
| 8387 Result* result = GetSharedMemoryAs<Result*>( | 8390 Result* result = GetSharedMemoryAs<Result*>( |
| 8388 c.pointer_shm_id, c.pointer_shm_offset, Result::ComputeSize(1)); | 8391 c.pointer_shm_id, c.pointer_shm_offset, Result::ComputeSize(1)); |
| 8389 if (!result) { | 8392 if (!result) { |
| 8390 return error::kOutOfBounds; | 8393 return error::kOutOfBounds; |
| 8391 } | 8394 } |
| 8392 // Check that the client initialized the result. | 8395 // Check that the client initialized the result. |
| 8393 if (result->size != 0) { | 8396 if (result->size != 0) { |
| 8394 return error::kInvalidArguments; | 8397 return error::kInvalidArguments; |
| 8395 } | 8398 } |
| 8396 if (!validators_->vertex_pointer.IsValid(pname)) { | 8399 if (!validators_->vertex_pointer.IsValid(pname)) { |
| 8397 SetGLErrorInvalidEnum("glGetVertexAttribPointerv", pname, "pname"); | 8400 SetGLErrorInvalidEnum("glGetVertexAttribPointerv", pname, "pname"); |
| 8398 return error::kNoError; | 8401 return error::kNoError; |
| 8399 } | 8402 } |
| 8400 if (index >= group_->max_vertex_attribs()) { | 8403 if (index >= group_->max_vertex_attribs()) { |
| 8401 SetGLError(GL_INVALID_VALUE, | 8404 SetGLError(GL_INVALID_VALUE, |
| 8402 "glGetVertexAttribPointerv", "index out of range."); | 8405 "glGetVertexAttribPointerv", "index out of range."); |
| 8403 return error::kNoError; | 8406 return error::kNoError; |
| 8404 } | 8407 } |
| 8405 result->SetNumResults(1); | 8408 result->SetNumResults(1); |
| 8406 *result->GetData() = | 8409 *result->GetData() = |
| 8407 state_.vertex_attrib_manager->GetVertexAttribInfo(index)->offset(); | 8410 state_.vertex_attrib_manager->GetVertexAttrib(index)->offset(); |
| 8408 return error::kNoError; | 8411 return error::kNoError; |
| 8409 } | 8412 } |
| 8410 | 8413 |
| 8411 bool GLES2DecoderImpl::GetUniformSetup( | 8414 bool GLES2DecoderImpl::GetUniformSetup( |
| 8412 GLuint program, GLint fake_location, | 8415 GLuint program, GLint fake_location, |
| 8413 uint32 shm_id, uint32 shm_offset, | 8416 uint32 shm_id, uint32 shm_offset, |
| 8414 error::Error* error, GLint* real_location, | 8417 error::Error* error, GLint* real_location, |
| 8415 GLuint* service_id, void** result_pointer, GLenum* result_type) { | 8418 GLuint* service_id, void** result_pointer, GLenum* result_type) { |
| 8416 DCHECK(error); | 8419 DCHECK(error); |
| 8417 DCHECK(service_id); | 8420 DCHECK(service_id); |
| 8418 DCHECK(result_pointer); | 8421 DCHECK(result_pointer); |
| 8419 DCHECK(result_type); | 8422 DCHECK(result_type); |
| 8420 DCHECK(real_location); | 8423 DCHECK(real_location); |
| 8421 *error = error::kNoError; | 8424 *error = error::kNoError; |
| 8422 // Make sure we have enough room for the result on failure. | 8425 // Make sure we have enough room for the result on failure. |
| 8423 SizedResult<GLint>* result; | 8426 SizedResult<GLint>* result; |
| 8424 result = GetSharedMemoryAs<SizedResult<GLint>*>( | 8427 result = GetSharedMemoryAs<SizedResult<GLint>*>( |
| 8425 shm_id, shm_offset, SizedResult<GLint>::ComputeSize(0)); | 8428 shm_id, shm_offset, SizedResult<GLint>::ComputeSize(0)); |
| 8426 if (!result) { | 8429 if (!result) { |
| 8427 *error = error::kOutOfBounds; | 8430 *error = error::kOutOfBounds; |
| 8428 return false; | 8431 return false; |
| 8429 } | 8432 } |
| 8430 *result_pointer = result; | 8433 *result_pointer = result; |
| 8431 // Set the result size to 0 so the client does not have to check for success. | 8434 // Set the result size to 0 so the client does not have to check for success. |
| 8432 result->SetNumResults(0); | 8435 result->SetNumResults(0); |
| 8433 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 8436 Program* info = GetProgramInfoNotShader( |
| 8434 program, "glGetUniform"); | 8437 program, "glGetUniform"); |
| 8435 if (!info) { | 8438 if (!info) { |
| 8436 return false; | 8439 return false; |
| 8437 } | 8440 } |
| 8438 if (!info->IsValid()) { | 8441 if (!info->IsValid()) { |
| 8439 // Program was not linked successfully. (ie, glLinkProgram) | 8442 // Program was not linked successfully. (ie, glLinkProgram) |
| 8440 SetGLError(GL_INVALID_OPERATION, "glGetUniform", "program not linked"); | 8443 SetGLError(GL_INVALID_OPERATION, "glGetUniform", "program not linked"); |
| 8441 return false; | 8444 return false; |
| 8442 } | 8445 } |
| 8443 *service_id = info->service_id(); | 8446 *service_id = info->service_id(); |
| 8444 GLint array_index = -1; | 8447 GLint array_index = -1; |
| 8445 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = | 8448 const Program::UniformInfo* uniform_info = |
| 8446 info->GetUniformInfoByFakeLocation( | 8449 info->GetUniformInfoByFakeLocation( |
| 8447 fake_location, real_location, &array_index); | 8450 fake_location, real_location, &array_index); |
| 8448 if (!uniform_info) { | 8451 if (!uniform_info) { |
| 8449 // No such location. | 8452 // No such location. |
| 8450 SetGLError(GL_INVALID_OPERATION, "glGetUniform", "unknown location"); | 8453 SetGLError(GL_INVALID_OPERATION, "glGetUniform", "unknown location"); |
| 8451 return false; | 8454 return false; |
| 8452 } | 8455 } |
| 8453 GLenum type = uniform_info->type; | 8456 GLenum type = uniform_info->type; |
| 8454 GLsizei size = GLES2Util::GetGLDataTypeSizeForUniforms(type); | 8457 GLsizei size = GLES2Util::GetGLDataTypeSizeForUniforms(type); |
| 8455 if (size == 0) { | 8458 if (size == 0) { |
| 8456 SetGLError(GL_INVALID_OPERATION, "glGetUniform", "unknown type"); | 8459 SetGLError(GL_INVALID_OPERATION, "glGetUniform", "unknown type"); |
| 8457 return false; | 8460 return false; |
| 8458 } | 8461 } |
| 8459 result = GetSharedMemoryAs<SizedResult<GLint>*>( | 8462 result = GetSharedMemoryAs<SizedResult<GLint>*>( |
| 8460 shm_id, shm_offset, SizedResult<GLint>::ComputeSizeFromBytes(size)); | 8463 shm_id, shm_offset, SizedResult<GLint>::ComputeSizeFromBytes(size)); |
| 8461 if (!result) { | 8464 if (!result) { |
| 8462 *error = error::kOutOfBounds; | 8465 *error = error::kOutOfBounds; |
| 8463 return false; | 8466 return false; |
| 8464 } | 8467 } |
| 8465 result->size = size; | 8468 result->size = size; |
| 8466 *result_type = type; | 8469 *result_type = type; |
| 8467 return true; | 8470 return true; |
| 8468 } | 8471 } |
| 8469 | 8472 |
| 8470 error::Error GLES2DecoderImpl::HandleGetUniformiv( | 8473 error::Error GLES2DecoderImpl::HandleGetUniformiv( |
| 8471 uint32 immediate_data_size, const gles2::GetUniformiv& c) { | 8474 uint32 immediate_data_size, const cmds::GetUniformiv& c) { |
| 8472 GLuint program = c.program; | 8475 GLuint program = c.program; |
| 8473 GLint fake_location = c.location; | 8476 GLint fake_location = c.location; |
| 8474 GLuint service_id; | 8477 GLuint service_id; |
| 8475 GLenum result_type; | 8478 GLenum result_type; |
| 8476 GLint real_location = -1; | 8479 GLint real_location = -1; |
| 8477 Error error; | 8480 Error error; |
| 8478 void* result; | 8481 void* result; |
| 8479 if (GetUniformSetup( | 8482 if (GetUniformSetup( |
| 8480 program, fake_location, c.params_shm_id, c.params_shm_offset, | 8483 program, fake_location, c.params_shm_id, c.params_shm_offset, |
| 8481 &error, &real_location, &service_id, &result, &result_type)) { | 8484 &error, &real_location, &service_id, &result, &result_type)) { |
| 8482 glGetUniformiv( | 8485 glGetUniformiv( |
| 8483 service_id, real_location, | 8486 service_id, real_location, |
| 8484 static_cast<gles2::GetUniformiv::Result*>(result)->GetData()); | 8487 static_cast<cmds::GetUniformiv::Result*>(result)->GetData()); |
| 8485 } | 8488 } |
| 8486 return error; | 8489 return error; |
| 8487 } | 8490 } |
| 8488 | 8491 |
| 8489 error::Error GLES2DecoderImpl::HandleGetUniformfv( | 8492 error::Error GLES2DecoderImpl::HandleGetUniformfv( |
| 8490 uint32 immediate_data_size, const gles2::GetUniformfv& c) { | 8493 uint32 immediate_data_size, const cmds::GetUniformfv& c) { |
| 8491 GLuint program = c.program; | 8494 GLuint program = c.program; |
| 8492 GLint fake_location = c.location; | 8495 GLint fake_location = c.location; |
| 8493 GLuint service_id; | 8496 GLuint service_id; |
| 8494 GLint real_location = -1; | 8497 GLint real_location = -1; |
| 8495 Error error; | 8498 Error error; |
| 8496 typedef gles2::GetUniformfv::Result Result; | 8499 typedef cmds::GetUniformfv::Result Result; |
| 8497 Result* result; | 8500 Result* result; |
| 8498 GLenum result_type; | 8501 GLenum result_type; |
| 8499 if (GetUniformSetup( | 8502 if (GetUniformSetup( |
| 8500 program, fake_location, c.params_shm_id, c.params_shm_offset, | 8503 program, fake_location, c.params_shm_id, c.params_shm_offset, |
| 8501 &error, &real_location, &service_id, | 8504 &error, &real_location, &service_id, |
| 8502 reinterpret_cast<void**>(&result), &result_type)) { | 8505 reinterpret_cast<void**>(&result), &result_type)) { |
| 8503 if (result_type == GL_BOOL || result_type == GL_BOOL_VEC2 || | 8506 if (result_type == GL_BOOL || result_type == GL_BOOL_VEC2 || |
| 8504 result_type == GL_BOOL_VEC3 || result_type == GL_BOOL_VEC4) { | 8507 result_type == GL_BOOL_VEC3 || result_type == GL_BOOL_VEC4) { |
| 8505 GLsizei num_values = result->GetNumResults(); | 8508 GLsizei num_values = result->GetNumResults(); |
| 8506 scoped_array<GLint> temp(new GLint[num_values]); | 8509 scoped_array<GLint> temp(new GLint[num_values]); |
| 8507 glGetUniformiv(service_id, real_location, temp.get()); | 8510 glGetUniformiv(service_id, real_location, temp.get()); |
| 8508 GLfloat* dst = result->GetData(); | 8511 GLfloat* dst = result->GetData(); |
| 8509 for (GLsizei ii = 0; ii < num_values; ++ii) { | 8512 for (GLsizei ii = 0; ii < num_values; ++ii) { |
| 8510 dst[ii] = (temp[ii] != 0); | 8513 dst[ii] = (temp[ii] != 0); |
| 8511 } | 8514 } |
| 8512 } else { | 8515 } else { |
| 8513 glGetUniformfv(service_id, real_location, result->GetData()); | 8516 glGetUniformfv(service_id, real_location, result->GetData()); |
| 8514 } | 8517 } |
| 8515 } | 8518 } |
| 8516 return error; | 8519 return error; |
| 8517 } | 8520 } |
| 8518 | 8521 |
| 8519 error::Error GLES2DecoderImpl::HandleGetShaderPrecisionFormat( | 8522 error::Error GLES2DecoderImpl::HandleGetShaderPrecisionFormat( |
| 8520 uint32 immediate_data_size, const gles2::GetShaderPrecisionFormat& c) { | 8523 uint32 immediate_data_size, const cmds::GetShaderPrecisionFormat& c) { |
| 8521 GLenum shader_type = static_cast<GLenum>(c.shadertype); | 8524 GLenum shader_type = static_cast<GLenum>(c.shadertype); |
| 8522 GLenum precision_type = static_cast<GLenum>(c.precisiontype); | 8525 GLenum precision_type = static_cast<GLenum>(c.precisiontype); |
| 8523 typedef gles2::GetShaderPrecisionFormat::Result Result; | 8526 typedef cmds::GetShaderPrecisionFormat::Result Result; |
| 8524 Result* result = GetSharedMemoryAs<Result*>( | 8527 Result* result = GetSharedMemoryAs<Result*>( |
| 8525 c.result_shm_id, c.result_shm_offset, sizeof(*result)); | 8528 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
| 8526 if (!result) { | 8529 if (!result) { |
| 8527 return error::kOutOfBounds; | 8530 return error::kOutOfBounds; |
| 8528 } | 8531 } |
| 8529 // Check that the client initialized the result. | 8532 // Check that the client initialized the result. |
| 8530 if (result->success != 0) { | 8533 if (result->success != 0) { |
| 8531 return error::kInvalidArguments; | 8534 return error::kInvalidArguments; |
| 8532 } | 8535 } |
| 8533 if (!validators_->shader_type.IsValid(shader_type)) { | 8536 if (!validators_->shader_type.IsValid(shader_type)) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 8560 result->precision = 23; | 8563 result->precision = 23; |
| 8561 break; | 8564 break; |
| 8562 default: | 8565 default: |
| 8563 NOTREACHED(); | 8566 NOTREACHED(); |
| 8564 break; | 8567 break; |
| 8565 } | 8568 } |
| 8566 return error::kNoError; | 8569 return error::kNoError; |
| 8567 } | 8570 } |
| 8568 | 8571 |
| 8569 error::Error GLES2DecoderImpl::HandleGetAttachedShaders( | 8572 error::Error GLES2DecoderImpl::HandleGetAttachedShaders( |
| 8570 uint32 immediate_data_size, const gles2::GetAttachedShaders& c) { | 8573 uint32 immediate_data_size, const cmds::GetAttachedShaders& c) { |
| 8571 uint32 result_size = c.result_size; | 8574 uint32 result_size = c.result_size; |
| 8572 GLuint program = static_cast<GLuint>(c.program); | 8575 GLuint program = static_cast<GLuint>(c.program); |
| 8573 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 8576 Program* info = GetProgramInfoNotShader( |
| 8574 program, "glGetAttachedShaders"); | 8577 program, "glGetAttachedShaders"); |
| 8575 if (!info) { | 8578 if (!info) { |
| 8576 return error::kNoError; | 8579 return error::kNoError; |
| 8577 } | 8580 } |
| 8578 typedef gles2::GetAttachedShaders::Result Result; | 8581 typedef cmds::GetAttachedShaders::Result Result; |
| 8579 uint32 max_count = Result::ComputeMaxResults(result_size); | 8582 uint32 max_count = Result::ComputeMaxResults(result_size); |
| 8580 Result* result = GetSharedMemoryAs<Result*>( | 8583 Result* result = GetSharedMemoryAs<Result*>( |
| 8581 c.result_shm_id, c.result_shm_offset, Result::ComputeSize(max_count)); | 8584 c.result_shm_id, c.result_shm_offset, Result::ComputeSize(max_count)); |
| 8582 if (!result) { | 8585 if (!result) { |
| 8583 return error::kOutOfBounds; | 8586 return error::kOutOfBounds; |
| 8584 } | 8587 } |
| 8585 // Check that the client initialized the result. | 8588 // Check that the client initialized the result. |
| 8586 if (result->size != 0) { | 8589 if (result->size != 0) { |
| 8587 return error::kInvalidArguments; | 8590 return error::kInvalidArguments; |
| 8588 } | 8591 } |
| 8589 GLsizei count = 0; | 8592 GLsizei count = 0; |
| 8590 glGetAttachedShaders( | 8593 glGetAttachedShaders( |
| 8591 info->service_id(), max_count, &count, result->GetData()); | 8594 info->service_id(), max_count, &count, result->GetData()); |
| 8592 for (GLsizei ii = 0; ii < count; ++ii) { | 8595 for (GLsizei ii = 0; ii < count; ++ii) { |
| 8593 if (!shader_manager()->GetClientId(result->GetData()[ii], | 8596 if (!shader_manager()->GetClientId(result->GetData()[ii], |
| 8594 &result->GetData()[ii])) { | 8597 &result->GetData()[ii])) { |
| 8595 NOTREACHED(); | 8598 NOTREACHED(); |
| 8596 return error::kGenericError; | 8599 return error::kGenericError; |
| 8597 } | 8600 } |
| 8598 } | 8601 } |
| 8599 result->SetNumResults(count); | 8602 result->SetNumResults(count); |
| 8600 return error::kNoError; | 8603 return error::kNoError; |
| 8601 } | 8604 } |
| 8602 | 8605 |
| 8603 error::Error GLES2DecoderImpl::HandleGetActiveUniform( | 8606 error::Error GLES2DecoderImpl::HandleGetActiveUniform( |
| 8604 uint32 immediate_data_size, const gles2::GetActiveUniform& c) { | 8607 uint32 immediate_data_size, const cmds::GetActiveUniform& c) { |
| 8605 GLuint program = c.program; | 8608 GLuint program = c.program; |
| 8606 GLuint index = c.index; | 8609 GLuint index = c.index; |
| 8607 uint32 name_bucket_id = c.name_bucket_id; | 8610 uint32 name_bucket_id = c.name_bucket_id; |
| 8608 typedef gles2::GetActiveUniform::Result Result; | 8611 typedef cmds::GetActiveUniform::Result Result; |
| 8609 Result* result = GetSharedMemoryAs<Result*>( | 8612 Result* result = GetSharedMemoryAs<Result*>( |
| 8610 c.result_shm_id, c.result_shm_offset, sizeof(*result)); | 8613 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
| 8611 if (!result) { | 8614 if (!result) { |
| 8612 return error::kOutOfBounds; | 8615 return error::kOutOfBounds; |
| 8613 } | 8616 } |
| 8614 // Check that the client initialized the result. | 8617 // Check that the client initialized the result. |
| 8615 if (result->success != 0) { | 8618 if (result->success != 0) { |
| 8616 return error::kInvalidArguments; | 8619 return error::kInvalidArguments; |
| 8617 } | 8620 } |
| 8618 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 8621 Program* info = GetProgramInfoNotShader( |
| 8619 program, "glGetActiveUniform"); | 8622 program, "glGetActiveUniform"); |
| 8620 if (!info) { | 8623 if (!info) { |
| 8621 return error::kNoError; | 8624 return error::kNoError; |
| 8622 } | 8625 } |
| 8623 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = | 8626 const Program::UniformInfo* uniform_info = |
| 8624 info->GetUniformInfo(index); | 8627 info->GetUniformInfo(index); |
| 8625 if (!uniform_info) { | 8628 if (!uniform_info) { |
| 8626 SetGLError(GL_INVALID_VALUE, "glGetActiveUniform", "index out of range"); | 8629 SetGLError(GL_INVALID_VALUE, "glGetActiveUniform", "index out of range"); |
| 8627 return error::kNoError; | 8630 return error::kNoError; |
| 8628 } | 8631 } |
| 8629 result->success = 1; // true. | 8632 result->success = 1; // true. |
| 8630 result->size = uniform_info->size; | 8633 result->size = uniform_info->size; |
| 8631 result->type = uniform_info->type; | 8634 result->type = uniform_info->type; |
| 8632 Bucket* bucket = CreateBucket(name_bucket_id); | 8635 Bucket* bucket = CreateBucket(name_bucket_id); |
| 8633 bucket->SetFromString(uniform_info->name.c_str()); | 8636 bucket->SetFromString(uniform_info->name.c_str()); |
| 8634 return error::kNoError; | 8637 return error::kNoError; |
| 8635 } | 8638 } |
| 8636 | 8639 |
| 8637 error::Error GLES2DecoderImpl::HandleGetActiveAttrib( | 8640 error::Error GLES2DecoderImpl::HandleGetActiveAttrib( |
| 8638 uint32 immediate_data_size, const gles2::GetActiveAttrib& c) { | 8641 uint32 immediate_data_size, const cmds::GetActiveAttrib& c) { |
| 8639 GLuint program = c.program; | 8642 GLuint program = c.program; |
| 8640 GLuint index = c.index; | 8643 GLuint index = c.index; |
| 8641 uint32 name_bucket_id = c.name_bucket_id; | 8644 uint32 name_bucket_id = c.name_bucket_id; |
| 8642 typedef gles2::GetActiveAttrib::Result Result; | 8645 typedef cmds::GetActiveAttrib::Result Result; |
| 8643 Result* result = GetSharedMemoryAs<Result*>( | 8646 Result* result = GetSharedMemoryAs<Result*>( |
| 8644 c.result_shm_id, c.result_shm_offset, sizeof(*result)); | 8647 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
| 8645 if (!result) { | 8648 if (!result) { |
| 8646 return error::kOutOfBounds; | 8649 return error::kOutOfBounds; |
| 8647 } | 8650 } |
| 8648 // Check that the client initialized the result. | 8651 // Check that the client initialized the result. |
| 8649 if (result->success != 0) { | 8652 if (result->success != 0) { |
| 8650 return error::kInvalidArguments; | 8653 return error::kInvalidArguments; |
| 8651 } | 8654 } |
| 8652 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( | 8655 Program* info = GetProgramInfoNotShader( |
| 8653 program, "glGetActiveAttrib"); | 8656 program, "glGetActiveAttrib"); |
| 8654 if (!info) { | 8657 if (!info) { |
| 8655 return error::kNoError; | 8658 return error::kNoError; |
| 8656 } | 8659 } |
| 8657 const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = | 8660 const Program::VertexAttrib* attrib_info = |
| 8658 info->GetAttribInfo(index); | 8661 info->GetAttribInfo(index); |
| 8659 if (!attrib_info) { | 8662 if (!attrib_info) { |
| 8660 SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib", "index out of range"); | 8663 SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib", "index out of range"); |
| 8661 return error::kNoError; | 8664 return error::kNoError; |
| 8662 } | 8665 } |
| 8663 result->success = 1; // true. | 8666 result->success = 1; // true. |
| 8664 result->size = attrib_info->size; | 8667 result->size = attrib_info->size; |
| 8665 result->type = attrib_info->type; | 8668 result->type = attrib_info->type; |
| 8666 Bucket* bucket = CreateBucket(name_bucket_id); | 8669 Bucket* bucket = CreateBucket(name_bucket_id); |
| 8667 bucket->SetFromString(attrib_info->name.c_str()); | 8670 bucket->SetFromString(attrib_info->name.c_str()); |
| 8668 return error::kNoError; | 8671 return error::kNoError; |
| 8669 } | 8672 } |
| 8670 | 8673 |
| 8671 error::Error GLES2DecoderImpl::HandleShaderBinary( | 8674 error::Error GLES2DecoderImpl::HandleShaderBinary( |
| 8672 uint32 immediate_data_size, const gles2::ShaderBinary& c) { | 8675 uint32 immediate_data_size, const cmds::ShaderBinary& c) { |
| 8673 #if 1 // No binary shader support. | 8676 #if 1 // No binary shader support. |
| 8674 SetGLError(GL_INVALID_OPERATION, "glShaderBinary", "not supported"); | 8677 SetGLError(GL_INVALID_OPERATION, "glShaderBinary", "not supported"); |
| 8675 return error::kNoError; | 8678 return error::kNoError; |
| 8676 #else | 8679 #else |
| 8677 GLsizei n = static_cast<GLsizei>(c.n); | 8680 GLsizei n = static_cast<GLsizei>(c.n); |
| 8678 if (n < 0) { | 8681 if (n < 0) { |
| 8679 SetGLError(GL_INVALID_VALUE, "glShaderBinary", "n < 0"); | 8682 SetGLError(GL_INVALID_VALUE, "glShaderBinary", "n < 0"); |
| 8680 return error::kNoError; | 8683 return error::kNoError; |
| 8681 } | 8684 } |
| 8682 GLsizei length = static_cast<GLsizei>(c.length); | 8685 GLsizei length = static_cast<GLsizei>(c.length); |
| 8683 if (length < 0) { | 8686 if (length < 0) { |
| 8684 SetGLError(GL_INVALID_VALUE, "glShaderBinary", "length < 0"); | 8687 SetGLError(GL_INVALID_VALUE, "glShaderBinary", "length < 0"); |
| 8685 return error::kNoError; | 8688 return error::kNoError; |
| 8686 } | 8689 } |
| 8687 uint32 data_size; | 8690 uint32 data_size; |
| 8688 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { | 8691 if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { |
| 8689 return error::kOutOfBounds; | 8692 return error::kOutOfBounds; |
| 8690 } | 8693 } |
| 8691 const GLuint* shaders = GetSharedMemoryAs<const GLuint*>( | 8694 const GLuint* shaders = GetSharedMemoryAs<const GLuint*>( |
| 8692 c.shaders_shm_id, c.shaders_shm_offset, data_size); | 8695 c.shaders_shm_id, c.shaders_shm_offset, data_size); |
| 8693 GLenum binaryformat = static_cast<GLenum>(c.binaryformat); | 8696 GLenum binaryformat = static_cast<GLenum>(c.binaryformat); |
| 8694 const void* binary = GetSharedMemoryAs<const void*>( | 8697 const void* binary = GetSharedMemoryAs<const void*>( |
| 8695 c.binary_shm_id, c.binary_shm_offset, length); | 8698 c.binary_shm_id, c.binary_shm_offset, length); |
| 8696 if (shaders == NULL || binary == NULL) { | 8699 if (shaders == NULL || binary == NULL) { |
| 8697 return error::kOutOfBounds; | 8700 return error::kOutOfBounds; |
| 8698 } | 8701 } |
| 8699 scoped_array<GLuint> service_ids(new GLuint[n]); | 8702 scoped_array<GLuint> service_ids(new GLuint[n]); |
| 8700 for (GLsizei ii = 0; ii < n; ++ii) { | 8703 for (GLsizei ii = 0; ii < n; ++ii) { |
| 8701 ShaderManager::ShaderInfo* info = GetShaderInfo(shaders[ii]); | 8704 Shader* info = GetShader(shaders[ii]); |
| 8702 if (!info) { | 8705 if (!info) { |
| 8703 SetGLError(GL_INVALID_VALUE, "glShaderBinary", "unknown shader"); | 8706 SetGLError(GL_INVALID_VALUE, "glShaderBinary", "unknown shader"); |
| 8704 return error::kNoError; | 8707 return error::kNoError; |
| 8705 } | 8708 } |
| 8706 service_ids[ii] = info->service_id(); | 8709 service_ids[ii] = info->service_id(); |
| 8707 } | 8710 } |
| 8708 // TODO(gman): call glShaderBinary | 8711 // TODO(gman): call glShaderBinary |
| 8709 return error::kNoError; | 8712 return error::kNoError; |
| 8710 #endif | 8713 #endif |
| 8711 } | 8714 } |
| 8712 | 8715 |
| 8713 error::Error GLES2DecoderImpl::HandleSwapBuffers( | 8716 error::Error GLES2DecoderImpl::HandleSwapBuffers( |
| 8714 uint32 immediate_data_size, const gles2::SwapBuffers& c) { | 8717 uint32 immediate_data_size, const cmds::SwapBuffers& c) { |
| 8715 bool is_offscreen = !!offscreen_target_frame_buffer_.get(); | 8718 bool is_offscreen = !!offscreen_target_frame_buffer_.get(); |
| 8716 | 8719 |
| 8717 int this_frame_number = frame_number_++; | 8720 int this_frame_number = frame_number_++; |
| 8718 // TRACE_EVENT for gpu tests: | 8721 // TRACE_EVENT for gpu tests: |
| 8719 TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffersLatency", | 8722 TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffersLatency", |
| 8720 "GLImpl", static_cast<int>(gfx::GetGLImplementation()), | 8723 "GLImpl", static_cast<int>(gfx::GetGLImplementation()), |
| 8721 "width", (is_offscreen ? offscreen_size_.width() : | 8724 "width", (is_offscreen ? offscreen_size_.width() : |
| 8722 surface_->GetSize().width())); | 8725 surface_->GetSize().width())); |
| 8723 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleSwapBuffers", | 8726 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleSwapBuffers", |
| 8724 "offscreen", is_offscreen, | 8727 "offscreen", is_offscreen, |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8810 if (!surface_->SwapBuffers()) { | 8813 if (!surface_->SwapBuffers()) { |
| 8811 LOG(ERROR) << "Context lost because SwapBuffers failed."; | 8814 LOG(ERROR) << "Context lost because SwapBuffers failed."; |
| 8812 return error::kLostContext; | 8815 return error::kLostContext; |
| 8813 } | 8816 } |
| 8814 } | 8817 } |
| 8815 | 8818 |
| 8816 return error::kNoError; | 8819 return error::kNoError; |
| 8817 } | 8820 } |
| 8818 | 8821 |
| 8819 error::Error GLES2DecoderImpl::HandleEnableFeatureCHROMIUM( | 8822 error::Error GLES2DecoderImpl::HandleEnableFeatureCHROMIUM( |
| 8820 uint32 immediate_data_size, const gles2::EnableFeatureCHROMIUM& c) { | 8823 uint32 immediate_data_size, const cmds::EnableFeatureCHROMIUM& c) { |
| 8821 Bucket* bucket = GetBucket(c.bucket_id); | 8824 Bucket* bucket = GetBucket(c.bucket_id); |
| 8822 if (!bucket || bucket->size() == 0) { | 8825 if (!bucket || bucket->size() == 0) { |
| 8823 return error::kInvalidArguments; | 8826 return error::kInvalidArguments; |
| 8824 } | 8827 } |
| 8825 typedef gles2::EnableFeatureCHROMIUM::Result Result; | 8828 typedef cmds::EnableFeatureCHROMIUM::Result Result; |
| 8826 Result* result = GetSharedMemoryAs<Result*>( | 8829 Result* result = GetSharedMemoryAs<Result*>( |
| 8827 c.result_shm_id, c.result_shm_offset, sizeof(*result)); | 8830 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
| 8828 if (!result) { | 8831 if (!result) { |
| 8829 return error::kOutOfBounds; | 8832 return error::kOutOfBounds; |
| 8830 } | 8833 } |
| 8831 // Check that the client initialized the result. | 8834 // Check that the client initialized the result. |
| 8832 if (*result != 0) { | 8835 if (*result != 0) { |
| 8833 return error::kInvalidArguments; | 8836 return error::kInvalidArguments; |
| 8834 } | 8837 } |
| 8835 std::string feature_str; | 8838 std::string feature_str; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 8858 } else { | 8861 } else { |
| 8859 return error::kNoError; | 8862 return error::kNoError; |
| 8860 } | 8863 } |
| 8861 | 8864 |
| 8862 *result = 1; // true. | 8865 *result = 1; // true. |
| 8863 return error::kNoError; | 8866 return error::kNoError; |
| 8864 } | 8867 } |
| 8865 | 8868 |
| 8866 error::Error GLES2DecoderImpl::HandleGetRequestableExtensionsCHROMIUM( | 8869 error::Error GLES2DecoderImpl::HandleGetRequestableExtensionsCHROMIUM( |
| 8867 uint32 immediate_data_size, | 8870 uint32 immediate_data_size, |
| 8868 const gles2::GetRequestableExtensionsCHROMIUM& c) { | 8871 const cmds::GetRequestableExtensionsCHROMIUM& c) { |
| 8869 Bucket* bucket = CreateBucket(c.bucket_id); | 8872 Bucket* bucket = CreateBucket(c.bucket_id); |
| 8870 FeatureInfo::Ref info(new FeatureInfo()); | 8873 scoped_refptr<FeatureInfo> info(new FeatureInfo()); |
| 8871 info->Initialize(disallowed_features_, NULL); | 8874 info->Initialize(disallowed_features_, NULL); |
| 8872 bucket->SetFromString(info->extensions().c_str()); | 8875 bucket->SetFromString(info->extensions().c_str()); |
| 8873 return error::kNoError; | 8876 return error::kNoError; |
| 8874 } | 8877 } |
| 8875 | 8878 |
| 8876 error::Error GLES2DecoderImpl::HandleRequestExtensionCHROMIUM( | 8879 error::Error GLES2DecoderImpl::HandleRequestExtensionCHROMIUM( |
| 8877 uint32 immediate_data_size, const gles2::RequestExtensionCHROMIUM& c) { | 8880 uint32 immediate_data_size, const cmds::RequestExtensionCHROMIUM& c) { |
| 8878 Bucket* bucket = GetBucket(c.bucket_id); | 8881 Bucket* bucket = GetBucket(c.bucket_id); |
| 8879 if (!bucket || bucket->size() == 0) { | 8882 if (!bucket || bucket->size() == 0) { |
| 8880 return error::kInvalidArguments; | 8883 return error::kInvalidArguments; |
| 8881 } | 8884 } |
| 8882 std::string feature_str; | 8885 std::string feature_str; |
| 8883 if (!bucket->GetAsString(&feature_str)) { | 8886 if (!bucket->GetAsString(&feature_str)) { |
| 8884 return error::kInvalidArguments; | 8887 return error::kInvalidArguments; |
| 8885 } | 8888 } |
| 8886 | 8889 |
| 8887 bool desire_webgl_glsl_validation = | 8890 bool desire_webgl_glsl_validation = |
| (...skipping 10 matching lines...) Expand all Loading... |
| 8898 derivatives_explicitly_enabled_ = desire_standard_derivatives; | 8901 derivatives_explicitly_enabled_ = desire_standard_derivatives; |
| 8899 InitializeShaderTranslator(); | 8902 InitializeShaderTranslator(); |
| 8900 } | 8903 } |
| 8901 | 8904 |
| 8902 UpdateCapabilities(); | 8905 UpdateCapabilities(); |
| 8903 | 8906 |
| 8904 return error::kNoError; | 8907 return error::kNoError; |
| 8905 } | 8908 } |
| 8906 | 8909 |
| 8907 error::Error GLES2DecoderImpl::HandleGetMultipleIntegervCHROMIUM( | 8910 error::Error GLES2DecoderImpl::HandleGetMultipleIntegervCHROMIUM( |
| 8908 uint32 immediate_data_size, const gles2::GetMultipleIntegervCHROMIUM& c) { | 8911 uint32 immediate_data_size, const cmds::GetMultipleIntegervCHROMIUM& c) { |
| 8909 GLuint count = c.count; | 8912 GLuint count = c.count; |
| 8910 uint32 pnames_size; | 8913 uint32 pnames_size; |
| 8911 if (!SafeMultiplyUint32(count, sizeof(GLenum), &pnames_size)) { | 8914 if (!SafeMultiplyUint32(count, sizeof(GLenum), &pnames_size)) { |
| 8912 return error::kOutOfBounds; | 8915 return error::kOutOfBounds; |
| 8913 } | 8916 } |
| 8914 const GLenum* pnames = GetSharedMemoryAs<const GLenum*>( | 8917 const GLenum* pnames = GetSharedMemoryAs<const GLenum*>( |
| 8915 c.pnames_shm_id, c.pnames_shm_offset, pnames_size); | 8918 c.pnames_shm_id, c.pnames_shm_offset, pnames_size); |
| 8916 if (pnames == NULL) { | 8919 if (pnames == NULL) { |
| 8917 return error::kOutOfBounds; | 8920 return error::kOutOfBounds; |
| 8918 } | 8921 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8975 | 8978 |
| 8976 // Just to verify. Should this be a DCHECK? | 8979 // Just to verify. Should this be a DCHECK? |
| 8977 if (static_cast<uint32>(results - start) != num_results) { | 8980 if (static_cast<uint32>(results - start) != num_results) { |
| 8978 return error::kOutOfBounds; | 8981 return error::kOutOfBounds; |
| 8979 } | 8982 } |
| 8980 | 8983 |
| 8981 return error::kNoError; | 8984 return error::kNoError; |
| 8982 } | 8985 } |
| 8983 | 8986 |
| 8984 error::Error GLES2DecoderImpl::HandleGetProgramInfoCHROMIUM( | 8987 error::Error GLES2DecoderImpl::HandleGetProgramInfoCHROMIUM( |
| 8985 uint32 immediate_data_size, const gles2::GetProgramInfoCHROMIUM& c) { | 8988 uint32 immediate_data_size, const cmds::GetProgramInfoCHROMIUM& c) { |
| 8986 GLuint program = static_cast<GLuint>(c.program); | 8989 GLuint program = static_cast<GLuint>(c.program); |
| 8987 uint32 bucket_id = c.bucket_id; | 8990 uint32 bucket_id = c.bucket_id; |
| 8988 Bucket* bucket = CreateBucket(bucket_id); | 8991 Bucket* bucket = CreateBucket(bucket_id); |
| 8989 bucket->SetSize(sizeof(ProgramInfoHeader)); // in case we fail. | 8992 bucket->SetSize(sizeof(ProgramInfoHeader)); // in case we fail. |
| 8990 ProgramManager::ProgramInfo* info = NULL; | 8993 Program* info = NULL; |
| 8991 info = GetProgramInfo(program); | 8994 info = GetProgram(program); |
| 8992 if (!info || !info->IsValid()) { | 8995 if (!info || !info->IsValid()) { |
| 8993 return error::kNoError; | 8996 return error::kNoError; |
| 8994 } | 8997 } |
| 8995 info->GetProgramInfo(program_manager(), bucket); | 8998 info->GetProgram(program_manager(), bucket); |
| 8996 return error::kNoError; | 8999 return error::kNoError; |
| 8997 } | 9000 } |
| 8998 | 9001 |
| 8999 error::ContextLostReason GLES2DecoderImpl::GetContextLostReason() { | 9002 error::ContextLostReason GLES2DecoderImpl::GetContextLostReason() { |
| 9000 switch (reset_status_) { | 9003 switch (reset_status_) { |
| 9001 case GL_NO_ERROR: | 9004 case GL_NO_ERROR: |
| 9002 // TODO(kbr): improve the precision of the error code in this case. | 9005 // TODO(kbr): improve the precision of the error code in this case. |
| 9003 // Consider delegating to context for error code if MakeCurrent fails. | 9006 // Consider delegating to context for error code if MakeCurrent fails. |
| 9004 return error::kUnknown; | 9007 return error::kUnknown; |
| 9005 case GL_GUILTY_CONTEXT_RESET_ARB: | 9008 case GL_GUILTY_CONTEXT_RESET_ARB: |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9051 | 9054 |
| 9052 // Loses any child contexts. | 9055 // Loses any child contexts. |
| 9053 for (ChildList::iterator it = children_.begin(); | 9056 for (ChildList::iterator it = children_.begin(); |
| 9054 it != children_.end(); | 9057 it != children_.end(); |
| 9055 ++it) { | 9058 ++it) { |
| 9056 (*it)->LoseContext(reset_status); | 9059 (*it)->LoseContext(reset_status); |
| 9057 } | 9060 } |
| 9058 } | 9061 } |
| 9059 | 9062 |
| 9060 error::Error GLES2DecoderImpl::HandleLoseContextCHROMIUM( | 9063 error::Error GLES2DecoderImpl::HandleLoseContextCHROMIUM( |
| 9061 uint32 immediate_data_size, const gles2::LoseContextCHROMIUM& c) { | 9064 uint32 immediate_data_size, const cmds::LoseContextCHROMIUM& c) { |
| 9062 GLenum current = static_cast<GLenum>(c.current); | 9065 GLenum current = static_cast<GLenum>(c.current); |
| 9063 GLenum other = static_cast<GLenum>(c.other); | 9066 GLenum other = static_cast<GLenum>(c.other); |
| 9064 if (!validators_->reset_status.IsValid(current)) { | 9067 if (!validators_->reset_status.IsValid(current)) { |
| 9065 SetGLErrorInvalidEnum("glLoseContextCHROMIUM", current, "current"); | 9068 SetGLErrorInvalidEnum("glLoseContextCHROMIUM", current, "current"); |
| 9066 } | 9069 } |
| 9067 if (!validators_->reset_status.IsValid(other)) { | 9070 if (!validators_->reset_status.IsValid(other)) { |
| 9068 SetGLErrorInvalidEnum("glLoseContextCHROMIUM", other, "other"); | 9071 SetGLErrorInvalidEnum("glLoseContextCHROMIUM", other, "other"); |
| 9069 } | 9072 } |
| 9070 group_->LoseContexts(other); | 9073 group_->LoseContexts(other); |
| 9071 reset_status_ = current; | 9074 reset_status_ = current; |
| 9072 current_decoder_error_ = error::kLostContext; | 9075 current_decoder_error_ = error::kLostContext; |
| 9073 return error::kLostContext; | 9076 return error::kLostContext; |
| 9074 } | 9077 } |
| 9075 | 9078 |
| 9076 error::Error GLES2DecoderImpl::HandleWaitSyncPointCHROMIUM( | 9079 error::Error GLES2DecoderImpl::HandleWaitSyncPointCHROMIUM( |
| 9077 uint32 immediate_data_size, const gles2::WaitSyncPointCHROMIUM& c) { | 9080 uint32 immediate_data_size, const cmds::WaitSyncPointCHROMIUM& c) { |
| 9078 if (wait_sync_point_callback_.is_null()) | 9081 if (wait_sync_point_callback_.is_null()) |
| 9079 return error::kNoError; | 9082 return error::kNoError; |
| 9080 | 9083 |
| 9081 return wait_sync_point_callback_.Run(c.sync_point) ? | 9084 return wait_sync_point_callback_.Run(c.sync_point) ? |
| 9082 error::kNoError : error::kDeferCommandUntilLater; | 9085 error::kNoError : error::kDeferCommandUntilLater; |
| 9083 } | 9086 } |
| 9084 | 9087 |
| 9085 bool GLES2DecoderImpl::GenQueriesEXTHelper( | 9088 bool GLES2DecoderImpl::GenQueriesEXTHelper( |
| 9086 GLsizei n, const GLuint* client_ids) { | 9089 GLsizei n, const GLuint* client_ids) { |
| 9087 for (GLsizei ii = 0; ii < n; ++ii) { | 9090 for (GLsizei ii = 0; ii < n; ++ii) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 9111 if (query_manager_.get() == NULL) { | 9114 if (query_manager_.get() == NULL) { |
| 9112 return false; | 9115 return false; |
| 9113 } | 9116 } |
| 9114 if (!query_manager_->ProcessPendingQueries()) { | 9117 if (!query_manager_->ProcessPendingQueries()) { |
| 9115 current_decoder_error_ = error::kOutOfBounds; | 9118 current_decoder_error_ = error::kOutOfBounds; |
| 9116 } | 9119 } |
| 9117 return query_manager_->HavePendingQueries(); | 9120 return query_manager_->HavePendingQueries(); |
| 9118 } | 9121 } |
| 9119 | 9122 |
| 9120 error::Error GLES2DecoderImpl::HandleBeginQueryEXT( | 9123 error::Error GLES2DecoderImpl::HandleBeginQueryEXT( |
| 9121 uint32 immediate_data_size, const gles2::BeginQueryEXT& c) { | 9124 uint32 immediate_data_size, const cmds::BeginQueryEXT& c) { |
| 9122 GLenum target = static_cast<GLenum>(c.target); | 9125 GLenum target = static_cast<GLenum>(c.target); |
| 9123 GLuint client_id = static_cast<GLuint>(c.id); | 9126 GLuint client_id = static_cast<GLuint>(c.id); |
| 9124 int32 sync_shm_id = static_cast<int32>(c.sync_data_shm_id); | 9127 int32 sync_shm_id = static_cast<int32>(c.sync_data_shm_id); |
| 9125 uint32 sync_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); | 9128 uint32 sync_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); |
| 9126 | 9129 |
| 9127 switch (target) { | 9130 switch (target) { |
| 9128 case GL_COMMANDS_ISSUED_CHROMIUM: | 9131 case GL_COMMANDS_ISSUED_CHROMIUM: |
| 9129 case GL_LATENCY_QUERY_CHROMIUM: | 9132 case GL_LATENCY_QUERY_CHROMIUM: |
| 9130 case GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM: | 9133 case GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM: |
| 9131 break; | 9134 break; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9183 | 9186 |
| 9184 if (!query_manager_->BeginQuery(query)) { | 9187 if (!query_manager_->BeginQuery(query)) { |
| 9185 return error::kOutOfBounds; | 9188 return error::kOutOfBounds; |
| 9186 } | 9189 } |
| 9187 | 9190 |
| 9188 state_.current_query = query; | 9191 state_.current_query = query; |
| 9189 return error::kNoError; | 9192 return error::kNoError; |
| 9190 } | 9193 } |
| 9191 | 9194 |
| 9192 error::Error GLES2DecoderImpl::HandleEndQueryEXT( | 9195 error::Error GLES2DecoderImpl::HandleEndQueryEXT( |
| 9193 uint32 immediate_data_size, const gles2::EndQueryEXT& c) { | 9196 uint32 immediate_data_size, const cmds::EndQueryEXT& c) { |
| 9194 GLenum target = static_cast<GLenum>(c.target); | 9197 GLenum target = static_cast<GLenum>(c.target); |
| 9195 uint32 submit_count = static_cast<GLuint>(c.submit_count); | 9198 uint32 submit_count = static_cast<GLuint>(c.submit_count); |
| 9196 | 9199 |
| 9197 if (!state_.current_query) { | 9200 if (!state_.current_query) { |
| 9198 SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "No active query"); | 9201 SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "No active query"); |
| 9199 return error::kNoError; | 9202 return error::kNoError; |
| 9200 } | 9203 } |
| 9201 if (state_.current_query->target() != target) { | 9204 if (state_.current_query->target() != target) { |
| 9202 SetGLError(GL_INVALID_OPERATION, | 9205 SetGLError(GL_INVALID_OPERATION, |
| 9203 "glEndQueryEXT", "target does not match active query"); | 9206 "glEndQueryEXT", "target does not match active query"); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9286 } | 9289 } |
| 9287 | 9290 |
| 9288 // Used when OES_vertex_array_object isn't natively supported | 9291 // Used when OES_vertex_array_object isn't natively supported |
| 9289 void GLES2DecoderImpl::EmulateVertexArrayState() { | 9292 void GLES2DecoderImpl::EmulateVertexArrayState() { |
| 9290 // Setup the Vertex attribute state | 9293 // Setup the Vertex attribute state |
| 9291 for (uint32 vv = 0; vv < group_->max_vertex_attribs(); ++vv) { | 9294 for (uint32 vv = 0; vv < group_->max_vertex_attribs(); ++vv) { |
| 9292 RestoreStateForAttrib(vv); | 9295 RestoreStateForAttrib(vv); |
| 9293 } | 9296 } |
| 9294 | 9297 |
| 9295 // Setup the element buffer | 9298 // Setup the element buffer |
| 9296 BufferManager::BufferInfo* element_array_buffer = | 9299 BufferManager::Buffer* element_array_buffer = |
| 9297 state_.vertex_attrib_manager->element_array_buffer(); | 9300 state_.vertex_attrib_manager->element_array_buffer(); |
| 9298 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, | 9301 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, |
| 9299 element_array_buffer ? element_array_buffer->service_id() : 0); | 9302 element_array_buffer ? element_array_buffer->service_id() : 0); |
| 9300 } | 9303 } |
| 9301 | 9304 |
| 9302 bool GLES2DecoderImpl::DoIsVertexArrayOES(GLuint client_id) { | 9305 bool GLES2DecoderImpl::DoIsVertexArrayOES(GLuint client_id) { |
| 9303 const VertexAttribManager* vao = | 9306 const VertexAttribManager* vao = |
| 9304 GetVertexAttribManager(client_id); | 9307 GetVertexAttribManager(client_id); |
| 9305 return vao && vao->IsValid() && !vao->IsDeleted(); | 9308 return vao && vao->IsValid() && !vao->IsDeleted(); |
| 9306 } | 9309 } |
| 9307 | 9310 |
| 9308 error::Error GLES2DecoderImpl::HandleCreateStreamTextureCHROMIUM( | 9311 error::Error GLES2DecoderImpl::HandleCreateStreamTextureCHROMIUM( |
| 9309 uint32 immediate_data_size, | 9312 uint32 immediate_data_size, |
| 9310 const gles2::CreateStreamTextureCHROMIUM& c) { | 9313 const cmds::CreateStreamTextureCHROMIUM& c) { |
| 9311 if (!features().chromium_stream_texture) { | 9314 if (!features().chromium_stream_texture) { |
| 9312 SetGLError(GL_INVALID_OPERATION, | 9315 SetGLError(GL_INVALID_OPERATION, |
| 9313 "glOpenStreamTextureCHROMIUM", "" | 9316 "glOpenStreamTextureCHROMIUM", "" |
| 9314 "not supported."); | 9317 "not supported."); |
| 9315 return error::kNoError; | 9318 return error::kNoError; |
| 9316 } | 9319 } |
| 9317 | 9320 |
| 9318 uint32 client_id = c.client_id; | 9321 uint32 client_id = c.client_id; |
| 9319 typedef gles2::CreateStreamTextureCHROMIUM::Result Result; | 9322 typedef cmds::CreateStreamTextureCHROMIUM::Result Result; |
| 9320 Result* result = GetSharedMemoryAs<Result*>( | 9323 Result* result = GetSharedMemoryAs<Result*>( |
| 9321 c.result_shm_id, c.result_shm_offset, sizeof(*result)); | 9324 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
| 9322 | 9325 |
| 9323 if (!result) | 9326 if (!result) |
| 9324 return error::kOutOfBounds; | 9327 return error::kOutOfBounds; |
| 9325 *result = GL_ZERO; | 9328 *result = GL_ZERO; |
| 9326 TextureManager::TextureInfo* info = | 9329 Texture* info = |
| 9327 texture_manager()->GetTextureInfo(client_id); | 9330 texture_manager()->GetTexture(client_id); |
| 9328 if (!info) { | 9331 if (!info) { |
| 9329 SetGLError(GL_INVALID_VALUE, | 9332 SetGLError(GL_INVALID_VALUE, |
| 9330 "glCreateStreamTextureCHROMIUM", "" | 9333 "glCreateStreamTextureCHROMIUM", "" |
| 9331 "bad texture id."); | 9334 "bad texture id."); |
| 9332 return error::kNoError; | 9335 return error::kNoError; |
| 9333 } | 9336 } |
| 9334 | 9337 |
| 9335 if (info->IsStreamTexture()) { | 9338 if (info->IsStreamTexture()) { |
| 9336 SetGLError(GL_INVALID_OPERATION, | 9339 SetGLError(GL_INVALID_OPERATION, |
| 9337 "glCreateStreamTextureCHROMIUM", "" | 9340 "glCreateStreamTextureCHROMIUM", "" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 9359 "glCreateStreamTextureCHROMIUM", "" | 9362 "glCreateStreamTextureCHROMIUM", "" |
| 9360 "failed to create platform texture."); | 9363 "failed to create platform texture."); |
| 9361 } | 9364 } |
| 9362 | 9365 |
| 9363 *result = object_id; | 9366 *result = object_id; |
| 9364 return error::kNoError; | 9367 return error::kNoError; |
| 9365 } | 9368 } |
| 9366 | 9369 |
| 9367 error::Error GLES2DecoderImpl::HandleDestroyStreamTextureCHROMIUM( | 9370 error::Error GLES2DecoderImpl::HandleDestroyStreamTextureCHROMIUM( |
| 9368 uint32 immediate_data_size, | 9371 uint32 immediate_data_size, |
| 9369 const gles2::DestroyStreamTextureCHROMIUM& c) { | 9372 const cmds::DestroyStreamTextureCHROMIUM& c) { |
| 9370 GLuint client_id = c.texture; | 9373 GLuint client_id = c.texture; |
| 9371 TextureManager::TextureInfo* info = | 9374 Texture* info = |
| 9372 texture_manager()->GetTextureInfo(client_id); | 9375 texture_manager()->GetTexture(client_id); |
| 9373 if (info && info->IsStreamTexture()) { | 9376 if (info && info->IsStreamTexture()) { |
| 9374 if (!stream_texture_manager_) | 9377 if (!stream_texture_manager_) |
| 9375 return error::kInvalidArguments; | 9378 return error::kInvalidArguments; |
| 9376 | 9379 |
| 9377 stream_texture_manager_->DestroyStreamTexture(info->service_id()); | 9380 stream_texture_manager_->DestroyStreamTexture(info->service_id()); |
| 9378 info->SetStreamTexture(false); | 9381 info->SetStreamTexture(false); |
| 9379 } else { | 9382 } else { |
| 9380 SetGLError(GL_INVALID_VALUE, | 9383 SetGLError(GL_INVALID_VALUE, |
| 9381 "glDestroyStreamTextureCHROMIUM", "bad texture id."); | 9384 "glDestroyStreamTextureCHROMIUM", "bad texture id."); |
| 9382 } | 9385 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9422 // know what's going on. | 9425 // know what's going on. |
| 9423 SetGLError( | 9426 SetGLError( |
| 9424 GL_INVALID_OPERATION, | 9427 GL_INVALID_OPERATION, |
| 9425 "glTexImageIOSurface2DCHROMIUM", | 9428 "glTexImageIOSurface2DCHROMIUM", |
| 9426 "requires TEXTURE_RECTANGLE_ARB target"); | 9429 "requires TEXTURE_RECTANGLE_ARB target"); |
| 9427 return; | 9430 return; |
| 9428 } | 9431 } |
| 9429 | 9432 |
| 9430 // Default target might be conceptually valid, but disallow it to avoid | 9433 // Default target might be conceptually valid, but disallow it to avoid |
| 9431 // accidents. | 9434 // accidents. |
| 9432 TextureManager::TextureInfo* info = GetTextureInfoForTargetUnlessDefault( | 9435 Texture* info = GetTextureInfoForTargetUnlessDefault( |
| 9433 target); | 9436 target); |
| 9434 if (!info) { | 9437 if (!info) { |
| 9435 SetGLError(GL_INVALID_OPERATION, | 9438 SetGLError(GL_INVALID_OPERATION, |
| 9436 "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound"); | 9439 "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound"); |
| 9437 return; | 9440 return; |
| 9438 } | 9441 } |
| 9439 | 9442 |
| 9440 // Look up the new IOSurface. Note that because of asynchrony | 9443 // Look up the new IOSurface. Note that because of asynchrony |
| 9441 // between processes this might fail; during live resizing the | 9444 // between processes this might fail; during live resizing the |
| 9442 // plugin process might allocate and release an IOSurface before | 9445 // plugin process might allocate and release an IOSurface before |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9529 case GL_BGRA8_EXT: | 9532 case GL_BGRA8_EXT: |
| 9530 return GL_BGRA_EXT; | 9533 return GL_BGRA_EXT; |
| 9531 default: | 9534 default: |
| 9532 return GL_NONE; | 9535 return GL_NONE; |
| 9533 } | 9536 } |
| 9534 } | 9537 } |
| 9535 | 9538 |
| 9536 void GLES2DecoderImpl::DoCopyTextureCHROMIUM( | 9539 void GLES2DecoderImpl::DoCopyTextureCHROMIUM( |
| 9537 GLenum target, GLuint source_id, GLuint dest_id, GLint level, | 9540 GLenum target, GLuint source_id, GLuint dest_id, GLint level, |
| 9538 GLenum internal_format) { | 9541 GLenum internal_format) { |
| 9539 TextureManager::TextureInfo* dest_info = GetTextureInfo(dest_id); | 9542 Texture* dest_info = GetTexture(dest_id); |
| 9540 TextureManager::TextureInfo* source_info = GetTextureInfo(source_id); | 9543 Texture* source_info = GetTexture(source_id); |
| 9541 | 9544 |
| 9542 if (!source_info || !dest_info) { | 9545 if (!source_info || !dest_info) { |
| 9543 SetGLError(GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "unknown texture id"); | 9546 SetGLError(GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "unknown texture id"); |
| 9544 return; | 9547 return; |
| 9545 } | 9548 } |
| 9546 | 9549 |
| 9547 if (GL_TEXTURE_2D != target) { | 9550 if (GL_TEXTURE_2D != target) { |
| 9548 SetGLError(GL_INVALID_VALUE, | 9551 SetGLError(GL_INVALID_VALUE, |
| 9549 "glCopyTextureCHROMIUM", "invalid texture target"); | 9552 "glCopyTextureCHROMIUM", "invalid texture target"); |
| 9550 return; | 9553 return; |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9700 GLenum internal_format, | 9703 GLenum internal_format, |
| 9701 GLsizei width, | 9704 GLsizei width, |
| 9702 GLsizei height) { | 9705 GLsizei height) { |
| 9703 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoTexStorage2DEXT"); | 9706 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoTexStorage2DEXT"); |
| 9704 if (!texture_manager()->ValidForTarget(target, 0, width, height, 1) || | 9707 if (!texture_manager()->ValidForTarget(target, 0, width, height, 1) || |
| 9705 TextureManager::ComputeMipMapCount(width, height, 1) < levels) { | 9708 TextureManager::ComputeMipMapCount(width, height, 1) < levels) { |
| 9706 SetGLError( | 9709 SetGLError( |
| 9707 GL_INVALID_VALUE, "glTexStorage2DEXT", "dimensions out of range"); | 9710 GL_INVALID_VALUE, "glTexStorage2DEXT", "dimensions out of range"); |
| 9708 return; | 9711 return; |
| 9709 } | 9712 } |
| 9710 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 9713 Texture* info = GetTextureInfoForTarget(target); |
| 9711 if (!info) { | 9714 if (!info) { |
| 9712 SetGLError(GL_INVALID_OPERATION, | 9715 SetGLError(GL_INVALID_OPERATION, |
| 9713 "glTexStorage2DEXT", "unknown texture for target"); | 9716 "glTexStorage2DEXT", "unknown texture for target"); |
| 9714 return; | 9717 return; |
| 9715 } | 9718 } |
| 9716 if (info->IsAttachedToFramebuffer()) { | 9719 if (info->IsAttachedToFramebuffer()) { |
| 9717 clear_state_dirty_ = true; | 9720 clear_state_dirty_ = true; |
| 9718 } | 9721 } |
| 9719 if (info->IsImmutable()) { | 9722 if (info->IsImmutable()) { |
| 9720 SetGLError(GL_INVALID_OPERATION, | 9723 SetGLError(GL_INVALID_OPERATION, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9760 info, target, ii, format, level_width, level_height, 1, 0, format, | 9763 info, target, ii, format, level_width, level_height, 1, 0, format, |
| 9761 type, false); | 9764 type, false); |
| 9762 level_width = std::max(1, level_width >> 1); | 9765 level_width = std::max(1, level_width >> 1); |
| 9763 level_height = std::max(1, level_height >> 1); | 9766 level_height = std::max(1, level_height >> 1); |
| 9764 } | 9767 } |
| 9765 info->SetImmutable(true); | 9768 info->SetImmutable(true); |
| 9766 } | 9769 } |
| 9767 } | 9770 } |
| 9768 | 9771 |
| 9769 error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM( | 9772 error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM( |
| 9770 uint32 immediate_data_size, const gles2::GenMailboxCHROMIUM& c) { | 9773 uint32 immediate_data_size, const cmds::GenMailboxCHROMIUM& c) { |
| 9771 MailboxName name; | 9774 MailboxName name; |
| 9772 mailbox_manager()->GenerateMailboxName(&name); | 9775 mailbox_manager()->GenerateMailboxName(&name); |
| 9773 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 9776 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
| 9774 Bucket* bucket = CreateBucket(bucket_id); | 9777 Bucket* bucket = CreateBucket(bucket_id); |
| 9775 | 9778 |
| 9776 bucket->SetSize(GL_MAILBOX_SIZE_CHROMIUM); | 9779 bucket->SetSize(GL_MAILBOX_SIZE_CHROMIUM); |
| 9777 bucket->SetData(&name, 0, GL_MAILBOX_SIZE_CHROMIUM); | 9780 bucket->SetData(&name, 0, GL_MAILBOX_SIZE_CHROMIUM); |
| 9778 | 9781 |
| 9779 return error::kNoError; | 9782 return error::kNoError; |
| 9780 } | 9783 } |
| 9781 | 9784 |
| 9782 void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target, | 9785 void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target, |
| 9783 const GLbyte* mailbox) { | 9786 const GLbyte* mailbox) { |
| 9784 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 9787 Texture* info = GetTextureInfoForTarget(target); |
| 9785 if (!info) { | 9788 if (!info) { |
| 9786 SetGLError(GL_INVALID_OPERATION, | 9789 SetGLError(GL_INVALID_OPERATION, |
| 9787 "glProduceTextureCHROMIUM", "unknown texture for target"); | 9790 "glProduceTextureCHROMIUM", "unknown texture for target"); |
| 9788 return; | 9791 return; |
| 9789 } | 9792 } |
| 9790 | 9793 |
| 9791 TextureDefinition* definition = texture_manager()->Save(info); | 9794 TextureDefinition* definition = texture_manager()->Save(info); |
| 9792 if (!definition) { | 9795 if (!definition) { |
| 9793 SetGLError(GL_INVALID_OPERATION, | 9796 SetGLError(GL_INVALID_OPERATION, |
| 9794 "glProduceTextureCHROMIUM", "invalid texture"); | 9797 "glProduceTextureCHROMIUM", "invalid texture"); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 9805 SetGLError(GL_INVALID_OPERATION, | 9808 SetGLError(GL_INVALID_OPERATION, |
| 9806 "glProduceTextureCHROMIUM", "invalid mailbox name"); | 9809 "glProduceTextureCHROMIUM", "invalid mailbox name"); |
| 9807 return; | 9810 return; |
| 9808 } | 9811 } |
| 9809 | 9812 |
| 9810 glBindTexture(info->target(), info->service_id()); | 9813 glBindTexture(info->target(), info->service_id()); |
| 9811 } | 9814 } |
| 9812 | 9815 |
| 9813 void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target, | 9816 void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target, |
| 9814 const GLbyte* mailbox) { | 9817 const GLbyte* mailbox) { |
| 9815 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 9818 Texture* info = GetTextureInfoForTarget(target); |
| 9816 if (!info) { | 9819 if (!info) { |
| 9817 SetGLError(GL_INVALID_OPERATION, | 9820 SetGLError(GL_INVALID_OPERATION, |
| 9818 "glConsumeTextureCHROMIUM", "unknown texture for target"); | 9821 "glConsumeTextureCHROMIUM", "unknown texture for target"); |
| 9819 return; | 9822 return; |
| 9820 } | 9823 } |
| 9821 | 9824 |
| 9822 scoped_ptr<TextureDefinition> definition( | 9825 scoped_ptr<TextureDefinition> definition( |
| 9823 group_->mailbox_manager()->ConsumeTexture( | 9826 group_->mailbox_manager()->ConsumeTexture( |
| 9824 target, | 9827 target, |
| 9825 *reinterpret_cast<const MailboxName*>(mailbox))); | 9828 *reinterpret_cast<const MailboxName*>(mailbox))); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9866 if (target != GL_TEXTURE_2D) { | 9869 if (target != GL_TEXTURE_2D) { |
| 9867 // This might be supported in the future. | 9870 // This might be supported in the future. |
| 9868 SetGLError( | 9871 SetGLError( |
| 9869 GL_INVALID_OPERATION, | 9872 GL_INVALID_OPERATION, |
| 9870 "glBindTexImage2DCHROMIUM", "requires TEXTURE_2D target"); | 9873 "glBindTexImage2DCHROMIUM", "requires TEXTURE_2D target"); |
| 9871 return; | 9874 return; |
| 9872 } | 9875 } |
| 9873 | 9876 |
| 9874 // Default target might be conceptually valid, but disallow it to avoid | 9877 // Default target might be conceptually valid, but disallow it to avoid |
| 9875 // accidents. | 9878 // accidents. |
| 9876 TextureManager::TextureInfo* info = GetTextureInfoForTargetUnlessDefault( | 9879 Texture* info = GetTextureInfoForTargetUnlessDefault( |
| 9877 target); | 9880 target); |
| 9878 if (!info) { | 9881 if (!info) { |
| 9879 SetGLError(GL_INVALID_OPERATION, | 9882 SetGLError(GL_INVALID_OPERATION, |
| 9880 "glBindTexImage2DCHROMIUM", "no texture bound"); | 9883 "glBindTexImage2DCHROMIUM", "no texture bound"); |
| 9881 return; | 9884 return; |
| 9882 } | 9885 } |
| 9883 | 9886 |
| 9884 gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); | 9887 gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); |
| 9885 if (!gl_image) { | 9888 if (!gl_image) { |
| 9886 SetGLError(GL_INVALID_OPERATION, | 9889 SetGLError(GL_INVALID_OPERATION, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 9909 if (target != GL_TEXTURE_2D) { | 9912 if (target != GL_TEXTURE_2D) { |
| 9910 // This might be supported in the future. | 9913 // This might be supported in the future. |
| 9911 SetGLError( | 9914 SetGLError( |
| 9912 GL_INVALID_OPERATION, | 9915 GL_INVALID_OPERATION, |
| 9913 "glReleaseTexImage2DCHROMIUM", "requires TEXTURE_2D target"); | 9916 "glReleaseTexImage2DCHROMIUM", "requires TEXTURE_2D target"); |
| 9914 return; | 9917 return; |
| 9915 } | 9918 } |
| 9916 | 9919 |
| 9917 // Default target might be conceptually valid, but disallow it to avoid | 9920 // Default target might be conceptually valid, but disallow it to avoid |
| 9918 // accidents. | 9921 // accidents. |
| 9919 TextureManager::TextureInfo* info = GetTextureInfoForTargetUnlessDefault( | 9922 Texture* info = GetTextureInfoForTargetUnlessDefault( |
| 9920 target); | 9923 target); |
| 9921 if (!info) { | 9924 if (!info) { |
| 9922 SetGLError(GL_INVALID_OPERATION, | 9925 SetGLError(GL_INVALID_OPERATION, |
| 9923 "glReleaseTexImage2DCHROMIUM", "no texture bound"); | 9926 "glReleaseTexImage2DCHROMIUM", "no texture bound"); |
| 9924 return; | 9927 return; |
| 9925 } | 9928 } |
| 9926 | 9929 |
| 9927 gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); | 9930 gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); |
| 9928 if (!gl_image) { | 9931 if (!gl_image) { |
| 9929 SetGLError(GL_INVALID_OPERATION, | 9932 SetGLError(GL_INVALID_OPERATION, |
| 9930 "glReleaseTexImage2DCHROMIUM", | 9933 "glReleaseTexImage2DCHROMIUM", |
| 9931 "no image found with the given ID"); | 9934 "no image found with the given ID"); |
| 9932 return; | 9935 return; |
| 9933 } | 9936 } |
| 9934 | 9937 |
| 9935 // Do nothing when image is not currently bound. | 9938 // Do nothing when image is not currently bound. |
| 9936 if (info->GetLevelImage(target, 0) != gl_image) | 9939 if (info->GetLevelImage(target, 0) != gl_image) |
| 9937 return; | 9940 return; |
| 9938 | 9941 |
| 9939 gl_image->ReleaseTexImage(); | 9942 gl_image->ReleaseTexImage(); |
| 9940 | 9943 |
| 9941 texture_manager()->SetLevelInfo( | 9944 texture_manager()->SetLevelInfo( |
| 9942 info, target, 0, GL_RGBA, 0, 0, 1, 0, | 9945 info, target, 0, GL_RGBA, 0, 0, 1, 0, |
| 9943 GL_RGBA, GL_UNSIGNED_BYTE, false); | 9946 GL_RGBA, GL_UNSIGNED_BYTE, false); |
| 9944 } | 9947 } |
| 9945 | 9948 |
| 9946 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM( | 9949 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM( |
| 9947 uint32 immediate_data_size, const gles2::TraceBeginCHROMIUM& c) { | 9950 uint32 immediate_data_size, const cmds::TraceBeginCHROMIUM& c) { |
| 9948 Bucket* bucket = GetBucket(c.bucket_id); | 9951 Bucket* bucket = GetBucket(c.bucket_id); |
| 9949 if (!bucket || bucket->size() == 0) { | 9952 if (!bucket || bucket->size() == 0) { |
| 9950 return error::kInvalidArguments; | 9953 return error::kInvalidArguments; |
| 9951 } | 9954 } |
| 9952 std::string command_name; | 9955 std::string command_name; |
| 9953 if (!bucket->GetAsString(&command_name)) { | 9956 if (!bucket->GetAsString(&command_name)) { |
| 9954 return error::kInvalidArguments; | 9957 return error::kInvalidArguments; |
| 9955 } | 9958 } |
| 9956 TRACE_EVENT_COPY_ASYNC_BEGIN0("gpu", command_name.c_str(), this); | 9959 TRACE_EVENT_COPY_ASYNC_BEGIN0("gpu", command_name.c_str(), this); |
| 9957 if (!gpu_tracer_->Begin(command_name)) { | 9960 if (!gpu_tracer_->Begin(command_name)) { |
| 9958 SetGLError(GL_INVALID_OPERATION, | 9961 SetGLError(GL_INVALID_OPERATION, |
| 9959 "glTraceBeginCHROMIUM", "unable to create begin trace"); | 9962 "glTraceBeginCHROMIUM", "unable to create begin trace"); |
| 9960 return error::kNoError; | 9963 return error::kNoError; |
| 9961 } | 9964 } |
| 9962 return error::kNoError; | 9965 return error::kNoError; |
| 9963 } | 9966 } |
| 9964 | 9967 |
| 9965 void GLES2DecoderImpl::DoTraceEndCHROMIUM() { | 9968 void GLES2DecoderImpl::DoTraceEndCHROMIUM() { |
| 9966 if (gpu_tracer_->CurrentName().empty()) { | 9969 if (gpu_tracer_->CurrentName().empty()) { |
| 9967 SetGLError(GL_INVALID_OPERATION, | 9970 SetGLError(GL_INVALID_OPERATION, |
| 9968 "glTraceEndCHROMIUM", "no trace begin found"); | 9971 "glTraceEndCHROMIUM", "no trace begin found"); |
| 9969 return; | 9972 return; |
| 9970 } | 9973 } |
| 9971 TRACE_EVENT_COPY_ASYNC_END0("gpu", gpu_tracer_->CurrentName().c_str(), this); | 9974 TRACE_EVENT_COPY_ASYNC_END0("gpu", gpu_tracer_->CurrentName().c_str(), this); |
| 9972 gpu_tracer_->End(); | 9975 gpu_tracer_->End(); |
| 9973 } | 9976 } |
| 9974 | 9977 |
| 9975 bool GLES2DecoderImpl::ValidateAsyncTransfer( | 9978 bool GLES2DecoderImpl::ValidateAsyncTransfer( |
| 9976 const char* function_name, | 9979 const char* function_name, |
| 9977 TextureManager::TextureInfo* info, | 9980 Texture* info, |
| 9978 GLenum target, | 9981 GLenum target, |
| 9979 GLint level, | 9982 GLint level, |
| 9980 const void * data) { | 9983 const void * data) { |
| 9981 // We only support async uploads to 2D textures for now. | 9984 // We only support async uploads to 2D textures for now. |
| 9982 if (GL_TEXTURE_2D != target) { | 9985 if (GL_TEXTURE_2D != target) { |
| 9983 SetGLErrorInvalidEnum(function_name, target, "target"); | 9986 SetGLErrorInvalidEnum(function_name, target, "target"); |
| 9984 return false; | 9987 return false; |
| 9985 } | 9988 } |
| 9986 // We only support uploads to level zero for now. | 9989 // We only support uploads to level zero for now. |
| 9987 if (level != 0) { | 9990 if (level != 0) { |
| 9988 SetGLError(GL_INVALID_VALUE, function_name, "level != 0"); | 9991 SetGLError(GL_INVALID_VALUE, function_name, "level != 0"); |
| 9989 return false; | 9992 return false; |
| 9990 } | 9993 } |
| 9991 // A transfer buffer must be bound, even for asyncTexImage2D. | 9994 // A transfer buffer must be bound, even for asyncTexImage2D. |
| 9992 if (data == NULL) { | 9995 if (data == NULL) { |
| 9993 SetGLError(GL_INVALID_OPERATION, function_name, "buffer == 0"); | 9996 SetGLError(GL_INVALID_OPERATION, function_name, "buffer == 0"); |
| 9994 return false; | 9997 return false; |
| 9995 } | 9998 } |
| 9996 // We only support one async transfer in progress. | 9999 // We only support one async transfer in progress. |
| 9997 if (!info || info->AsyncTransferIsInProgress()) { | 10000 if (!info || info->AsyncTransferIsInProgress()) { |
| 9998 SetGLError(GL_INVALID_OPERATION, | 10001 SetGLError(GL_INVALID_OPERATION, |
| 9999 function_name, "transfer already in progress"); | 10002 function_name, "transfer already in progress"); |
| 10000 return false; | 10003 return false; |
| 10001 } | 10004 } |
| 10002 return true; | 10005 return true; |
| 10003 } | 10006 } |
| 10004 | 10007 |
| 10005 error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( | 10008 error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( |
| 10006 uint32 immediate_data_size, const gles2::AsyncTexImage2DCHROMIUM& c) { | 10009 uint32 immediate_data_size, const cmds::AsyncTexImage2DCHROMIUM& c) { |
| 10007 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); | 10010 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); |
| 10008 GLenum target = static_cast<GLenum>(c.target); | 10011 GLenum target = static_cast<GLenum>(c.target); |
| 10009 GLint level = static_cast<GLint>(c.level); | 10012 GLint level = static_cast<GLint>(c.level); |
| 10010 GLint internal_format = static_cast<GLint>(c.internalformat); | 10013 GLint internal_format = static_cast<GLint>(c.internalformat); |
| 10011 GLsizei width = static_cast<GLsizei>(c.width); | 10014 GLsizei width = static_cast<GLsizei>(c.width); |
| 10012 GLsizei height = static_cast<GLsizei>(c.height); | 10015 GLsizei height = static_cast<GLsizei>(c.height); |
| 10013 GLint border = static_cast<GLint>(c.border); | 10016 GLint border = static_cast<GLint>(c.border); |
| 10014 GLenum format = static_cast<GLenum>(c.format); | 10017 GLenum format = static_cast<GLenum>(c.format); |
| 10015 GLenum type = static_cast<GLenum>(c.type); | 10018 GLenum type = static_cast<GLenum>(c.type); |
| 10016 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); | 10019 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 10034 } | 10037 } |
| 10035 | 10038 |
| 10036 // All the normal glTexSubImage2D validation. | 10039 // All the normal glTexSubImage2D validation. |
| 10037 if (!ValidateTexImage2D( | 10040 if (!ValidateTexImage2D( |
| 10038 "glAsyncTexImage2DCHROMIUM", target, level, internal_format, | 10041 "glAsyncTexImage2DCHROMIUM", target, level, internal_format, |
| 10039 width, height, border, format, type, pixels, pixels_size)) { | 10042 width, height, border, format, type, pixels, pixels_size)) { |
| 10040 return error::kNoError; | 10043 return error::kNoError; |
| 10041 } | 10044 } |
| 10042 | 10045 |
| 10043 // Extra async validation. | 10046 // Extra async validation. |
| 10044 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 10047 Texture* info = GetTextureInfoForTarget(target); |
| 10045 if (!ValidateAsyncTransfer( | 10048 if (!ValidateAsyncTransfer( |
| 10046 "glAsyncTexImage2DCHROMIUM", info, target, level, pixels)) | 10049 "glAsyncTexImage2DCHROMIUM", info, target, level, pixels)) |
| 10047 return error::kNoError; | 10050 return error::kNoError; |
| 10048 | 10051 |
| 10049 // Don't allow async redefinition of a textures. | 10052 // Don't allow async redefinition of a textures. |
| 10050 if (info->IsDefined()) { | 10053 if (info->IsDefined()) { |
| 10051 SetGLError(GL_INVALID_OPERATION, | 10054 SetGLError(GL_INVALID_OPERATION, |
| 10052 "glAsyncTexImage2DCHROMIUM", "already defined"); | 10055 "glAsyncTexImage2DCHROMIUM", "already defined"); |
| 10053 return error::kNoError; | 10056 return error::kNoError; |
| 10054 } | 10057 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10088 // after the the transfer is complete. | 10091 // after the the transfer is complete. |
| 10089 texture_manager()->AddPendingAsyncPixelTransfer( | 10092 texture_manager()->AddPendingAsyncPixelTransfer( |
| 10090 info->GetAsyncTransferState()->AsWeakPtr(), info); | 10093 info->GetAsyncTransferState()->AsWeakPtr(), info); |
| 10091 | 10094 |
| 10092 async_pixel_transfer_delegate_->AsyncTexImage2D( | 10095 async_pixel_transfer_delegate_->AsyncTexImage2D( |
| 10093 info->GetAsyncTransferState(), tex_params, mem_params); | 10096 info->GetAsyncTransferState(), tex_params, mem_params); |
| 10094 return error::kNoError; | 10097 return error::kNoError; |
| 10095 } | 10098 } |
| 10096 | 10099 |
| 10097 error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM( | 10100 error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM( |
| 10098 uint32 immediate_data_size, const gles2::AsyncTexSubImage2DCHROMIUM& c) { | 10101 uint32 immediate_data_size, const cmds::AsyncTexSubImage2DCHROMIUM& c) { |
| 10099 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM"); | 10102 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM"); |
| 10100 GLenum target = static_cast<GLenum>(c.target); | 10103 GLenum target = static_cast<GLenum>(c.target); |
| 10101 GLint level = static_cast<GLint>(c.level); | 10104 GLint level = static_cast<GLint>(c.level); |
| 10102 GLint xoffset = static_cast<GLint>(c.xoffset); | 10105 GLint xoffset = static_cast<GLint>(c.xoffset); |
| 10103 GLint yoffset = static_cast<GLint>(c.yoffset); | 10106 GLint yoffset = static_cast<GLint>(c.yoffset); |
| 10104 GLsizei width = static_cast<GLsizei>(c.width); | 10107 GLsizei width = static_cast<GLsizei>(c.width); |
| 10105 GLsizei height = static_cast<GLsizei>(c.height); | 10108 GLsizei height = static_cast<GLsizei>(c.height); |
| 10106 GLenum format = static_cast<GLenum>(c.format); | 10109 GLenum format = static_cast<GLenum>(c.format); |
| 10107 GLenum type = static_cast<GLenum>(c.type); | 10110 GLenum type = static_cast<GLenum>(c.type); |
| 10108 | 10111 |
| 10109 // TODO(epenner): Move this and copies of this memory validation | 10112 // TODO(epenner): Move this and copies of this memory validation |
| 10110 // into ValidateTexSubImage2D step. | 10113 // into ValidateTexSubImage2D step. |
| 10111 uint32 data_size; | 10114 uint32 data_size; |
| 10112 if (!GLES2Util::ComputeImageDataSizes( | 10115 if (!GLES2Util::ComputeImageDataSizes( |
| 10113 width, height, format, type, state_.unpack_alignment, &data_size, | 10116 width, height, format, type, state_.unpack_alignment, &data_size, |
| 10114 NULL, NULL)) { | 10117 NULL, NULL)) { |
| 10115 return error::kOutOfBounds; | 10118 return error::kOutOfBounds; |
| 10116 } | 10119 } |
| 10117 const void* pixels = GetSharedMemoryAs<const void*>( | 10120 const void* pixels = GetSharedMemoryAs<const void*>( |
| 10118 c.data_shm_id, c.data_shm_offset, data_size); | 10121 c.data_shm_id, c.data_shm_offset, data_size); |
| 10119 | 10122 |
| 10120 // All the normal glTexSubImage2D validation. | 10123 // All the normal glTexSubImage2D validation. |
| 10121 error::Error error = error::kNoError; | 10124 error::Error error = error::kNoError; |
| 10122 if (!ValidateTexSubImage2D(&error, "glAsyncTexSubImage2DCHROMIUM", | 10125 if (!ValidateTexSubImage2D(&error, "glAsyncTexSubImage2DCHROMIUM", |
| 10123 target, level, xoffset, yoffset, width, height, format, type, pixels)) { | 10126 target, level, xoffset, yoffset, width, height, format, type, pixels)) { |
| 10124 return error; | 10127 return error; |
| 10125 } | 10128 } |
| 10126 | 10129 |
| 10127 // Extra async validation. | 10130 // Extra async validation. |
| 10128 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 10131 Texture* info = GetTextureInfoForTarget(target); |
| 10129 if (!ValidateAsyncTransfer( | 10132 if (!ValidateAsyncTransfer( |
| 10130 "glAsyncTexSubImage2DCHROMIUM", info, target, level, pixels)) | 10133 "glAsyncTexSubImage2DCHROMIUM", info, target, level, pixels)) |
| 10131 return error::kNoError; | 10134 return error::kNoError; |
| 10132 | 10135 |
| 10133 // Guarantee async textures are always 'cleared' as follows: | 10136 // Guarantee async textures are always 'cleared' as follows: |
| 10134 // - AsyncTexImage2D can not redefine an existing texture | 10137 // - AsyncTexImage2D can not redefine an existing texture |
| 10135 // - AsyncTexImage2D must initialize the entire image via non-null buffer. | 10138 // - AsyncTexImage2D must initialize the entire image via non-null buffer. |
| 10136 // - AsyncTexSubImage2D clears synchronously if not already cleared. | 10139 // - AsyncTexSubImage2D clears synchronously if not already cleared. |
| 10137 // - Textures become immutable after an async call. | 10140 // - Textures become immutable after an async call. |
| 10138 // This way we know in all cases that an async texture is always clear. | 10141 // This way we know in all cases that an async texture is always clear. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10170 return error::kNoError; | 10173 return error::kNoError; |
| 10171 } | 10174 } |
| 10172 | 10175 |
| 10173 // Include the auto-generated part of this file. We split this because it means | 10176 // Include the auto-generated part of this file. We split this because it means |
| 10174 // we can easily edit the non-auto generated parts right here in this file | 10177 // we can easily edit the non-auto generated parts right here in this file |
| 10175 // instead of having to edit some template or the code generator. | 10178 // instead of having to edit some template or the code generator. |
| 10176 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10179 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 10177 | 10180 |
| 10178 } // namespace gles2 | 10181 } // namespace gles2 |
| 10179 } // namespace gpu | 10182 } // namespace gpu |
| OLD | NEW |