Chromium Code Reviews| 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 3073 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4340 } | 4355 } |
| 4341 | 4356 |
| 4342 bool GLES2DecoderImpl::GetNumValuesReturnedForGLGet( | 4357 bool GLES2DecoderImpl::GetNumValuesReturnedForGLGet( |
| 4343 GLenum pname, GLsizei* num_values) { | 4358 GLenum pname, GLsizei* num_values) { |
| 4344 if (state_.GetStateAsGLint(pname, NULL, num_values)) { | 4359 if (state_.GetStateAsGLint(pname, NULL, num_values)) { |
| 4345 return true; | 4360 return true; |
| 4346 } | 4361 } |
| 4347 return GetHelper(pname, NULL, num_values); | 4362 return GetHelper(pname, NULL, num_values); |
| 4348 } | 4363 } |
| 4349 | 4364 |
| 4365 GLenum GLES2DecoderImpl::AdjustGetPname(GLenum pname) { | |
| 4366 if (GL_MAX_SAMPLES == pname && | |
| 4367 features().use_img_for_multisampled_render_to_texture) { | |
| 4368 return GL_MAX_SAMPLES_IMG; | |
| 4369 } | |
| 4370 return pname; | |
| 4371 } | |
| 4372 | |
| 4350 void GLES2DecoderImpl::DoGetBooleanv(GLenum pname, GLboolean* params) { | 4373 void GLES2DecoderImpl::DoGetBooleanv(GLenum pname, GLboolean* params) { |
| 4351 DCHECK(params); | 4374 DCHECK(params); |
| 4352 GLsizei num_written = 0; | 4375 GLsizei num_written = 0; |
| 4353 if (GetNumValuesReturnedForGLGet(pname, &num_written)) { | 4376 if (GetNumValuesReturnedForGLGet(pname, &num_written)) { |
| 4354 scoped_ptr<GLint[]> values(new GLint[num_written]); | 4377 scoped_ptr<GLint[]> values(new GLint[num_written]); |
| 4355 if (!state_.GetStateAsGLint(pname, values.get(), &num_written)) { | 4378 if (!state_.GetStateAsGLint(pname, values.get(), &num_written)) { |
| 4356 GetHelper(pname, values.get(), &num_written); | 4379 GetHelper(pname, values.get(), &num_written); |
| 4357 } | 4380 } |
| 4358 for (GLsizei ii = 0; ii < num_written; ++ii) { | 4381 for (GLsizei ii = 0; ii < num_written; ++ii) { |
| 4359 params[ii] = static_cast<GLboolean>(values[ii]); | 4382 params[ii] = static_cast<GLboolean>(values[ii]); |
| 4360 } | 4383 } |
| 4361 } else { | 4384 } else { |
| 4385 pname = AdjustGetPname(pname); | |
| 4362 glGetBooleanv(pname, params); | 4386 glGetBooleanv(pname, params); |
| 4363 } | 4387 } |
| 4364 } | 4388 } |
| 4365 | 4389 |
| 4366 void GLES2DecoderImpl::DoGetFloatv(GLenum pname, GLfloat* params) { | 4390 void GLES2DecoderImpl::DoGetFloatv(GLenum pname, GLfloat* params) { |
| 4367 DCHECK(params); | 4391 DCHECK(params); |
| 4368 GLsizei num_written = 0; | 4392 GLsizei num_written = 0; |
| 4369 if (!state_.GetStateAsGLfloat(pname, params, &num_written)) { | 4393 if (!state_.GetStateAsGLfloat(pname, params, &num_written)) { |
| 4370 if (GetHelper(pname, NULL, &num_written)) { | 4394 if (GetHelper(pname, NULL, &num_written)) { |
| 4371 scoped_ptr<GLint[]> values(new GLint[num_written]); | 4395 scoped_ptr<GLint[]> values(new GLint[num_written]); |
| 4372 GetHelper(pname, values.get(), &num_written); | 4396 GetHelper(pname, values.get(), &num_written); |
| 4373 for (GLsizei ii = 0; ii < num_written; ++ii) { | 4397 for (GLsizei ii = 0; ii < num_written; ++ii) { |
| 4374 params[ii] = static_cast<GLfloat>(values[ii]); | 4398 params[ii] = static_cast<GLfloat>(values[ii]); |
| 4375 } | 4399 } |
| 4376 } else { | 4400 } else { |
| 4401 pname = AdjustGetPname(pname); | |
| 4377 glGetFloatv(pname, params); | 4402 glGetFloatv(pname, params); |
| 4378 } | 4403 } |
| 4379 } | 4404 } |
| 4380 } | 4405 } |
| 4381 | 4406 |
| 4382 void GLES2DecoderImpl::DoGetIntegerv(GLenum pname, GLint* params) { | 4407 void GLES2DecoderImpl::DoGetIntegerv(GLenum pname, GLint* params) { |
| 4383 DCHECK(params); | 4408 DCHECK(params); |
| 4384 GLsizei num_written; | 4409 GLsizei num_written; |
| 4385 if (!state_.GetStateAsGLint(pname, params, &num_written) && | 4410 if (!state_.GetStateAsGLint(pname, params, &num_written) && |
| 4386 !GetHelper(pname, params, &num_written)) { | 4411 !GetHelper(pname, params, &num_written)) { |
| 4412 pname = AdjustGetPname(pname); | |
| 4387 glGetIntegerv(pname, params); | 4413 glGetIntegerv(pname, params); |
| 4388 } | 4414 } |
| 4389 } | 4415 } |
| 4390 | 4416 |
| 4391 void GLES2DecoderImpl::DoGetProgramiv( | 4417 void GLES2DecoderImpl::DoGetProgramiv( |
| 4392 GLuint program_id, GLenum pname, GLint* params) { | 4418 GLuint program_id, GLenum pname, GLint* params) { |
| 4393 Program* program = GetProgramInfoNotShader(program_id, "glGetProgramiv"); | 4419 Program* program = GetProgramInfoNotShader(program_id, "glGetProgramiv"); |
| 4394 if (!program) { | 4420 if (!program) { |
| 4395 return; | 4421 return; |
| 4396 } | 4422 } |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4852 GLenum completeness = framebuffer->IsPossiblyComplete(); | 4878 GLenum completeness = framebuffer->IsPossiblyComplete(); |
| 4853 if (completeness != GL_FRAMEBUFFER_COMPLETE) { | 4879 if (completeness != GL_FRAMEBUFFER_COMPLETE) { |
| 4854 return completeness; | 4880 return completeness; |
| 4855 } | 4881 } |
| 4856 return framebuffer->GetStatus(texture_manager(), target); | 4882 return framebuffer->GetStatus(texture_manager(), target); |
| 4857 } | 4883 } |
| 4858 | 4884 |
| 4859 void GLES2DecoderImpl::DoFramebufferTexture2D( | 4885 void GLES2DecoderImpl::DoFramebufferTexture2D( |
| 4860 GLenum target, GLenum attachment, GLenum textarget, | 4886 GLenum target, GLenum attachment, GLenum textarget, |
| 4861 GLuint client_texture_id, GLint level) { | 4887 GLuint client_texture_id, GLint level) { |
| 4888 DoFramebufferTexture2DCommon( | |
| 4889 "glFramebufferTexture2D", target, attachment, | |
| 4890 textarget, client_texture_id, level, 0); | |
| 4891 } | |
| 4892 | |
| 4893 void GLES2DecoderImpl::DoFramebufferTexture2DMultisample( | |
| 4894 GLenum target, GLenum attachment, GLenum textarget, | |
| 4895 GLuint client_texture_id, GLint level, GLsizei samples) { | |
| 4896 if (!features().multisampled_render_to_texture) { | |
| 4897 LOCAL_SET_GL_ERROR( | |
| 4898 GL_INVALID_OPERATION, | |
| 4899 "glFramebufferTexture2DMultisample", "function not available"); | |
| 4900 return; | |
| 4901 } | |
| 4902 DoFramebufferTexture2DCommon( | |
| 4903 "glFramebufferTexture2DMultisample", target, attachment, | |
| 4904 textarget, client_texture_id, level, samples); | |
| 4905 } | |
| 4906 | |
| 4907 void GLES2DecoderImpl::DoFramebufferTexture2DCommon( | |
| 4908 const char* name, GLenum target, GLenum attachment, GLenum textarget, | |
| 4909 GLuint client_texture_id, GLint level, GLsizei samples) { | |
| 4910 if (samples > renderbuffer_manager()->max_samples()) { | |
| 4911 LOCAL_SET_GL_ERROR( | |
| 4912 GL_INVALID_VALUE, | |
| 4913 "glFramebufferTexture2DMultisample", "samples too large"); | |
| 4914 return; | |
| 4915 } | |
| 4862 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); | 4916 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); |
| 4863 if (!framebuffer) { | 4917 if (!framebuffer) { |
| 4864 LOCAL_SET_GL_ERROR( | 4918 LOCAL_SET_GL_ERROR( |
| 4865 GL_INVALID_OPERATION, | 4919 GL_INVALID_OPERATION, |
| 4866 "glFramebufferTexture2D", "no framebuffer bound."); | 4920 name, "no framebuffer bound."); |
| 4867 return; | 4921 return; |
| 4868 } | 4922 } |
| 4869 GLuint service_id = 0; | 4923 GLuint service_id = 0; |
| 4870 TextureRef* texture_ref = NULL; | 4924 TextureRef* texture_ref = NULL; |
| 4871 if (client_texture_id) { | 4925 if (client_texture_id) { |
| 4872 texture_ref = GetTexture(client_texture_id); | 4926 texture_ref = GetTexture(client_texture_id); |
| 4873 if (!texture_ref) { | 4927 if (!texture_ref) { |
| 4874 LOCAL_SET_GL_ERROR( | 4928 LOCAL_SET_GL_ERROR( |
| 4875 GL_INVALID_OPERATION, | 4929 GL_INVALID_OPERATION, |
| 4876 "glFramebufferTexture2D", "unknown texture_ref"); | 4930 name, "unknown texture_ref"); |
| 4877 return; | 4931 return; |
| 4878 } | 4932 } |
| 4879 service_id = texture_ref->service_id(); | 4933 service_id = texture_ref->service_id(); |
| 4880 } | 4934 } |
| 4881 | 4935 |
| 4882 if (!texture_manager()->ValidForTarget(textarget, level, 0, 0, 1)) { | 4936 if (!texture_manager()->ValidForTarget(textarget, level, 0, 0, 1)) { |
| 4883 LOCAL_SET_GL_ERROR( | 4937 LOCAL_SET_GL_ERROR( |
| 4884 GL_INVALID_VALUE, | 4938 GL_INVALID_VALUE, |
| 4885 "glFramebufferTexture2D", "level out of range"); | 4939 name, "level out of range"); |
| 4886 return; | 4940 return; |
| 4887 } | 4941 } |
| 4888 | 4942 |
| 4889 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glFramebufferTexture2D"); | 4943 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(name); |
| 4890 glFramebufferTexture2DEXT(target, attachment, textarget, service_id, level); | 4944 if (0 == samples) { |
| 4891 GLenum error = LOCAL_PEEK_GL_ERROR("glFramebufferTexture2D"); | 4945 glFramebufferTexture2DEXT(target, attachment, textarget, service_id, level); |
| 4946 } else { | |
| 4947 if (features().use_img_for_multisampled_render_to_texture) { | |
|
apatrick_chromium
2013/07/08 21:28:03
Does it need something like this? I can't find any
| |
| 4948 glFramebufferTexture2DMultisampleIMG(target, attachment, textarget, | |
| 4949 service_id, level, samples); | |
| 4950 } else { | |
| 4951 glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, | |
| 4952 service_id, level, samples); | |
| 4953 } | |
| 4954 } | |
| 4955 GLenum error = LOCAL_PEEK_GL_ERROR(name); | |
| 4892 if (error == GL_NO_ERROR) { | 4956 if (error == GL_NO_ERROR) { |
| 4893 framebuffer->AttachTexture(attachment, texture_ref, textarget, level); | 4957 framebuffer->AttachTexture(attachment, texture_ref, textarget, level, |
| 4958 samples); | |
| 4894 } | 4959 } |
| 4895 if (framebuffer == state_.bound_draw_framebuffer.get()) { | 4960 if (framebuffer == state_.bound_draw_framebuffer.get()) { |
| 4896 clear_state_dirty_ = true; | 4961 clear_state_dirty_ = true; |
| 4897 } | 4962 } |
| 4898 OnFboChanged(); | 4963 OnFboChanged(); |
| 4899 } | 4964 } |
| 4900 | 4965 |
| 4901 void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( | 4966 void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( |
| 4902 GLenum target, GLenum attachment, GLenum pname, GLint* params) { | 4967 GLenum target, GLenum attachment, GLenum pname, GLint* params) { |
| 4903 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); | 4968 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); |
| 4904 if (!framebuffer) { | 4969 if (!framebuffer) { |
| 4905 LOCAL_SET_GL_ERROR( | 4970 LOCAL_SET_GL_ERROR( |
| 4906 GL_INVALID_OPERATION, | 4971 GL_INVALID_OPERATION, |
| 4907 "glFramebufferAttachmentParameteriv", "no framebuffer bound"); | 4972 "glFramebufferAttachmentParameteriv", "no framebuffer bound"); |
| 4908 return; | 4973 return; |
| 4909 } | 4974 } |
| 4910 if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) { | 4975 if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) { |
| 4911 const Framebuffer::Attachment* attachment_object = | 4976 const Framebuffer::Attachment* attachment_object = |
| 4912 framebuffer->GetAttachment(attachment); | 4977 framebuffer->GetAttachment(attachment); |
| 4913 *params = attachment_object ? attachment_object->object_name() : 0; | 4978 *params = attachment_object ? attachment_object->object_name() : 0; |
| 4914 } else { | 4979 } else { |
| 4980 if (pname == GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT && | |
| 4981 features().use_img_for_multisampled_render_to_texture) { | |
| 4982 pname = GL_TEXTURE_SAMPLES_IMG; | |
| 4983 } | |
| 4915 glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params); | 4984 glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params); |
| 4916 } | 4985 } |
| 4917 } | 4986 } |
| 4918 | 4987 |
| 4919 void GLES2DecoderImpl::DoGetRenderbufferParameteriv( | 4988 void GLES2DecoderImpl::DoGetRenderbufferParameteriv( |
| 4920 GLenum target, GLenum pname, GLint* params) { | 4989 GLenum target, GLenum pname, GLint* params) { |
| 4921 Renderbuffer* renderbuffer = | 4990 Renderbuffer* renderbuffer = |
| 4922 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); | 4991 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| 4923 if (!renderbuffer) { | 4992 if (!renderbuffer) { |
| 4924 LOCAL_SET_GL_ERROR( | 4993 LOCAL_SET_GL_ERROR( |
| 4925 GL_INVALID_OPERATION, | 4994 GL_INVALID_OPERATION, |
| 4926 "glGetRenderbufferParameteriv", "no renderbuffer bound"); | 4995 "glGetRenderbufferParameteriv", "no renderbuffer bound"); |
| 4927 return; | 4996 return; |
| 4928 } | 4997 } |
| 4929 switch (pname) { | 4998 switch (pname) { |
| 4930 case GL_RENDERBUFFER_INTERNAL_FORMAT: | 4999 case GL_RENDERBUFFER_INTERNAL_FORMAT: |
| 4931 *params = renderbuffer->internal_format(); | 5000 *params = renderbuffer->internal_format(); |
| 4932 break; | 5001 break; |
| 4933 case GL_RENDERBUFFER_WIDTH: | 5002 case GL_RENDERBUFFER_WIDTH: |
| 4934 *params = renderbuffer->width(); | 5003 *params = renderbuffer->width(); |
| 4935 break; | 5004 break; |
| 4936 case GL_RENDERBUFFER_HEIGHT: | 5005 case GL_RENDERBUFFER_HEIGHT: |
| 4937 *params = renderbuffer->height(); | 5006 *params = renderbuffer->height(); |
| 4938 break; | 5007 break; |
| 5008 case GL_RENDERBUFFER_SAMPLES_EXT: | |
| 5009 if (features().use_img_for_multisampled_render_to_texture) { | |
| 5010 glGetRenderbufferParameterivEXT(target, GL_RENDERBUFFER_SAMPLES_IMG, | |
| 5011 params); | |
| 5012 } else { | |
| 5013 glGetRenderbufferParameterivEXT(target, GL_RENDERBUFFER_SAMPLES_EXT, | |
| 5014 params); | |
| 5015 } | |
| 4939 default: | 5016 default: |
| 4940 glGetRenderbufferParameterivEXT(target, pname, params); | 5017 glGetRenderbufferParameterivEXT(target, pname, params); |
| 4941 break; | 5018 break; |
| 4942 } | 5019 } |
| 4943 } | 5020 } |
| 4944 | 5021 |
| 4945 void GLES2DecoderImpl::DoBlitFramebufferEXT( | 5022 void GLES2DecoderImpl::DoBlitFramebufferEXT( |
| 4946 GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, | 5023 GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, |
| 4947 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, | 5024 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, |
| 4948 GLbitfield mask, GLenum filter) { | 5025 GLbitfield mask, GLenum filter) { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 4964 } else { | 5041 } else { |
| 4965 glBlitFramebufferEXT( | 5042 glBlitFramebufferEXT( |
| 4966 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); | 5043 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); |
| 4967 } | 5044 } |
| 4968 EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test); | 5045 EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test); |
| 4969 } | 5046 } |
| 4970 | 5047 |
| 4971 void GLES2DecoderImpl::DoRenderbufferStorageMultisample( | 5048 void GLES2DecoderImpl::DoRenderbufferStorageMultisample( |
| 4972 GLenum target, GLsizei samples, GLenum internalformat, | 5049 GLenum target, GLsizei samples, GLenum internalformat, |
| 4973 GLsizei width, GLsizei height) { | 5050 GLsizei width, GLsizei height) { |
| 4974 if (!features().chromium_framebuffer_multisample) { | 5051 if (!features().chromium_framebuffer_multisample && |
| 5052 !features().multisampled_render_to_texture) { | |
| 4975 LOCAL_SET_GL_ERROR( | 5053 LOCAL_SET_GL_ERROR( |
| 4976 GL_INVALID_OPERATION, | 5054 GL_INVALID_OPERATION, |
| 4977 "glRenderbufferStorageMultisample", "function not available"); | 5055 "glRenderbufferStorageMultisample", "function not available"); |
| 4978 return; | 5056 return; |
| 4979 } | 5057 } |
| 4980 | 5058 |
| 4981 Renderbuffer* renderbuffer = | 5059 Renderbuffer* renderbuffer = |
| 4982 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); | 5060 GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| 4983 if (!renderbuffer) { | 5061 if (!renderbuffer) { |
| 4984 LOCAL_SET_GL_ERROR( | 5062 LOCAL_SET_GL_ERROR( |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5017 "glRenderbufferStorageMultsample", "out of memory"); | 5095 "glRenderbufferStorageMultsample", "out of memory"); |
| 5018 return; | 5096 return; |
| 5019 } | 5097 } |
| 5020 | 5098 |
| 5021 GLenum impl_format = RenderbufferManager:: | 5099 GLenum impl_format = RenderbufferManager:: |
| 5022 InternalRenderbufferFormatToImplFormat(internalformat); | 5100 InternalRenderbufferFormatToImplFormat(internalformat); |
| 5023 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glRenderbufferStorageMultisample"); | 5101 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glRenderbufferStorageMultisample"); |
| 5024 if (IsAngle()) { | 5102 if (IsAngle()) { |
| 5025 glRenderbufferStorageMultisampleANGLE( | 5103 glRenderbufferStorageMultisampleANGLE( |
| 5026 target, samples, impl_format, width, height); | 5104 target, samples, impl_format, width, height); |
| 5105 } else if (features().use_img_for_multisampled_render_to_texture) { | |
| 5106 glRenderbufferStorageMultisampleIMG( | |
| 5107 target, samples, impl_format, width, height); | |
| 5027 } else { | 5108 } else { |
| 5028 glRenderbufferStorageMultisampleEXT( | 5109 glRenderbufferStorageMultisampleEXT( |
| 5029 target, samples, impl_format, width, height); | 5110 target, samples, impl_format, width, height); |
| 5030 } | 5111 } |
| 5031 GLenum error = LOCAL_PEEK_GL_ERROR("glRenderbufferStorageMultisample"); | 5112 GLenum error = LOCAL_PEEK_GL_ERROR("glRenderbufferStorageMultisample"); |
| 5032 if (error == GL_NO_ERROR) { | 5113 if (error == GL_NO_ERROR) { |
| 5033 // TODO(gman): If renderbuffers tracked which framebuffers they were | 5114 // TODO(gman): If renderbuffers tracked which framebuffers they were |
| 5034 // attached to we could just mark those framebuffers as not complete. | 5115 // attached to we could just mark those framebuffers as not complete. |
| 5035 framebuffer_manager()->IncFramebufferStateChangeCount(); | 5116 framebuffer_manager()->IncFramebufferStateChangeCount(); |
| 5036 renderbuffer_manager()->SetInfo( | 5117 renderbuffer_manager()->SetInfo( |
| (...skipping 5412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10449 return error::kNoError; | 10530 return error::kNoError; |
| 10450 } | 10531 } |
| 10451 | 10532 |
| 10452 // Include the auto-generated part of this file. We split this because it means | 10533 // Include the auto-generated part of this file. We split this because it means |
| 10453 // we can easily edit the non-auto generated parts right here in this file | 10534 // we can easily edit the non-auto generated parts right here in this file |
| 10454 // instead of having to edit some template or the code generator. | 10535 // instead of having to edit some template or the code generator. |
| 10455 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10536 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 10456 | 10537 |
| 10457 } // namespace gles2 | 10538 } // namespace gles2 |
| 10458 } // namespace gpu | 10539 } // namespace gpu |
| OLD | NEW |