| 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 1229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1240 // Wrapper for glFramebufferRenderbufffer. | 1240 // Wrapper for glFramebufferRenderbufffer. |
| 1241 void DoFramebufferRenderbuffer( | 1241 void DoFramebufferRenderbuffer( |
| 1242 GLenum target, GLenum attachment, GLenum renderbuffertarget, | 1242 GLenum target, GLenum attachment, GLenum renderbuffertarget, |
| 1243 GLuint renderbuffer); | 1243 GLuint renderbuffer); |
| 1244 | 1244 |
| 1245 // Wrapper for glFramebufferTexture2D. | 1245 // Wrapper for glFramebufferTexture2D. |
| 1246 void DoFramebufferTexture2D( | 1246 void DoFramebufferTexture2D( |
| 1247 GLenum target, GLenum attachment, GLenum textarget, GLuint texture, | 1247 GLenum target, GLenum attachment, GLenum textarget, GLuint texture, |
| 1248 GLint level); | 1248 GLint level); |
| 1249 | 1249 |
| 1250 // Wrapper for glFramebufferTexture2DMultisampleEXT. |
| 1251 void DoFramebufferTexture2DMultisample( |
| 1252 GLenum target, GLenum attachment, GLenum textarget, |
| 1253 GLuint texture, GLint level, GLsizei samples); |
| 1254 |
| 1255 // Common implementation for both DoFramebufferTexture2D wrappers. |
| 1256 void DoFramebufferTexture2DCommon(const char* name, |
| 1257 GLenum target, GLenum attachment, GLenum textarget, |
| 1258 GLuint texture, GLint level, GLsizei samples); |
| 1259 |
| 1250 // Wrapper for glGenerateMipmap | 1260 // Wrapper for glGenerateMipmap |
| 1251 void DoGenerateMipmap(GLenum target); | 1261 void DoGenerateMipmap(GLenum target); |
| 1252 | 1262 |
| 1253 // Helper for GenSharedIdsCHROMIUM commands. | 1263 // Helper for GenSharedIdsCHROMIUM commands. |
| 1254 void DoGenSharedIdsCHROMIUM( | 1264 void DoGenSharedIdsCHROMIUM( |
| 1255 GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids); | 1265 GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids); |
| 1256 | 1266 |
| 1267 // Helper for DoGetBooleanv, Floatv, and Intergerv to adjust pname |
| 1268 // to account for different pname values defined in different extension |
| 1269 // variants. |
| 1270 GLenum AdjustGetPname(GLenum pname); |
| 1271 |
| 1257 // Wrapper for DoGetBooleanv. | 1272 // Wrapper for DoGetBooleanv. |
| 1258 void DoGetBooleanv(GLenum pname, GLboolean* params); | 1273 void DoGetBooleanv(GLenum pname, GLboolean* params); |
| 1259 | 1274 |
| 1260 // Wrapper for DoGetFloatv. | 1275 // Wrapper for DoGetFloatv. |
| 1261 void DoGetFloatv(GLenum pname, GLfloat* params); | 1276 void DoGetFloatv(GLenum pname, GLfloat* params); |
| 1262 | 1277 |
| 1263 // Wrapper for glGetFramebufferAttachmentParameteriv. | 1278 // Wrapper for glGetFramebufferAttachmentParameteriv. |
| 1264 void DoGetFramebufferAttachmentParameteriv( | 1279 void DoGetFramebufferAttachmentParameteriv( |
| 1265 GLenum target, GLenum attachment, GLenum pname, GLint* params); | 1280 GLenum target, GLenum attachment, GLenum pname, GLint* params); |
| 1266 | 1281 |
| (...skipping 3087 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4354 } | 4369 } |
| 4355 | 4370 |
| 4356 bool GLES2DecoderImpl::GetNumValuesReturnedForGLGet( | 4371 bool GLES2DecoderImpl::GetNumValuesReturnedForGLGet( |
| 4357 GLenum pname, GLsizei* num_values) { | 4372 GLenum pname, GLsizei* num_values) { |
| 4358 if (state_.GetStateAsGLint(pname, NULL, num_values)) { | 4373 if (state_.GetStateAsGLint(pname, NULL, num_values)) { |
| 4359 return true; | 4374 return true; |
| 4360 } | 4375 } |
| 4361 return GetHelper(pname, NULL, num_values); | 4376 return GetHelper(pname, NULL, num_values); |
| 4362 } | 4377 } |
| 4363 | 4378 |
| 4379 GLenum GLES2DecoderImpl::AdjustGetPname(GLenum pname) { |
| 4380 if (GL_MAX_SAMPLES == pname && |
| 4381 features().use_img_for_multisampled_render_to_texture) { |
| 4382 return GL_MAX_SAMPLES_IMG; |
| 4383 } |
| 4384 return pname; |
| 4385 } |
| 4386 |
| 4364 void GLES2DecoderImpl::DoGetBooleanv(GLenum pname, GLboolean* params) { | 4387 void GLES2DecoderImpl::DoGetBooleanv(GLenum pname, GLboolean* params) { |
| 4365 DCHECK(params); | 4388 DCHECK(params); |
| 4366 GLsizei num_written = 0; | 4389 GLsizei num_written = 0; |
| 4367 if (GetNumValuesReturnedForGLGet(pname, &num_written)) { | 4390 if (GetNumValuesReturnedForGLGet(pname, &num_written)) { |
| 4368 scoped_ptr<GLint[]> values(new GLint[num_written]); | 4391 scoped_ptr<GLint[]> values(new GLint[num_written]); |
| 4369 if (!state_.GetStateAsGLint(pname, values.get(), &num_written)) { | 4392 if (!state_.GetStateAsGLint(pname, values.get(), &num_written)) { |
| 4370 GetHelper(pname, values.get(), &num_written); | 4393 GetHelper(pname, values.get(), &num_written); |
| 4371 } | 4394 } |
| 4372 for (GLsizei ii = 0; ii < num_written; ++ii) { | 4395 for (GLsizei ii = 0; ii < num_written; ++ii) { |
| 4373 params[ii] = static_cast<GLboolean>(values[ii]); | 4396 params[ii] = static_cast<GLboolean>(values[ii]); |
| 4374 } | 4397 } |
| 4375 } else { | 4398 } else { |
| 4399 pname = AdjustGetPname(pname); |
| 4376 glGetBooleanv(pname, params); | 4400 glGetBooleanv(pname, params); |
| 4377 } | 4401 } |
| 4378 } | 4402 } |
| 4379 | 4403 |
| 4380 void GLES2DecoderImpl::DoGetFloatv(GLenum pname, GLfloat* params) { | 4404 void GLES2DecoderImpl::DoGetFloatv(GLenum pname, GLfloat* params) { |
| 4381 DCHECK(params); | 4405 DCHECK(params); |
| 4382 GLsizei num_written = 0; | 4406 GLsizei num_written = 0; |
| 4383 if (!state_.GetStateAsGLfloat(pname, params, &num_written)) { | 4407 if (!state_.GetStateAsGLfloat(pname, params, &num_written)) { |
| 4384 if (GetHelper(pname, NULL, &num_written)) { | 4408 if (GetHelper(pname, NULL, &num_written)) { |
| 4385 scoped_ptr<GLint[]> values(new GLint[num_written]); | 4409 scoped_ptr<GLint[]> values(new GLint[num_written]); |
| 4386 GetHelper(pname, values.get(), &num_written); | 4410 GetHelper(pname, values.get(), &num_written); |
| 4387 for (GLsizei ii = 0; ii < num_written; ++ii) { | 4411 for (GLsizei ii = 0; ii < num_written; ++ii) { |
| 4388 params[ii] = static_cast<GLfloat>(values[ii]); | 4412 params[ii] = static_cast<GLfloat>(values[ii]); |
| 4389 } | 4413 } |
| 4390 } else { | 4414 } else { |
| 4415 pname = AdjustGetPname(pname); |
| 4391 glGetFloatv(pname, params); | 4416 glGetFloatv(pname, params); |
| 4392 } | 4417 } |
| 4393 } | 4418 } |
| 4394 } | 4419 } |
| 4395 | 4420 |
| 4396 void GLES2DecoderImpl::DoGetIntegerv(GLenum pname, GLint* params) { | 4421 void GLES2DecoderImpl::DoGetIntegerv(GLenum pname, GLint* params) { |
| 4397 DCHECK(params); | 4422 DCHECK(params); |
| 4398 GLsizei num_written; | 4423 GLsizei num_written; |
| 4399 if (!state_.GetStateAsGLint(pname, params, &num_written) && | 4424 if (!state_.GetStateAsGLint(pname, params, &num_written) && |
| 4400 !GetHelper(pname, params, &num_written)) { | 4425 !GetHelper(pname, params, &num_written)) { |
| 4426 pname = AdjustGetPname(pname); |
| 4401 glGetIntegerv(pname, params); | 4427 glGetIntegerv(pname, params); |
| 4402 } | 4428 } |
| 4403 } | 4429 } |
| 4404 | 4430 |
| 4405 void GLES2DecoderImpl::DoGetProgramiv( | 4431 void GLES2DecoderImpl::DoGetProgramiv( |
| 4406 GLuint program_id, GLenum pname, GLint* params) { | 4432 GLuint program_id, GLenum pname, GLint* params) { |
| 4407 Program* program = GetProgramInfoNotShader(program_id, "glGetProgramiv"); | 4433 Program* program = GetProgramInfoNotShader(program_id, "glGetProgramiv"); |
| 4408 if (!program) { | 4434 if (!program) { |
| 4409 return; | 4435 return; |
| 4410 } | 4436 } |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4866 GLenum completeness = framebuffer->IsPossiblyComplete(); | 4892 GLenum completeness = framebuffer->IsPossiblyComplete(); |
| 4867 if (completeness != GL_FRAMEBUFFER_COMPLETE) { | 4893 if (completeness != GL_FRAMEBUFFER_COMPLETE) { |
| 4868 return completeness; | 4894 return completeness; |
| 4869 } | 4895 } |
| 4870 return framebuffer->GetStatus(texture_manager(), target); | 4896 return framebuffer->GetStatus(texture_manager(), target); |
| 4871 } | 4897 } |
| 4872 | 4898 |
| 4873 void GLES2DecoderImpl::DoFramebufferTexture2D( | 4899 void GLES2DecoderImpl::DoFramebufferTexture2D( |
| 4874 GLenum target, GLenum attachment, GLenum textarget, | 4900 GLenum target, GLenum attachment, GLenum textarget, |
| 4875 GLuint client_texture_id, GLint level) { | 4901 GLuint client_texture_id, GLint level) { |
| 4902 DoFramebufferTexture2DCommon( |
| 4903 "glFramebufferTexture2D", target, attachment, |
| 4904 textarget, client_texture_id, level, 0); |
| 4905 } |
| 4906 |
| 4907 void GLES2DecoderImpl::DoFramebufferTexture2DMultisample( |
| 4908 GLenum target, GLenum attachment, GLenum textarget, |
| 4909 GLuint client_texture_id, GLint level, GLsizei samples) { |
| 4910 if (!features().multisampled_render_to_texture) { |
| 4911 LOCAL_SET_GL_ERROR( |
| 4912 GL_INVALID_OPERATION, |
| 4913 "glFramebufferTexture2DMultisample", "function not available"); |
| 4914 return; |
| 4915 } |
| 4916 DoFramebufferTexture2DCommon( |
| 4917 "glFramebufferTexture2DMultisample", target, attachment, |
| 4918 textarget, client_texture_id, level, samples); |
| 4919 } |
| 4920 |
| 4921 void GLES2DecoderImpl::DoFramebufferTexture2DCommon( |
| 4922 const char* name, GLenum target, GLenum attachment, GLenum textarget, |
| 4923 GLuint client_texture_id, GLint level, GLsizei samples) { |
| 4924 if (samples > renderbuffer_manager()->max_samples()) { |
| 4925 LOCAL_SET_GL_ERROR( |
| 4926 GL_INVALID_VALUE, |
| 4927 "glFramebufferTexture2DMultisample", "samples too large"); |
| 4928 return; |
| 4929 } |
| 4876 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); | 4930 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); |
| 4877 if (!framebuffer) { | 4931 if (!framebuffer) { |
| 4878 LOCAL_SET_GL_ERROR( | 4932 LOCAL_SET_GL_ERROR( |
| 4879 GL_INVALID_OPERATION, | 4933 GL_INVALID_OPERATION, |
| 4880 "glFramebufferTexture2D", "no framebuffer bound."); | 4934 name, "no framebuffer bound."); |
| 4881 return; | 4935 return; |
| 4882 } | 4936 } |
| 4883 GLuint service_id = 0; | 4937 GLuint service_id = 0; |
| 4884 TextureRef* texture_ref = NULL; | 4938 TextureRef* texture_ref = NULL; |
| 4885 if (client_texture_id) { | 4939 if (client_texture_id) { |
| 4886 texture_ref = GetTexture(client_texture_id); | 4940 texture_ref = GetTexture(client_texture_id); |
| 4887 if (!texture_ref) { | 4941 if (!texture_ref) { |
| 4888 LOCAL_SET_GL_ERROR( | 4942 LOCAL_SET_GL_ERROR( |
| 4889 GL_INVALID_OPERATION, | 4943 GL_INVALID_OPERATION, |
| 4890 "glFramebufferTexture2D", "unknown texture_ref"); | 4944 name, "unknown texture_ref"); |
| 4891 return; | 4945 return; |
| 4892 } | 4946 } |
| 4893 service_id = texture_ref->service_id(); | 4947 service_id = texture_ref->service_id(); |
| 4894 } | 4948 } |
| 4895 | 4949 |
| 4896 if (!texture_manager()->ValidForTarget(textarget, level, 0, 0, 1)) { | 4950 if (!texture_manager()->ValidForTarget(textarget, level, 0, 0, 1)) { |
| 4897 LOCAL_SET_GL_ERROR( | 4951 LOCAL_SET_GL_ERROR( |
| 4898 GL_INVALID_VALUE, | 4952 GL_INVALID_VALUE, |
| 4899 "glFramebufferTexture2D", "level out of range"); | 4953 name, "level out of range"); |
| 4900 return; | 4954 return; |
| 4901 } | 4955 } |
| 4902 | 4956 |
| 4903 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glFramebufferTexture2D"); | 4957 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(name); |
| 4904 glFramebufferTexture2DEXT(target, attachment, textarget, service_id, level); | 4958 if (0 == samples) { |
| 4905 GLenum error = LOCAL_PEEK_GL_ERROR("glFramebufferTexture2D"); | 4959 glFramebufferTexture2DEXT(target, attachment, textarget, service_id, level); |
| 4960 } else { |
| 4961 if (features().use_img_for_multisampled_render_to_texture) { |
| 4962 glFramebufferTexture2DMultisampleIMG(target, attachment, textarget, |
| 4963 service_id, level, samples); |
| 4964 } else { |
| 4965 glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, |
| 4966 service_id, level, samples); |
| 4967 } |
| 4968 } |
| 4969 GLenum error = LOCAL_PEEK_GL_ERROR(name); |
| 4906 if (error == GL_NO_ERROR) { | 4970 if (error == GL_NO_ERROR) { |
| 4907 framebuffer->AttachTexture(attachment, texture_ref, textarget, level); | 4971 framebuffer->AttachTexture(attachment, texture_ref, textarget, level, |
| 4972 samples); |
| 4908 } | 4973 } |
| 4909 if (framebuffer == state_.bound_draw_framebuffer.get()) { | 4974 if (framebuffer == state_.bound_draw_framebuffer.get()) { |
| 4910 clear_state_dirty_ = true; | 4975 clear_state_dirty_ = true; |
| 4911 } | 4976 } |
| 4912 OnFboChanged(); | 4977 OnFboChanged(); |
| 4913 } | 4978 } |
| 4914 | 4979 |
| 4915 void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( | 4980 void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( |
| 4916 GLenum target, GLenum attachment, GLenum pname, GLint* params) { | 4981 GLenum target, GLenum attachment, GLenum pname, GLint* params) { |
| 4917 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); | 4982 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); |
| 4918 if (!framebuffer) { | 4983 if (!framebuffer) { |
| 4919 LOCAL_SET_GL_ERROR( | 4984 LOCAL_SET_GL_ERROR( |
| 4920 GL_INVALID_OPERATION, | 4985 GL_INVALID_OPERATION, |
| 4921 "glFramebufferAttachmentParameteriv", "no framebuffer bound"); | 4986 "glFramebufferAttachmentParameteriv", "no framebuffer bound"); |
| 4922 return; | 4987 return; |
| 4923 } | 4988 } |
| 4924 if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) { | 4989 if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) { |
| 4925 const Framebuffer::Attachment* attachment_object = | 4990 const Framebuffer::Attachment* attachment_object = |
| 4926 framebuffer->GetAttachment(attachment); | 4991 framebuffer->GetAttachment(attachment); |
| 4927 *params = attachment_object ? attachment_object->object_name() : 0; | 4992 *params = attachment_object ? attachment_object->object_name() : 0; |
| 4928 } else { | 4993 } else { |
| 4994 if (pname == GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT && |
| 4995 features().use_img_for_multisampled_render_to_texture) { |
| 4996 pname = GL_TEXTURE_SAMPLES_IMG; |
| 4997 } |
| 4929 glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params); | 4998 glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params); |
| 4930 } | 4999 } |
| 4931 } | 5000 } |
| 4932 | 5001 |
| 4933 void GLES2DecoderImpl::DoGetRenderbufferParameteriv( | 5002 void GLES2DecoderImpl::DoGetRenderbufferParameteriv( |
| 4934 GLenum target, GLenum pname, GLint* params) { | 5003 GLenum target, GLenum pname, GLint* params) { |
| 4935 Renderbuffer* renderbuffer = | 5004 Renderbuffer* renderbuffer = |
| 4936 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); | 5005 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| 4937 if (!renderbuffer) { | 5006 if (!renderbuffer) { |
| 4938 LOCAL_SET_GL_ERROR( | 5007 LOCAL_SET_GL_ERROR( |
| 4939 GL_INVALID_OPERATION, | 5008 GL_INVALID_OPERATION, |
| 4940 "glGetRenderbufferParameteriv", "no renderbuffer bound"); | 5009 "glGetRenderbufferParameteriv", "no renderbuffer bound"); |
| 4941 return; | 5010 return; |
| 4942 } | 5011 } |
| 4943 switch (pname) { | 5012 switch (pname) { |
| 4944 case GL_RENDERBUFFER_INTERNAL_FORMAT: | 5013 case GL_RENDERBUFFER_INTERNAL_FORMAT: |
| 4945 *params = renderbuffer->internal_format(); | 5014 *params = renderbuffer->internal_format(); |
| 4946 break; | 5015 break; |
| 4947 case GL_RENDERBUFFER_WIDTH: | 5016 case GL_RENDERBUFFER_WIDTH: |
| 4948 *params = renderbuffer->width(); | 5017 *params = renderbuffer->width(); |
| 4949 break; | 5018 break; |
| 4950 case GL_RENDERBUFFER_HEIGHT: | 5019 case GL_RENDERBUFFER_HEIGHT: |
| 4951 *params = renderbuffer->height(); | 5020 *params = renderbuffer->height(); |
| 4952 break; | 5021 break; |
| 5022 case GL_RENDERBUFFER_SAMPLES_EXT: |
| 5023 if (features().use_img_for_multisampled_render_to_texture) { |
| 5024 glGetRenderbufferParameterivEXT(target, GL_RENDERBUFFER_SAMPLES_IMG, |
| 5025 params); |
| 5026 } else { |
| 5027 glGetRenderbufferParameterivEXT(target, GL_RENDERBUFFER_SAMPLES_EXT, |
| 5028 params); |
| 5029 } |
| 4953 default: | 5030 default: |
| 4954 glGetRenderbufferParameterivEXT(target, pname, params); | 5031 glGetRenderbufferParameterivEXT(target, pname, params); |
| 4955 break; | 5032 break; |
| 4956 } | 5033 } |
| 4957 } | 5034 } |
| 4958 | 5035 |
| 4959 void GLES2DecoderImpl::DoBlitFramebufferEXT( | 5036 void GLES2DecoderImpl::DoBlitFramebufferEXT( |
| 4960 GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, | 5037 GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, |
| 4961 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, | 5038 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, |
| 4962 GLbitfield mask, GLenum filter) { | 5039 GLbitfield mask, GLenum filter) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 4978 } else { | 5055 } else { |
| 4979 glBlitFramebufferEXT( | 5056 glBlitFramebufferEXT( |
| 4980 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); | 5057 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); |
| 4981 } | 5058 } |
| 4982 EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test); | 5059 EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test); |
| 4983 } | 5060 } |
| 4984 | 5061 |
| 4985 void GLES2DecoderImpl::DoRenderbufferStorageMultisample( | 5062 void GLES2DecoderImpl::DoRenderbufferStorageMultisample( |
| 4986 GLenum target, GLsizei samples, GLenum internalformat, | 5063 GLenum target, GLsizei samples, GLenum internalformat, |
| 4987 GLsizei width, GLsizei height) { | 5064 GLsizei width, GLsizei height) { |
| 4988 if (!features().chromium_framebuffer_multisample) { | 5065 if (!features().chromium_framebuffer_multisample && |
| 5066 !features().multisampled_render_to_texture) { |
| 4989 LOCAL_SET_GL_ERROR( | 5067 LOCAL_SET_GL_ERROR( |
| 4990 GL_INVALID_OPERATION, | 5068 GL_INVALID_OPERATION, |
| 4991 "glRenderbufferStorageMultisample", "function not available"); | 5069 "glRenderbufferStorageMultisample", "function not available"); |
| 4992 return; | 5070 return; |
| 4993 } | 5071 } |
| 4994 | 5072 |
| 4995 Renderbuffer* renderbuffer = | 5073 Renderbuffer* renderbuffer = |
| 4996 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); | 5074 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| 4997 if (!renderbuffer) { | 5075 if (!renderbuffer) { |
| 4998 LOCAL_SET_GL_ERROR( | 5076 LOCAL_SET_GL_ERROR( |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5031 "glRenderbufferStorageMultsample", "out of memory"); | 5109 "glRenderbufferStorageMultsample", "out of memory"); |
| 5032 return; | 5110 return; |
| 5033 } | 5111 } |
| 5034 | 5112 |
| 5035 GLenum impl_format = RenderbufferManager:: | 5113 GLenum impl_format = RenderbufferManager:: |
| 5036 InternalRenderbufferFormatToImplFormat(internalformat); | 5114 InternalRenderbufferFormatToImplFormat(internalformat); |
| 5037 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glRenderbufferStorageMultisample"); | 5115 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glRenderbufferStorageMultisample"); |
| 5038 if (IsAngle()) { | 5116 if (IsAngle()) { |
| 5039 glRenderbufferStorageMultisampleANGLE( | 5117 glRenderbufferStorageMultisampleANGLE( |
| 5040 target, samples, impl_format, width, height); | 5118 target, samples, impl_format, width, height); |
| 5119 } else if (features().use_img_for_multisampled_render_to_texture) { |
| 5120 glRenderbufferStorageMultisampleIMG( |
| 5121 target, samples, impl_format, width, height); |
| 5041 } else { | 5122 } else { |
| 5042 glRenderbufferStorageMultisampleEXT( | 5123 glRenderbufferStorageMultisampleEXT( |
| 5043 target, samples, impl_format, width, height); | 5124 target, samples, impl_format, width, height); |
| 5044 } | 5125 } |
| 5045 GLenum error = LOCAL_PEEK_GL_ERROR("glRenderbufferStorageMultisample"); | 5126 GLenum error = LOCAL_PEEK_GL_ERROR("glRenderbufferStorageMultisample"); |
| 5046 if (error == GL_NO_ERROR) { | 5127 if (error == GL_NO_ERROR) { |
| 5047 // TODO(gman): If renderbuffers tracked which framebuffers they were | 5128 // TODO(gman): If renderbuffers tracked which framebuffers they were |
| 5048 // attached to we could just mark those framebuffers as not complete. | 5129 // attached to we could just mark those framebuffers as not complete. |
| 5049 framebuffer_manager()->IncFramebufferStateChangeCount(); | 5130 framebuffer_manager()->IncFramebufferStateChangeCount(); |
| 5050 renderbuffer_manager()->SetInfo( | 5131 renderbuffer_manager()->SetInfo( |
| (...skipping 5417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10468 return error::kNoError; | 10549 return error::kNoError; |
| 10469 } | 10550 } |
| 10470 | 10551 |
| 10471 // Include the auto-generated part of this file. We split this because it means | 10552 // Include the auto-generated part of this file. We split this because it means |
| 10472 // we can easily edit the non-auto generated parts right here in this file | 10553 // we can easily edit the non-auto generated parts right here in this file |
| 10473 // instead of having to edit some template or the code generator. | 10554 // instead of having to edit some template or the code generator. |
| 10474 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10555 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 10475 | 10556 |
| 10476 } // namespace gles2 | 10557 } // namespace gles2 |
| 10477 } // namespace gpu | 10558 } // namespace gpu |
| OLD | NEW |