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

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: update vertex attrib base type for vertexAttrib{I}Pointer only if the vertex attrib array is enabled 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 daaa68c95dcf487b23ea9894a9d8dd1ef50abe91..1ce4b24d1d17af78e0687d22589f6190799a9f2d 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;
@@ -296,7 +307,9 @@ Program::Program(ProgramManager* manager, GLuint service_id)
uniforms_cleared_(false),
transform_feedback_buffer_mode_(GL_NONE),
fragment_output_type_mask_(0u),
- fragment_output_written_mask_(0u) {
+ fragment_output_written_mask_(0u),
+ vertex_input_type_mask_(0u),
+ vertex_input_written_mask_(0u) {
DCHECK(manager_);
manager_->StartTracking(this);
}
@@ -316,6 +329,8 @@ void Program::Reset() {
attrib_location_to_index_map_.clear();
fragment_output_type_mask_ = 0u;
fragment_output_written_mask_ = 0u;
+ vertex_input_type_mask_ = 0u;
+ vertex_input_written_mask_ = 0u;
}
void Program::UpdateFragmentOutputBaseTypes() {
@@ -351,11 +366,23 @@ 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() {
+ vertex_input_type_mask_ = 0u;
+ vertex_input_written_mask_ = 0u;
+ for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) {
+ const VertexAttrib& input = attrib_infos_[ii];
+ int shift_bits = input.location * 2;
+ vertex_input_written_mask_ |= 0x3 << shift_bits;
+ vertex_input_type_mask_ |=
+ InputOutputTypeToBaseType(true, input.type) << shift_bits;
+ }
+}
+
std::string Program::ProcessLogInfo(
const std::string& log) {
std::string output;
@@ -590,6 +617,7 @@ void Program::Update() {
UpdateFragmentInputs();
UpdateProgramOutputs();
UpdateFragmentOutputBaseTypes();
+ UpdateVertexInputBaseTypes();
valid_ = true;
}

Powered by Google App Engine
This is Rietveld 408576698