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

Unified Diff: gpu/command_buffer/service/program_manager.cc

Issue 2148723004: WebGL 2: make sure VertexAttrib type match the corresponding attrib type in shader (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: code clean Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/program_manager.cc
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc
index 8ce0c847d61397dda43d2ee6411ab78fb6639fa1..ca0725533b0a172b70f41b72dd2e2b2dc1f54fc2 100644
--- a/gpu/command_buffer/service/program_manager.cc
+++ b/gpu/command_buffer/service/program_manager.cc
@@ -117,7 +117,7 @@ uint32_t ComputeOffset(const void* start, const void* position) {
static_cast<const uint8_t*>(start);
}
-ShaderVariableBaseType FragmentOutputTypeToBaseType(GLenum type) {
+ShaderVariableBaseType InputOutputTypeToBaseType(bool is_input, GLenum type) {
switch (type) {
case GL_INT:
case GL_INT_VEC2:
@@ -134,6 +134,17 @@ ShaderVariableBaseType FragmentOutputTypeToBaseType(GLenum type) {
case GL_FLOAT_VEC3:
case GL_FLOAT_VEC4:
return SHADER_VARIABLE_FLOAT;
+ case GL_FLOAT_MAT2:
+ case GL_FLOAT_MAT3:
+ case GL_FLOAT_MAT4:
+ case GL_FLOAT_MAT2x3:
+ case GL_FLOAT_MAT3x2:
+ case GL_FLOAT_MAT2x4:
+ case GL_FLOAT_MAT4x2:
+ case GL_FLOAT_MAT3x4:
+ case GL_FLOAT_MAT4x3:
+ DCHECK(is_input);
+ return SHADER_VARIABLE_FLOAT;
default:
NOTREACHED();
return SHADER_VARIABLE_UNDEFINED_TYPE;
@@ -316,6 +327,8 @@ void Program::Reset() {
attrib_location_to_index_map_.clear();
fragment_output_type_mask_ = 0u;
fragment_output_written_mask_ = 0u;
+ vertex_input_base_type_mask_.clear();
+ vertex_input_type_written_mask_.clear();
}
void Program::UpdateFragmentOutputBaseTypes() {
@@ -351,8 +364,33 @@ void Program::UpdateFragmentOutputBaseTypes() {
int shift_bits = ii * 2;
fragment_output_written_mask_ |= 0x3 << shift_bits;
fragment_output_type_mask_ |=
- FragmentOutputTypeToBaseType(output.type) << shift_bits;
+ InputOutputTypeToBaseType(false, output.type) << shift_bits;
+ }
+ }
+}
+
+void Program::UpdateVertexInputBaseTypes() {
+ max_vertex_attribs_ = manager_->max_vertex_attribs();
+ uint32_t packed_size = max_vertex_attribs_ / 16;
+ packed_size += (max_vertex_attribs_ % 16 == 0) ? 0 : 1;
+ vertex_input_base_type_mask_.resize(packed_size);
+ vertex_input_type_written_mask_.resize(packed_size);
+
+ for (uint32_t ii = 0; ii < packed_size; ++ii) {
+ vertex_input_type_written_mask_[ii] = 0u;
+ vertex_input_base_type_mask_[ii] = 0u;
+ }
+
+ for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) {
+ DCHECK(ii < max_vertex_attribs_);
+ const VertexAttrib& input = attrib_infos_[ii];
+ if (ProgramManager::HasBuiltInPrefix(input.name)) {
+ continue;
}
+ int shift_bits = (input.location % 16) * 2;
+ vertex_input_type_written_mask_[ii / 16] |= 0x3 << shift_bits;
+ vertex_input_base_type_mask_[ii / 16] |=
+ InputOutputTypeToBaseType(true, input.type) << shift_bits;
}
}
@@ -623,6 +661,7 @@ void Program::Update() {
UpdateFragmentInputs();
UpdateProgramOutputs();
UpdateFragmentOutputBaseTypes();
+ UpdateVertexInputBaseTypes();
UpdateUniformBlockSizeInfo();
valid_ = true;
@@ -2376,6 +2415,7 @@ ProgramManager::ProgramManager(
uint32_t max_varying_vectors,
uint32_t max_draw_buffers,
uint32_t max_dual_source_draw_buffers,
+ uint32_t max_vertex_attribs,
const GpuPreferences& gpu_preferences,
FeatureInfo* feature_info)
: program_count_(0),
@@ -2384,6 +2424,7 @@ ProgramManager::ProgramManager(
max_varying_vectors_(max_varying_vectors),
max_draw_buffers_(max_draw_buffers),
max_dual_source_draw_buffers_(max_dual_source_draw_buffers),
+ max_vertex_attribs_(max_vertex_attribs),
gpu_preferences_(gpu_preferences),
feature_info_(feature_info) {}

Powered by Google App Engine
This is Rietveld 408576698