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

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: fix the bug in Windows gpu bot 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..907cb70ed724b317c14ad07777e1802bc60640c1 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) {
Zhenyao Mo 2016/07/21 13:10:46 See, if size() > 16, your code will be wrong.
yunchao 2016/07/22 13:43:54 Acknowledged.
+ 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;
+ }
+}
+
void Program::UpdateUniformBlockSizeInfo() {
switch (feature_info().context_type()) {
case CONTEXT_TYPE_OPENGLES2:
@@ -623,6 +650,7 @@ void Program::Update() {
UpdateFragmentInputs();
UpdateProgramOutputs();
UpdateFragmentOutputBaseTypes();
+ UpdateVertexInputBaseTypes();
UpdateUniformBlockSizeInfo();
valid_ = true;

Powered by Google App Engine
This is Rietveld 408576698