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

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

Issue 1630263002: Revert of Updating texture validation to account for sampler objects in ES3 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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/texture_manager.h" 5 #include "gpu/command_buffer/service/texture_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 bool can_render_; 64 bool can_render_;
65 bool can_render_to_; 65 bool can_render_to_;
66 bool npot_; 66 bool npot_;
67 67
68 // Since we will be hashing this signature structure, the padding must be 68 // Since we will be hashing this signature structure, the padding must be
69 // zero initialized. Although the C++11 specifications specify that this is 69 // zero initialized. Although the C++11 specifications specify that this is
70 // true, we will use a constructor with a memset to further enforce it instead 70 // true, we will use a constructor with a memset to further enforce it instead
71 // of relying on compilers adhering to this deep dark corner specification. 71 // of relying on compilers adhering to this deep dark corner specification.
72 TextureSignature(GLenum target, 72 TextureSignature(GLenum target,
73 GLint level, 73 GLint level,
74 const SamplerState& sampler_state, 74 GLenum min_filter,
75 GLenum mag_filter,
76 GLenum wrap_r,
77 GLenum wrap_s,
78 GLenum wrap_t,
75 GLenum usage, 79 GLenum usage,
76 GLenum internal_format, 80 GLenum internal_format,
81 GLenum compare_func,
82 GLenum compare_mode,
77 GLsizei width, 83 GLsizei width,
78 GLsizei height, 84 GLsizei height,
79 GLsizei depth, 85 GLsizei depth,
86 GLfloat max_lod,
87 GLfloat min_lod,
80 GLint base_level, 88 GLint base_level,
81 GLint border, 89 GLint border,
82 GLint max_level, 90 GLint max_level,
83 GLenum format, 91 GLenum format,
84 GLenum type, 92 GLenum type,
85 bool has_image, 93 bool has_image,
86 bool can_render, 94 bool can_render,
87 bool can_render_to, 95 bool can_render_to,
88 bool npot) { 96 bool npot) {
89 memset(this, 0, sizeof(TextureSignature)); 97 memset(this, 0, sizeof(TextureSignature));
90 target_ = target; 98 target_ = target;
91 level_ = level; 99 level_ = level;
92 min_filter_ = sampler_state.min_filter; 100 min_filter_ = min_filter;
93 mag_filter_ = sampler_state.mag_filter; 101 mag_filter_ = mag_filter;
94 wrap_r_ = sampler_state.wrap_r; 102 wrap_r_ = wrap_r;
95 wrap_s_ = sampler_state.wrap_s; 103 wrap_s_ = wrap_s;
96 wrap_t_ = sampler_state.wrap_t; 104 wrap_t_ = wrap_t;
97 usage_ = usage; 105 usage_ = usage;
98 internal_format_ = internal_format; 106 internal_format_ = internal_format;
99 compare_func_ = sampler_state.compare_func; 107 compare_func_ = compare_func;
100 compare_mode_ = sampler_state.compare_mode; 108 compare_mode_ = compare_mode;
101 width_ = width; 109 width_ = width;
102 height_ = height; 110 height_ = height;
103 depth_ = depth; 111 depth_ = depth;
104 max_lod_ = sampler_state.max_lod; 112 max_lod_ = max_lod;
105 min_lod_ = sampler_state.min_lod; 113 min_lod_ = min_lod;
106 base_level_ = base_level; 114 base_level_ = base_level;
107 border_ = border; 115 border_ = border;
108 max_level_ = max_level; 116 max_level_ = max_level;
109 format_ = format; 117 format_ = format;
110 type_ = type; 118 type_ = type;
111 has_image_ = has_image; 119 has_image_ = has_image;
112 can_render_ = can_render; 120 can_render_ = can_render;
113 can_render_to_ = can_render_to; 121 can_render_to_ = can_render_to;
114 npot_ = npot; 122 npot_ = npot;
115 } 123 }
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 TextureManager::~TextureManager() { 282 TextureManager::~TextureManager() {
275 for (unsigned int i = 0; i < destruction_observers_.size(); i++) 283 for (unsigned int i = 0; i < destruction_observers_.size(); i++)
276 destruction_observers_[i]->OnTextureManagerDestroying(this); 284 destruction_observers_[i]->OnTextureManagerDestroying(this);
277 285
278 DCHECK(textures_.empty()); 286 DCHECK(textures_.empty());
279 287
280 // If this triggers, that means something is keeping a reference to 288 // If this triggers, that means something is keeping a reference to
281 // a Texture belonging to this. 289 // a Texture belonging to this.
282 CHECK_EQ(texture_count_, 0u); 290 CHECK_EQ(texture_count_, 0u);
283 291
292 DCHECK_EQ(0, num_unrenderable_textures_);
284 DCHECK_EQ(0, num_unsafe_textures_); 293 DCHECK_EQ(0, num_unsafe_textures_);
285 DCHECK_EQ(0, num_uncleared_mips_); 294 DCHECK_EQ(0, num_uncleared_mips_);
286 DCHECK_EQ(0, num_images_); 295 DCHECK_EQ(0, num_images_);
287 296
288 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( 297 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
289 this); 298 this);
290 } 299 }
291 300
292 void TextureManager::Destroy(bool have_context) { 301 void TextureManager::Destroy(bool have_context) {
293 have_context_ = have_context; 302 have_context_ = have_context;
(...skipping 11 matching lines...) Expand all
305 314
306 Texture::Texture(GLuint service_id) 315 Texture::Texture(GLuint service_id)
307 : mailbox_manager_(NULL), 316 : mailbox_manager_(NULL),
308 memory_tracking_ref_(NULL), 317 memory_tracking_ref_(NULL),
309 service_id_(service_id), 318 service_id_(service_id),
310 owned_service_id_(service_id), 319 owned_service_id_(service_id),
311 cleared_(true), 320 cleared_(true),
312 num_uncleared_mips_(0), 321 num_uncleared_mips_(0),
313 num_npot_faces_(0), 322 num_npot_faces_(0),
314 target_(0), 323 target_(0),
324 min_filter_(GL_NEAREST_MIPMAP_LINEAR),
325 mag_filter_(GL_LINEAR),
326 wrap_r_(GL_REPEAT),
327 wrap_s_(GL_REPEAT),
328 wrap_t_(GL_REPEAT),
315 usage_(GL_NONE), 329 usage_(GL_NONE),
330 compare_func_(GL_LEQUAL),
331 compare_mode_(GL_NONE),
332 max_lod_(1000.0f),
333 min_lod_(-1000.0f),
316 base_level_(0), 334 base_level_(0),
317 max_level_(1000), 335 max_level_(1000),
318 max_level_set_(-1), 336 max_level_set_(-1),
319 texture_complete_(false), 337 texture_complete_(false),
320 texture_mips_dirty_(false), 338 texture_mips_dirty_(false),
321 cube_complete_(false), 339 cube_complete_(false),
322 texture_level0_dirty_(false), 340 texture_level0_dirty_(false),
323 npot_(false), 341 npot_(false),
324 has_been_bound_(false), 342 has_been_bound_(false),
325 framebuffer_attachment_count_(0), 343 framebuffer_attachment_count_(0),
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 } 434 }
417 const Texture::LevelInfo& first_face = 435 const Texture::LevelInfo& first_face =
418 face_infos_[0].level_infos[base_level_]; 436 face_infos_[0].level_infos[base_level_];
419 if (first_face.width == 0 || 437 if (first_face.width == 0 ||
420 first_face.height == 0 || 438 first_face.height == 0 ||
421 first_face.depth == 0) { 439 first_face.depth == 0) {
422 return CAN_RENDER_NEVER; 440 return CAN_RENDER_NEVER;
423 } 441 }
424 } 442 }
425 443
444 bool needs_mips = NeedsMips();
445 if (needs_mips) {
446 if (!texture_complete())
447 return CAN_RENDER_NEVER;
448 }
449
426 if (target_ == GL_TEXTURE_CUBE_MAP && !cube_complete()) 450 if (target_ == GL_TEXTURE_CUBE_MAP && !cube_complete())
427 return CAN_RENDER_NEVER; 451 return CAN_RENDER_NEVER;
428 452
429 // Texture may be renderable, but it depends on the sampler it's used with, 453 bool is_npot_compatible = !needs_mips &&
430 // the context that's using it, and the extensions available. 454 wrap_s_ == GL_CLAMP_TO_EDGE &&
431 return CAN_RENDER_NEEDS_VALIDATION; 455 wrap_t_ == GL_CLAMP_TO_EDGE;
456
457 if (!is_npot_compatible) {
458 if (target_ == GL_TEXTURE_RECTANGLE_ARB)
459 return CAN_RENDER_NEVER;
460 else if (npot())
461 return CAN_RENDER_ONLY_IF_NPOT;
462 }
463
464 return CAN_RENDER_ALWAYS;
432 } 465 }
433 466
434 bool Texture::CanRender(const FeatureInfo* feature_info) const { 467 bool Texture::CanRender(const FeatureInfo* feature_info) const {
435 return CanRenderWithSampler(feature_info, sampler_state());
436 }
437
438 bool Texture::CanRenderWithSampler(const FeatureInfo* feature_info,
439 const SamplerState& sampler_state) const {
440 switch (can_render_condition_) { 468 switch (can_render_condition_) {
441 case CAN_RENDER_ALWAYS: 469 case CAN_RENDER_ALWAYS:
442 return true; 470 return true;
443 case CAN_RENDER_NEVER: 471 case CAN_RENDER_NEVER:
444 return false; 472 return false;
445 case CAN_RENDER_NEEDS_VALIDATION: 473 case CAN_RENDER_ONLY_IF_NPOT:
446 break; 474 break;
447 } 475 }
448 476 return feature_info->feature_flags().npot_ok;
449 bool needs_mips = sampler_state.min_filter != GL_NEAREST &&
450 sampler_state.min_filter != GL_LINEAR;
451 if (needs_mips && !texture_complete())
452 return false;
453
454 if (!feature_info->IsES3Enabled()) {
455 bool is_npot_compatible = !needs_mips &&
456 sampler_state.wrap_s == GL_CLAMP_TO_EDGE &&
457 sampler_state.wrap_t == GL_CLAMP_TO_EDGE;
458
459 if (!is_npot_compatible) {
460 if (target_ == GL_TEXTURE_RECTANGLE_ARB)
461 return false;
462 else if (npot())
463 return feature_info->feature_flags().npot_ok;
464 }
465 }
466
467 if (static_cast<size_t>(base_level_) >= face_infos_[0].level_infos.size()) {
468 return false;
469 }
470
471 const Texture::LevelInfo& first_level =
472 face_infos_[0].level_infos[base_level_];
473
474 if (first_level.type == GL_FLOAT &&
475 !feature_info->feature_flags().enable_texture_float_linear &&
476 (sampler_state.min_filter != GL_NEAREST_MIPMAP_NEAREST ||
477 sampler_state.mag_filter != GL_NEAREST)) {
478 return false;
479 } else if (first_level.type == GL_HALF_FLOAT_OES &&
480 !feature_info->feature_flags().enable_texture_half_float_linear &&
481 (sampler_state.min_filter != GL_NEAREST_MIPMAP_NEAREST ||
482 sampler_state.mag_filter != GL_NEAREST)) {
483 return false;
484 }
485
486 return true;
487 } 477 }
488 478
489 void Texture::AddToSignature( 479 void Texture::AddToSignature(
490 const FeatureInfo* feature_info, 480 const FeatureInfo* feature_info,
491 GLenum target, 481 GLenum target,
492 GLint level, 482 GLint level,
493 std::string* signature) const { 483 std::string* signature) const {
494 DCHECK(feature_info); 484 DCHECK(feature_info);
495 DCHECK(signature); 485 DCHECK(signature);
496 DCHECK_GE(level, 0); 486 DCHECK_GE(level, 0);
497 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 487 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
498 DCHECK_LT(static_cast<size_t>(face_index), 488 DCHECK_LT(static_cast<size_t>(face_index),
499 face_infos_.size()); 489 face_infos_.size());
500 DCHECK_LT(static_cast<size_t>(level), 490 DCHECK_LT(static_cast<size_t>(level),
501 face_infos_[face_index].level_infos.size()); 491 face_infos_[face_index].level_infos.size());
502 492
503 const Texture::LevelInfo& info = 493 const Texture::LevelInfo& info =
504 face_infos_[face_index].level_infos[level]; 494 face_infos_[face_index].level_infos[level];
505 495
506 TextureSignature signature_data(target, 496 TextureSignature signature_data(target,
507 level, 497 level,
508 sampler_state_, 498 min_filter_,
499 mag_filter_,
500 wrap_r_,
501 wrap_s_,
502 wrap_t_,
509 usage_, 503 usage_,
510 info.internal_format, 504 info.internal_format,
505 compare_func_,
506 compare_mode_,
511 info.width, 507 info.width,
512 info.height, 508 info.height,
513 info.depth, 509 info.depth,
510 max_lod_,
511 min_lod_,
514 base_level_, 512 base_level_,
515 info.border, 513 info.border,
516 max_level_, 514 max_level_,
517 info.format, 515 info.format,
518 info.type, 516 info.type,
519 info.image.get() != NULL, 517 info.image.get() != NULL,
520 CanRender(feature_info), 518 CanRender(feature_info),
521 CanRenderTo(), 519 CanRenderTo(),
522 npot_); 520 npot_);
523 521
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 const FeatureInfo* feature_info, GLenum target, GLint max_levels) { 558 const FeatureInfo* feature_info, GLenum target, GLint max_levels) {
561 DCHECK_EQ(0u, target_); // you can only set this once. 559 DCHECK_EQ(0u, target_); // you can only set this once.
562 target_ = target; 560 target_ = target;
563 size_t num_faces = (target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 561 size_t num_faces = (target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
564 face_infos_.resize(num_faces); 562 face_infos_.resize(num_faces);
565 for (size_t ii = 0; ii < num_faces; ++ii) { 563 for (size_t ii = 0; ii < num_faces; ++ii) {
566 face_infos_[ii].level_infos.resize(max_levels); 564 face_infos_[ii].level_infos.resize(max_levels);
567 } 565 }
568 566
569 if (target == GL_TEXTURE_EXTERNAL_OES || target == GL_TEXTURE_RECTANGLE_ARB) { 567 if (target == GL_TEXTURE_EXTERNAL_OES || target == GL_TEXTURE_RECTANGLE_ARB) {
570 sampler_state_.min_filter = GL_LINEAR; 568 min_filter_ = GL_LINEAR;
571 sampler_state_.wrap_s = sampler_state_.wrap_t = GL_CLAMP_TO_EDGE; 569 wrap_s_ = wrap_t_ = GL_CLAMP_TO_EDGE;
572 } 570 }
573 571
574 if (target == GL_TEXTURE_EXTERNAL_OES) { 572 if (target == GL_TEXTURE_EXTERNAL_OES) {
575 immutable_ = true; 573 immutable_ = true;
576 } 574 }
577 Update(feature_info); 575 Update(feature_info);
578 UpdateCanRenderCondition(); 576 UpdateCanRenderCondition();
579 } 577 }
580 578
581 bool Texture::CanGenerateMipmaps( 579 bool Texture::CanGenerateMipmaps(
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 bool cleared = info->cleared_rect == gfx::Rect(info->width, info->height); 743 bool cleared = info->cleared_rect == gfx::Rect(info->width, info->height);
746 if (cleared == was_cleared) 744 if (cleared == was_cleared)
747 return; 745 return;
748 int delta = cleared ? -1 : +1; 746 int delta = cleared ? -1 : +1;
749 num_uncleared_mips_ += delta; 747 num_uncleared_mips_ += delta;
750 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) 748 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
751 (*it)->manager()->UpdateUnclearedMips(delta); 749 (*it)->manager()->UpdateUnclearedMips(delta);
752 } 750 }
753 751
754 void Texture::UpdateCanRenderCondition() { 752 void Texture::UpdateCanRenderCondition() {
755 can_render_condition_ = GetCanRenderCondition(); 753 CanRenderCondition can_render_condition = GetCanRenderCondition();
754 if (can_render_condition_ == can_render_condition)
755 return;
756 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
757 (*it)->manager()->UpdateCanRenderCondition(can_render_condition_,
758 can_render_condition);
759 can_render_condition_ = can_render_condition;
756 } 760 }
757 761
758 void Texture::UpdateHasImages() { 762 void Texture::UpdateHasImages() {
759 if (face_infos_.empty()) 763 if (face_infos_.empty())
760 return; 764 return;
761 765
762 bool has_images = false; 766 bool has_images = false;
763 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { 767 for (size_t ii = 0; ii < face_infos_.size(); ++ii) {
764 for (size_t jj = 0; jj < face_infos_[ii].level_infos.size(); ++jj) { 768 for (size_t jj = 0; jj < face_infos_[ii].level_infos.size(); ++jj) {
765 const Texture::LevelInfo& info = face_infos_[ii].level_infos[jj]; 769 const Texture::LevelInfo& info = face_infos_[ii].level_infos[jj];
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
984 case GL_TEXTURE_MIN_LOD: 988 case GL_TEXTURE_MIN_LOD:
985 case GL_TEXTURE_MAX_LOD: 989 case GL_TEXTURE_MAX_LOD:
986 { 990 {
987 GLfloat fparam = static_cast<GLfloat>(param); 991 GLfloat fparam = static_cast<GLfloat>(param);
988 return SetParameterf(feature_info, pname, fparam); 992 return SetParameterf(feature_info, pname, fparam);
989 } 993 }
990 case GL_TEXTURE_MIN_FILTER: 994 case GL_TEXTURE_MIN_FILTER:
991 if (!feature_info->validators()->texture_min_filter_mode.IsValid(param)) { 995 if (!feature_info->validators()->texture_min_filter_mode.IsValid(param)) {
992 return GL_INVALID_ENUM; 996 return GL_INVALID_ENUM;
993 } 997 }
994 sampler_state_.min_filter = param; 998 min_filter_ = param;
995 break; 999 break;
996 case GL_TEXTURE_MAG_FILTER: 1000 case GL_TEXTURE_MAG_FILTER:
997 if (!feature_info->validators()->texture_mag_filter_mode.IsValid(param)) { 1001 if (!feature_info->validators()->texture_mag_filter_mode.IsValid(param)) {
998 return GL_INVALID_ENUM; 1002 return GL_INVALID_ENUM;
999 } 1003 }
1000 sampler_state_.mag_filter = param; 1004 mag_filter_ = param;
1001 break; 1005 break;
1002 case GL_TEXTURE_WRAP_R: 1006 case GL_TEXTURE_WRAP_R:
1003 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) { 1007 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) {
1004 return GL_INVALID_ENUM; 1008 return GL_INVALID_ENUM;
1005 } 1009 }
1006 sampler_state_.wrap_r = param; 1010 wrap_r_ = param;
1007 break; 1011 break;
1008 case GL_TEXTURE_WRAP_S: 1012 case GL_TEXTURE_WRAP_S:
1009 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) { 1013 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) {
1010 return GL_INVALID_ENUM; 1014 return GL_INVALID_ENUM;
1011 } 1015 }
1012 sampler_state_.wrap_s = param; 1016 wrap_s_ = param;
1013 break; 1017 break;
1014 case GL_TEXTURE_WRAP_T: 1018 case GL_TEXTURE_WRAP_T:
1015 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) { 1019 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) {
1016 return GL_INVALID_ENUM; 1020 return GL_INVALID_ENUM;
1017 } 1021 }
1018 sampler_state_.wrap_t = param; 1022 wrap_t_ = param;
1019 break; 1023 break;
1020 case GL_TEXTURE_COMPARE_FUNC: 1024 case GL_TEXTURE_COMPARE_FUNC:
1021 if (!feature_info->validators()->texture_compare_func.IsValid(param)) { 1025 if (!feature_info->validators()->texture_compare_func.IsValid(param)) {
1022 return GL_INVALID_ENUM; 1026 return GL_INVALID_ENUM;
1023 } 1027 }
1024 sampler_state_.compare_func = param; 1028 compare_func_ = param;
1025 break; 1029 break;
1026 case GL_TEXTURE_COMPARE_MODE: 1030 case GL_TEXTURE_COMPARE_MODE:
1027 if (!feature_info->validators()->texture_compare_mode.IsValid(param)) { 1031 if (!feature_info->validators()->texture_compare_mode.IsValid(param)) {
1028 return GL_INVALID_ENUM; 1032 return GL_INVALID_ENUM;
1029 } 1033 }
1030 sampler_state_.compare_mode = param; 1034 compare_mode_ = param;
1031 break; 1035 break;
1032 case GL_TEXTURE_BASE_LEVEL: 1036 case GL_TEXTURE_BASE_LEVEL:
1033 if (param < 0) { 1037 if (param < 0) {
1034 return GL_INVALID_VALUE; 1038 return GL_INVALID_VALUE;
1035 } 1039 }
1036 UpdateBaseLevel(param); 1040 UpdateBaseLevel(param);
1037 break; 1041 break;
1038 case GL_TEXTURE_MAX_LEVEL: 1042 case GL_TEXTURE_MAX_LEVEL:
1039 if (param < 0) { 1043 if (param < 0) {
1040 return GL_INVALID_VALUE; 1044 return GL_INVALID_VALUE;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1073 case GL_TEXTURE_COMPARE_FUNC: 1077 case GL_TEXTURE_COMPARE_FUNC:
1074 case GL_TEXTURE_COMPARE_MODE: 1078 case GL_TEXTURE_COMPARE_MODE:
1075 case GL_TEXTURE_BASE_LEVEL: 1079 case GL_TEXTURE_BASE_LEVEL:
1076 case GL_TEXTURE_MAX_LEVEL: 1080 case GL_TEXTURE_MAX_LEVEL:
1077 case GL_TEXTURE_USAGE_ANGLE: 1081 case GL_TEXTURE_USAGE_ANGLE:
1078 { 1082 {
1079 GLint iparam = static_cast<GLint>(param); 1083 GLint iparam = static_cast<GLint>(param);
1080 return SetParameteri(feature_info, pname, iparam); 1084 return SetParameteri(feature_info, pname, iparam);
1081 } 1085 }
1082 case GL_TEXTURE_MIN_LOD: 1086 case GL_TEXTURE_MIN_LOD:
1083 sampler_state_.min_lod = param; 1087 min_lod_ = param;
1084 break; 1088 break;
1085 case GL_TEXTURE_MAX_LOD: 1089 case GL_TEXTURE_MAX_LOD:
1086 sampler_state_.max_lod = param; 1090 max_lod_ = param;
1087 break; 1091 break;
1088 case GL_TEXTURE_MAX_ANISOTROPY_EXT: 1092 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1089 if (param < 1.f) { 1093 if (param < 1.f) {
1090 return GL_INVALID_VALUE; 1094 return GL_INVALID_VALUE;
1091 } 1095 }
1092 break; 1096 break;
1093 default: 1097 default:
1094 NOTREACHED(); 1098 NOTREACHED();
1095 return GL_INVALID_ENUM; 1099 return GL_INVALID_ENUM;
1096 } 1100 }
(...skipping 18 matching lines...) Expand all
1115 const GLsizei levels_needed = first_face.num_mip_levels; 1119 const GLsizei levels_needed = first_face.num_mip_levels;
1116 1120
1117 texture_complete_ = 1121 texture_complete_ =
1118 max_level_set_ >= (levels_needed - 1) && max_level_set_ >= 0; 1122 max_level_set_ >= (levels_needed - 1) && max_level_set_ >= 0;
1119 cube_complete_ = (face_infos_.size() == 6) && 1123 cube_complete_ = (face_infos_.size() == 6) &&
1120 (first_level.width == first_level.height) && 1124 (first_level.width == first_level.height) &&
1121 (first_level.width > 0); 1125 (first_level.width > 0);
1122 1126
1123 if (first_level.width == 0 || first_level.height == 0) { 1127 if (first_level.width == 0 || first_level.height == 0) {
1124 texture_complete_ = false; 1128 texture_complete_ = false;
1129 } else if (first_level.type == GL_FLOAT &&
1130 !feature_info->feature_flags().enable_texture_float_linear &&
1131 (min_filter_ != GL_NEAREST_MIPMAP_NEAREST ||
1132 mag_filter_ != GL_NEAREST)) {
1133 texture_complete_ = false;
1134 } else if (first_level.type == GL_HALF_FLOAT_OES &&
1135 !feature_info->feature_flags().enable_texture_half_float_linear &&
1136 (min_filter_ != GL_NEAREST_MIPMAP_NEAREST ||
1137 mag_filter_ != GL_NEAREST)) {
1138 texture_complete_ = false;
1125 } 1139 }
1126 1140
1127 bool texture_level0_complete = true; 1141 bool texture_level0_complete = true;
1128 if (cube_complete_ && texture_level0_dirty_) { 1142 if (cube_complete_ && texture_level0_dirty_) {
1129 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { 1143 for (size_t ii = 0; ii < face_infos_.size(); ++ii) {
1130 const Texture::LevelInfo& face_base_level = 1144 const Texture::LevelInfo& face_base_level =
1131 face_infos_[ii].level_infos[base_level_]; 1145 face_infos_[ii].level_infos[base_level_];
1132 if (!TextureFaceComplete(first_level, 1146 if (!TextureFaceComplete(first_level,
1133 ii, 1147 ii,
1134 face_base_level.target, 1148 face_base_level.target,
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
1435 max_cube_map_levels_(ComputeMipMapCount(GL_TEXTURE_CUBE_MAP, 1449 max_cube_map_levels_(ComputeMipMapCount(GL_TEXTURE_CUBE_MAP,
1436 max_cube_map_texture_size, 1450 max_cube_map_texture_size,
1437 max_cube_map_texture_size, 1451 max_cube_map_texture_size,
1438 max_cube_map_texture_size)), 1452 max_cube_map_texture_size)),
1439 max_3d_levels_(ComputeMipMapCount(GL_TEXTURE_3D, 1453 max_3d_levels_(ComputeMipMapCount(GL_TEXTURE_3D,
1440 // Same as GL_TEXTURE_2D_ARRAY 1454 // Same as GL_TEXTURE_2D_ARRAY
1441 max_3d_texture_size, 1455 max_3d_texture_size,
1442 max_3d_texture_size, 1456 max_3d_texture_size,
1443 max_3d_texture_size)), 1457 max_3d_texture_size)),
1444 use_default_textures_(use_default_textures), 1458 use_default_textures_(use_default_textures),
1459 num_unrenderable_textures_(0),
1445 num_unsafe_textures_(0), 1460 num_unsafe_textures_(0),
1446 num_uncleared_mips_(0), 1461 num_uncleared_mips_(0),
1447 num_images_(0), 1462 num_images_(0),
1448 texture_count_(0), 1463 texture_count_(0),
1449 have_context_(true), 1464 have_context_(true),
1450 current_service_id_generation_(0) { 1465 current_service_id_generation_(0) {
1451 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { 1466 for (int ii = 0; ii < kNumDefaultTextures; ++ii) {
1452 black_texture_ids_[ii] = 0; 1467 black_texture_ids_[ii] = 0;
1453 } 1468 }
1454 } 1469 }
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1722 textures_.erase(it); 1737 textures_.erase(it);
1723 } 1738 }
1724 } 1739 }
1725 1740
1726 void TextureManager::StartTracking(TextureRef* ref) { 1741 void TextureManager::StartTracking(TextureRef* ref) {
1727 Texture* texture = ref->texture(); 1742 Texture* texture = ref->texture();
1728 ++texture_count_; 1743 ++texture_count_;
1729 num_uncleared_mips_ += texture->num_uncleared_mips(); 1744 num_uncleared_mips_ += texture->num_uncleared_mips();
1730 if (!texture->SafeToRenderFrom()) 1745 if (!texture->SafeToRenderFrom())
1731 ++num_unsafe_textures_; 1746 ++num_unsafe_textures_;
1747 if (!texture->CanRender(feature_info_.get()))
1748 ++num_unrenderable_textures_;
1732 if (texture->HasImages()) 1749 if (texture->HasImages())
1733 ++num_images_; 1750 ++num_images_;
1734 } 1751 }
1735 1752
1736 void TextureManager::StopTracking(TextureRef* ref) { 1753 void TextureManager::StopTracking(TextureRef* ref) {
1737 if (ref->num_observers()) { 1754 if (ref->num_observers()) {
1738 for (unsigned int i = 0; i < destruction_observers_.size(); i++) { 1755 for (unsigned int i = 0; i < destruction_observers_.size(); i++) {
1739 destruction_observers_[i]->OnTextureRefDestroying(ref); 1756 destruction_observers_[i]->OnTextureRefDestroying(ref);
1740 } 1757 }
1741 DCHECK_EQ(ref->num_observers(), 0); 1758 DCHECK_EQ(ref->num_observers(), 0);
1742 } 1759 }
1743 1760
1744 Texture* texture = ref->texture(); 1761 Texture* texture = ref->texture();
1745 1762
1746 --texture_count_; 1763 --texture_count_;
1747 if (texture->HasImages()) { 1764 if (texture->HasImages()) {
1748 DCHECK_NE(0, num_images_); 1765 DCHECK_NE(0, num_images_);
1749 --num_images_; 1766 --num_images_;
1750 } 1767 }
1768 if (!texture->CanRender(feature_info_.get())) {
1769 DCHECK_NE(0, num_unrenderable_textures_);
1770 --num_unrenderable_textures_;
1771 }
1751 if (!texture->SafeToRenderFrom()) { 1772 if (!texture->SafeToRenderFrom()) {
1752 DCHECK_NE(0, num_unsafe_textures_); 1773 DCHECK_NE(0, num_unsafe_textures_);
1753 --num_unsafe_textures_; 1774 --num_unsafe_textures_;
1754 } 1775 }
1755 num_uncleared_mips_ -= texture->num_uncleared_mips(); 1776 num_uncleared_mips_ -= texture->num_uncleared_mips();
1756 DCHECK_GE(num_uncleared_mips_, 0); 1777 DCHECK_GE(num_uncleared_mips_, 0);
1757 } 1778 }
1758 1779
1759 MemoryTypeTracker* TextureManager::GetMemTracker() { 1780 MemoryTypeTracker* TextureManager::GetMemTracker() {
1760 return memory_type_tracker_.get(); 1781 return memory_type_tracker_.get();
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1808 void TextureManager::UpdateSafeToRenderFrom(int delta) { 1829 void TextureManager::UpdateSafeToRenderFrom(int delta) {
1809 num_unsafe_textures_ += delta; 1830 num_unsafe_textures_ += delta;
1810 DCHECK_GE(num_unsafe_textures_, 0); 1831 DCHECK_GE(num_unsafe_textures_, 0);
1811 } 1832 }
1812 1833
1813 void TextureManager::UpdateUnclearedMips(int delta) { 1834 void TextureManager::UpdateUnclearedMips(int delta) {
1814 num_uncleared_mips_ += delta; 1835 num_uncleared_mips_ += delta;
1815 DCHECK_GE(num_uncleared_mips_, 0); 1836 DCHECK_GE(num_uncleared_mips_, 0);
1816 } 1837 }
1817 1838
1839 void TextureManager::UpdateCanRenderCondition(
1840 Texture::CanRenderCondition old_condition,
1841 Texture::CanRenderCondition new_condition) {
1842 if (old_condition == Texture::CAN_RENDER_NEVER ||
1843 (old_condition == Texture::CAN_RENDER_ONLY_IF_NPOT &&
1844 !feature_info_->feature_flags().npot_ok)) {
1845 DCHECK_GT(num_unrenderable_textures_, 0);
1846 --num_unrenderable_textures_;
1847 }
1848 if (new_condition == Texture::CAN_RENDER_NEVER ||
1849 (new_condition == Texture::CAN_RENDER_ONLY_IF_NPOT &&
1850 !feature_info_->feature_flags().npot_ok))
1851 ++num_unrenderable_textures_;
1852 }
1853
1818 void TextureManager::UpdateNumImages(int delta) { 1854 void TextureManager::UpdateNumImages(int delta) {
1819 num_images_ += delta; 1855 num_images_ += delta;
1820 DCHECK_GE(num_images_, 0); 1856 DCHECK_GE(num_images_, 0);
1821 } 1857 }
1822 1858
1823 void TextureManager::IncFramebufferStateChangeCount() { 1859 void TextureManager::IncFramebufferStateChangeCount() {
1824 if (framebuffer_manager_) 1860 if (framebuffer_manager_)
1825 framebuffer_manager_->IncFramebufferStateChangeCount(); 1861 framebuffer_manager_->IncFramebufferStateChangeCount();
1826 } 1862 }
1827 1863
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after
2637 uint32_t TextureManager::GetServiceIdGeneration() const { 2673 uint32_t TextureManager::GetServiceIdGeneration() const {
2638 return current_service_id_generation_; 2674 return current_service_id_generation_;
2639 } 2675 }
2640 2676
2641 void TextureManager::IncrementServiceIdGeneration() { 2677 void TextureManager::IncrementServiceIdGeneration() {
2642 current_service_id_generation_++; 2678 current_service_id_generation_++;
2643 } 2679 }
2644 2680
2645 } // namespace gles2 2681 } // namespace gles2
2646 } // namespace gpu 2682 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/texture_manager.h ('k') | gpu/command_buffer/service/texture_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698