Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 960873002: Update from https://crrev.com/318214 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 1173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1184 GLenum buffer_mode); 1184 GLenum buffer_mode);
1185 1185
1186 // Clear any textures used by the current program. 1186 // Clear any textures used by the current program.
1187 bool ClearUnclearedTextures(); 1187 bool ClearUnclearedTextures();
1188 1188
1189 // Clears any uncleared attachments attached to the given frame buffer. 1189 // Clears any uncleared attachments attached to the given frame buffer.
1190 // Returns false if there was a generated GL error. 1190 // Returns false if there was a generated GL error.
1191 void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer); 1191 void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer);
1192 1192
1193 // overridden from GLES2Decoder 1193 // overridden from GLES2Decoder
1194 bool ClearLevel(unsigned service_id, 1194 bool ClearLevel(Texture* texture,
1195 unsigned bind_target,
1196 unsigned target, 1195 unsigned target,
1197 int level, 1196 int level,
1198 unsigned internal_format, 1197 unsigned internal_format,
1199 unsigned format, 1198 unsigned format,
1200 unsigned type, 1199 unsigned type,
1201 int width, 1200 int width,
1202 int height, 1201 int height,
1203 bool is_texture_immutable) override; 1202 bool is_texture_immutable) override;
1204 1203
1205 // Restore all GL state that affects clearing. 1204 // Restore all GL state that affects clearing.
(...skipping 1232 matching lines...) Expand 10 before | Expand all | Expand 10 after
2438 const gfx::Size& size, 2437 const gfx::Size& size,
2439 const DisallowedFeatures& disallowed_features, 2438 const DisallowedFeatures& disallowed_features,
2440 const std::vector<int32>& attribs) { 2439 const std::vector<int32>& attribs) {
2441 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize"); 2440 TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize");
2442 DCHECK(context->IsCurrent(surface.get())); 2441 DCHECK(context->IsCurrent(surface.get()));
2443 DCHECK(!context_.get()); 2442 DCHECK(!context_.get());
2444 2443
2445 surfaceless_ = surface->IsSurfaceless() && !offscreen; 2444 surfaceless_ = surface->IsSurfaceless() && !offscreen;
2446 2445
2447 set_initialized(); 2446 set_initialized();
2448 gpu_tracer_.reset(new GPUTracer(this));
2449 gpu_state_tracer_ = GPUStateTracer::Create(&state_); 2447 gpu_state_tracer_ = GPUStateTracer::Create(&state_);
2450 2448
2451 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 2449 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
2452 switches::kEnableGPUDebugging)) { 2450 switches::kEnableGPUDebugging)) {
2453 set_debug(true); 2451 set_debug(true);
2454 } 2452 }
2455 2453
2456 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 2454 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
2457 switches::kEnableGPUCommandLogging)) { 2455 switches::kEnableGPUCommandLogging)) {
2458 set_log_commands(true); 2456 set_log_commands(true);
(...skipping 10 matching lines...) Expand all
2469 2467
2470 // Take ownership of the context and surface. The surface can be replaced with 2468 // Take ownership of the context and surface. The surface can be replaced with
2471 // SetSurface. 2469 // SetSurface.
2472 context_ = context; 2470 context_ = context;
2473 surface_ = surface; 2471 surface_ = surface;
2474 2472
2475 ContextCreationAttribHelper attrib_parser; 2473 ContextCreationAttribHelper attrib_parser;
2476 if (!attrib_parser.Parse(attribs)) 2474 if (!attrib_parser.Parse(attribs))
2477 return false; 2475 return false;
2478 2476
2477 // Create GPU Tracer for timing values.
2478 gpu_tracer_.reset(new GPUTracer(this));
2479
2479 // Save the loseContextWhenOutOfMemory context creation attribute. 2480 // Save the loseContextWhenOutOfMemory context creation attribute.
2480 lose_context_when_out_of_memory_ = 2481 lose_context_when_out_of_memory_ =
2481 attrib_parser.lose_context_when_out_of_memory; 2482 attrib_parser.lose_context_when_out_of_memory;
2482 2483
2483 // If the failIfMajorPerformanceCaveat context creation attribute was true 2484 // If the failIfMajorPerformanceCaveat context creation attribute was true
2484 // and we are using a software renderer, fail. 2485 // and we are using a software renderer, fail.
2485 if (attrib_parser.fail_if_major_perf_caveat && 2486 if (attrib_parser.fail_if_major_perf_caveat &&
2486 feature_info_->feature_flags().is_swiftshader) { 2487 feature_info_->feature_flags().is_swiftshader) {
2487 group_ = NULL; // Must not destroy ContextGroup if it is not initialized. 2488 group_ = NULL; // Must not destroy ContextGroup if it is not initialized.
2488 Destroy(true); 2489 Destroy(true);
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
2851 DoGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, 2852 DoGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,
2852 &caps.max_transform_feedback_separate_attribs); 2853 &caps.max_transform_feedback_separate_attribs);
2853 DoGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, 2854 DoGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS,
2854 &caps.max_uniform_buffer_bindings); 2855 &caps.max_uniform_buffer_bindings);
2855 DoGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, 2856 DoGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT,
2856 &caps.uniform_buffer_offset_alignment); 2857 &caps.uniform_buffer_offset_alignment);
2857 } 2858 }
2858 2859
2859 caps.egl_image_external = 2860 caps.egl_image_external =
2860 feature_info_->feature_flags().oes_egl_image_external; 2861 feature_info_->feature_flags().oes_egl_image_external;
2862 caps.texture_format_atc =
2863 feature_info_->feature_flags().ext_texture_format_atc;
2861 caps.texture_format_bgra8888 = 2864 caps.texture_format_bgra8888 =
2862 feature_info_->feature_flags().ext_texture_format_bgra8888; 2865 feature_info_->feature_flags().ext_texture_format_bgra8888;
2866 caps.texture_format_dxt1 =
2867 feature_info_->feature_flags().ext_texture_format_dxt1;
2868 caps.texture_format_dxt5 =
2869 feature_info_->feature_flags().ext_texture_format_dxt5;
2863 caps.texture_format_etc1 = 2870 caps.texture_format_etc1 =
2864 feature_info_->feature_flags().oes_compressed_etc1_rgb8_texture; 2871 feature_info_->feature_flags().oes_compressed_etc1_rgb8_texture;
2865 caps.texture_format_etc1_npot = 2872 caps.texture_format_etc1_npot =
2866 caps.texture_format_etc1 && !workarounds().etc1_power_of_two_only; 2873 caps.texture_format_etc1 && !workarounds().etc1_power_of_two_only;
2867 caps.texture_rectangle = feature_info_->feature_flags().arb_texture_rectangle; 2874 caps.texture_rectangle = feature_info_->feature_flags().arb_texture_rectangle;
2868 caps.texture_usage = feature_info_->feature_flags().angle_texture_usage; 2875 caps.texture_usage = feature_info_->feature_flags().angle_texture_usage;
2869 caps.texture_storage = feature_info_->feature_flags().ext_texture_storage; 2876 caps.texture_storage = feature_info_->feature_flags().ext_texture_storage;
2870 caps.discard_framebuffer = 2877 caps.discard_framebuffer =
2871 feature_info_->feature_flags().ext_discard_framebuffer; 2878 feature_info_->feature_flags().ext_discard_framebuffer;
2872 caps.sync_query = feature_info_->feature_flags().chromium_sync_query; 2879 caps.sync_query = feature_info_->feature_flags().chromium_sync_query;
(...skipping 2253 matching lines...) Expand 10 before | Expand all | Expand 10 after
5126 5133
5127 error::Error GLES2DecoderImpl::HandleDeleteShader(uint32 immediate_data_size, 5134 error::Error GLES2DecoderImpl::HandleDeleteShader(uint32 immediate_data_size,
5128 const void* cmd_data) { 5135 const void* cmd_data) {
5129 const gles2::cmds::DeleteShader& c = 5136 const gles2::cmds::DeleteShader& c =
5130 *static_cast<const gles2::cmds::DeleteShader*>(cmd_data); 5137 *static_cast<const gles2::cmds::DeleteShader*>(cmd_data);
5131 GLuint client_id = c.shader; 5138 GLuint client_id = c.shader;
5132 if (client_id) { 5139 if (client_id) {
5133 Shader* shader = GetShader(client_id); 5140 Shader* shader = GetShader(client_id);
5134 if (shader) { 5141 if (shader) {
5135 if (!shader->IsDeleted()) { 5142 if (!shader->IsDeleted()) {
5136 glDeleteShader(shader->service_id()); 5143 shader_manager()->Delete(shader);
5137 shader_manager()->MarkAsDeleted(shader);
5138 } 5144 }
5139 } else { 5145 } else {
5140 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glDeleteShader", "unknown shader"); 5146 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glDeleteShader", "unknown shader");
5141 } 5147 }
5142 } 5148 }
5143 return error::kNoError; 5149 return error::kNoError;
5144 } 5150 }
5145 5151
5146 error::Error GLES2DecoderImpl::HandleDeleteProgram(uint32 immediate_data_size, 5152 error::Error GLES2DecoderImpl::HandleDeleteProgram(uint32 immediate_data_size,
5147 const void* cmd_data) { 5153 const void* cmd_data) {
(...skipping 3250 matching lines...) Expand 10 before | Expand all | Expand 10 after
8398 } 8404 }
8399 8405
8400 void GLES2DecoderImpl::DoBufferSubData( 8406 void GLES2DecoderImpl::DoBufferSubData(
8401 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { 8407 GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) {
8402 // Just delegate it. Some validation is actually done before this. 8408 // Just delegate it. Some validation is actually done before this.
8403 buffer_manager()->ValidateAndDoBufferSubData( 8409 buffer_manager()->ValidateAndDoBufferSubData(
8404 &state_, target, offset, size, data); 8410 &state_, target, offset, size, data);
8405 } 8411 }
8406 8412
8407 bool GLES2DecoderImpl::ClearLevel( 8413 bool GLES2DecoderImpl::ClearLevel(
8408 unsigned service_id, 8414 Texture* texture,
8409 unsigned bind_target,
8410 unsigned target, 8415 unsigned target,
8411 int level, 8416 int level,
8412 unsigned internal_format, 8417 unsigned internal_format,
8413 unsigned format, 8418 unsigned format,
8414 unsigned type, 8419 unsigned type,
8415 int width, 8420 int width,
8416 int height, 8421 int height,
8417 bool is_texture_immutable) { 8422 bool is_texture_immutable) {
8418 uint32 channels = GLES2Util::GetChannelsForFormat(format); 8423 uint32 channels = GLES2Util::GetChannelsForFormat(format);
8419 if (feature_info_->feature_flags().angle_depth_texture && 8424 if (feature_info_->feature_flags().angle_depth_texture &&
8420 (channels & GLES2Util::kDepth) != 0) { 8425 (channels & GLES2Util::kDepth) != 0) {
8421 // It's a depth format and ANGLE doesn't allow texImage2D or texSubImage2D 8426 // It's a depth format and ANGLE doesn't allow texImage2D or texSubImage2D
8422 // on depth formats. 8427 // on depth formats.
8423 GLuint fb = 0; 8428 GLuint fb = 0;
8424 glGenFramebuffersEXT(1, &fb); 8429 glGenFramebuffersEXT(1, &fb);
8425 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb); 8430 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb);
8426 8431
8427 bool have_stencil = (channels & GLES2Util::kStencil) != 0; 8432 bool have_stencil = (channels & GLES2Util::kStencil) != 0;
8428 GLenum attachment = have_stencil ? GL_DEPTH_STENCIL_ATTACHMENT : 8433 GLenum attachment = have_stencil ? GL_DEPTH_STENCIL_ATTACHMENT :
8429 GL_DEPTH_ATTACHMENT; 8434 GL_DEPTH_ATTACHMENT;
8430 8435
8431 glFramebufferTexture2DEXT( 8436 glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, attachment, target,
8432 GL_DRAW_FRAMEBUFFER_EXT, attachment, target, service_id, level); 8437 texture->service_id(), level);
8433 // ANGLE promises a depth only attachment ok. 8438 // ANGLE promises a depth only attachment ok.
8434 if (glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT) != 8439 if (glCheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT) !=
8435 GL_FRAMEBUFFER_COMPLETE) { 8440 GL_FRAMEBUFFER_COMPLETE) {
8436 return false; 8441 return false;
8437 } 8442 }
8438 glClearStencil(0); 8443 glClearStencil(0);
8439 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask); 8444 state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask);
8440 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask); 8445 state_.SetDeviceStencilMaskSeparate(GL_BACK, kDefaultStencilMask);
8441 glClearDepth(1.0f); 8446 glClearDepth(1.0f);
8442 state_.SetDeviceDepthMask(GL_TRUE); 8447 state_.SetDeviceDepthMask(GL_TRUE);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
8481 NULL, NULL)) { 8486 NULL, NULL)) {
8482 return false; 8487 return false;
8483 } 8488 }
8484 } else { 8489 } else {
8485 tile_height = height; 8490 tile_height = height;
8486 } 8491 }
8487 8492
8488 // Assumes the size has already been checked. 8493 // Assumes the size has already been checked.
8489 scoped_ptr<char[]> zero(new char[size]); 8494 scoped_ptr<char[]> zero(new char[size]);
8490 memset(zero.get(), 0, size); 8495 memset(zero.get(), 0, size);
8491 glBindTexture(bind_target, service_id); 8496 glBindTexture(texture->target(), texture->service_id());
8492 8497
8498 bool has_images = texture->HasImages();
8493 GLint y = 0; 8499 GLint y = 0;
8494 while (y < height) { 8500 while (y < height) {
8495 GLint h = y + tile_height > height ? height - y : tile_height; 8501 GLint h = y + tile_height > height ? height - y : tile_height;
8496 if (is_texture_immutable || h != height) { 8502 if (is_texture_immutable || h != height || has_images) {
8497 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); 8503 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get());
8498 } else { 8504 } else {
8499 glTexImage2D( 8505 glTexImage2D(
8500 target, level, internal_format, width, h, 0, format, type, 8506 target, level, internal_format, width, h, 0, format, type,
8501 zero.get()); 8507 zero.get());
8502 } 8508 }
8503 y += tile_height; 8509 y += tile_height;
8504 } 8510 }
8505 TextureRef* texture = texture_manager()->GetTextureInfoForTarget( 8511 TextureRef* bound_texture =
8506 &state_, bind_target); 8512 texture_manager()->GetTextureInfoForTarget(&state_, texture->target());
8507 glBindTexture(bind_target, texture ? texture->service_id() : 0); 8513 glBindTexture(texture->target(),
8514 bound_texture ? bound_texture->service_id() : 0);
8508 return true; 8515 return true;
8509 } 8516 }
8510 8517
8511 namespace { 8518 namespace {
8512 8519
8513 const int kS3TCBlockWidth = 4; 8520 const int kS3TCBlockWidth = 4;
8514 const int kS3TCBlockHeight = 4; 8521 const int kS3TCBlockHeight = 4;
8515 const int kS3TCDXT1BlockSize = 8; 8522 const int kS3TCDXT1BlockSize = 8;
8516 const int kS3TCDXT3AndDXT5BlockSize = 16; 8523 const int kS3TCDXT3AndDXT5BlockSize = 16;
8517 8524
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after
9158 GLint copyWidth = 0; 9165 GLint copyWidth = 0;
9159 GLint copyHeight = 0; 9166 GLint copyHeight = 0;
9160 Clip(x, width, size.width(), &copyX, &copyWidth); 9167 Clip(x, width, size.width(), &copyX, &copyWidth);
9161 Clip(y, height, size.height(), &copyY, &copyHeight); 9168 Clip(y, height, size.height(), &copyY, &copyHeight);
9162 9169
9163 if (copyX != x || 9170 if (copyX != x ||
9164 copyY != y || 9171 copyY != y ||
9165 copyWidth != width || 9172 copyWidth != width ||
9166 copyHeight != height) { 9173 copyHeight != height) {
9167 // some part was clipped so clear the texture. 9174 // some part was clipped so clear the texture.
9168 if (!ClearLevel( 9175 if (!ClearLevel(texture, target, level, internal_format, internal_format,
9169 texture->service_id(), texture->target(), 9176 GL_UNSIGNED_BYTE, width, height, texture->IsImmutable())) {
9170 target, level, internal_format, internal_format, GL_UNSIGNED_BYTE,
9171 width, height, texture->IsImmutable())) {
9172 LOCAL_SET_GL_ERROR( 9177 LOCAL_SET_GL_ERROR(
9173 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); 9178 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big");
9174 return; 9179 return;
9175 } 9180 }
9176 if (copyHeight > 0 && copyWidth > 0) { 9181 if (copyHeight > 0 && copyWidth > 0) {
9177 GLint dx = copyX - x; 9182 GLint dx = copyX - x;
9178 GLint dy = copyY - y; 9183 GLint dy = copyY - y;
9179 GLint destX = dx; 9184 GLint destX = dx;
9180 GLint destY = dy; 9185 GLint destY = dy;
9181 ScopedModifyPixels modify(texture_ref); 9186 ScopedModifyPixels modify(texture_ref);
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
9434 GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); 9439 GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big");
9435 return error::kNoError; 9440 return error::kNoError;
9436 } 9441 }
9437 ScopedTextureUploadTimer timer(&texture_state_); 9442 ScopedTextureUploadTimer timer(&texture_state_);
9438 glTexSubImage2D( 9443 glTexSubImage2D(
9439 target, level, xoffset, yoffset, width, height, format, type, data); 9444 target, level, xoffset, yoffset, width, height, format, type, data);
9440 return error::kNoError; 9445 return error::kNoError;
9441 } 9446 }
9442 9447
9443 if (!texture_state_.texsubimage2d_faster_than_teximage2d && 9448 if (!texture_state_.texsubimage2d_faster_than_teximage2d &&
9444 !texture->IsImmutable()) { 9449 !texture->IsImmutable() &&
9450 !texture->HasImages()) {
9445 ScopedTextureUploadTimer timer(&texture_state_); 9451 ScopedTextureUploadTimer timer(&texture_state_);
9446 GLenum internal_format; 9452 GLenum internal_format;
9447 GLenum tex_type; 9453 GLenum tex_type;
9448 texture->GetLevelType(target, level, &tex_type, &internal_format); 9454 texture->GetLevelType(target, level, &tex_type, &internal_format);
9449 // NOTE: In OpenGL ES 2.0 border is always zero. If that changes we'll need 9455 // NOTE: In OpenGL ES 2.0 border is always zero. If that changes we'll need
9450 // to look it up. 9456 // to look it up.
9451 glTexImage2D( 9457 glTexImage2D(
9452 target, level, internal_format, width, height, 0, format, type, data); 9458 target, level, internal_format, width, height, 0, format, type, data);
9453 } else { 9459 } else {
9454 ScopedTextureUploadTimer timer(&texture_state_); 9460 ScopedTextureUploadTimer timer(&texture_state_);
(...skipping 2666 matching lines...) Expand 10 before | Expand all | Expand 10 after
12121 } 12127 }
12122 } 12128 }
12123 12129
12124 // Include the auto-generated part of this file. We split this because it means 12130 // Include the auto-generated part of this file. We split this because it means
12125 // we can easily edit the non-auto generated parts right here in this file 12131 // we can easily edit the non-auto generated parts right here in this file
12126 // instead of having to edit some template or the code generator. 12132 // instead of having to edit some template or the code generator.
12127 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 12133 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
12128 12134
12129 } // namespace gles2 12135 } // namespace gles2
12130 } // namespace gpu 12136 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698