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

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

Issue 1309743005: command_buffer: Implement EXT_blend_func_extended (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@new-05-path-fragment-input-gen
Patch Set: rebase Created 5 years 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
« no previous file with comments | « gpu/command_buffer/service/mocks.h ('k') | gpu/command_buffer/service/program_manager.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/program_manager.h
diff --git a/gpu/command_buffer/service/program_manager.h b/gpu/command_buffer/service/program_manager.h
index 942659dddb037533ff533f990776686969f30cdc..eb3be7c3418418162f809f7cd308b6551c6f0826 100644
--- a/gpu/command_buffer/service/program_manager.h
+++ b/gpu/command_buffer/service/program_manager.h
@@ -20,6 +20,7 @@
namespace gpu {
namespace gles2 {
+class FeatureInfo;
class ProgramCache;
class ProgramManager;
class Shader;
@@ -69,6 +70,16 @@ class GPU_EXPORT Program : public base::RefCounted<Program> {
GLenum type;
GLuint location;
};
+ struct ProgramOutputInfo {
+ ProgramOutputInfo(GLuint _color_name,
+ GLuint _index,
+ const std::string& _name)
+ : color_name(_color_name), index(_index), name(_name) {}
+ ProgramOutputInfo() : color_name(0), index(0) {}
+ GLuint color_name;
+ GLuint index;
+ std::string name;
+ };
struct UniformInfo {
UniformInfo();
@@ -144,8 +155,10 @@ class GPU_EXPORT Program : public base::RefCounted<Program> {
typedef std::vector<FragmentInputInfo> FragmentInputInfoVector;
typedef std::vector<ShaderVariableLocationEntry<FragmentInputInfo>>
FragmentInputLocationVector;
+ typedef std::vector<ProgramOutputInfo> ProgramOutputInfoVector;
typedef std::vector<int> SamplerIndices;
typedef std::map<std::string, GLint> LocationMap;
+ typedef std::map<std::string, std::pair<GLuint, GLuint>> LocationIndexMap;
typedef std::vector<std::string> StringVector;
Program(ProgramManager* manager, GLuint service_id);
@@ -209,6 +222,10 @@ class GPU_EXPORT Program : public base::RefCounted<Program> {
// -1 for bound, non-existing uniform.
bool IsInactiveUniformLocationByFakeLocation(GLint fake_location) const;
+ // Gets the ProgramOutputInfo of a fragment output by name.
+ const ProgramOutputInfo* GetProgramOutputInfo(
+ const std::string& original_name) const;
+
// Gets all the program info.
void GetProgramInfo(
ProgramManager* manager, CommonDecoder::Bucket* bucket) const;
@@ -226,6 +243,14 @@ class GPU_EXPORT Program : public base::RefCounted<Program> {
// glGetProgramInfoCHROMIUM.
bool GetUniformsES3(CommonDecoder::Bucket* bucket) const;
+ // Returns the fragment shader output variable color name binding.
+ // Returns -1 if |original_name| is not an out variable or error.
+ GLint GetFragDataLocation(const std::string& original_name) const;
+
+ // Returns the fragment shader output variable color index binding.
+ // Returns -1 if |original_name| is not an out variable or error.
+ GLint GetFragDataIndex(const std::string& original_name) const;
+
// Sets the sampler values for a uniform.
// This is safe to call for any location. If the location is not
// a sampler uniform nothing will happen.
@@ -285,6 +310,15 @@ class GPU_EXPORT Program : public base::RefCounted<Program> {
// glBindFragmentInputLocationCHROMIUM() call.
void SetFragmentInputLocationBinding(const std::string& name, GLint location);
+ // Sets program output variable location. Also sets color index to zero.
+ void SetProgramOutputLocationBinding(const std::string& name,
+ GLuint colorName);
+
+ // Sets program output variable location and color index.
+ void SetProgramOutputLocationIndexedBinding(const std::string& name,
+ GLuint colorName,
+ GLuint index);
+
// Detects if there are attribute location conflicts from
// glBindAttribLocation() calls.
// We only consider the declared attributes in the program.
@@ -310,6 +344,11 @@ class GPU_EXPORT Program : public base::RefCounted<Program> {
// We only consider the statically used fragment inputs in the program.
bool DetectFragmentInputLocationBindingConflicts() const;
+ // Detects if there are program output location conflicts from
+ // glBindFragDataLocation and ..LocationIndexedEXT calls.
+ // We only consider the statically used program outputs in the program.
+ bool DetectProgramOutputLocationBindingConflicts() const;
+
// Return true if any built-in invariant matching rules are broken as in
// GLSL ES spec 1.00.17, section 4.6.4, Invariance and Linkage.
bool DetectBuiltInInvariantConflicts() const;
@@ -372,6 +411,7 @@ class GPU_EXPORT Program : public base::RefCounted<Program> {
void Update();
void UpdateUniforms();
void UpdateFragmentInputs();
+ void UpdateProgramOutputs();
// Process the program log, replacing the hashed names with original names.
std::string ProcessLogInfo(const std::string& log);
@@ -405,6 +445,8 @@ class GPU_EXPORT Program : public base::RefCounted<Program> {
// Returns false upon failure.
bool ExecuteTransformFeedbackVaryingsCall();
+ void ExecuteProgramOutputBindCalls();
+
// Query VertexAttrib data returned by ANGLE translator by the mapped name.
void GetVertexAttribData(
const std::string& name, std::string* original_name, GLenum* type) const;
@@ -447,6 +489,8 @@ class GPU_EXPORT Program : public base::RefCounted<Program> {
FragmentInputInfoVector fragment_input_infos_;
FragmentInputLocationVector fragment_input_locations_;
+ ProgramOutputInfoVector program_output_infos_;
+
// The program this Program is tracking.
GLuint service_id_;
@@ -482,6 +526,10 @@ class GPU_EXPORT Program : public base::RefCounted<Program> {
// Fragment input-location binding map from
// glBindFragmentInputLocationCHROMIUM() calls.
LocationMap bind_fragment_input_location_map_;
+
+ // output variable - (location,index) binding map from
+ // glBindFragDataLocation() and ..IndexedEXT() calls.
+ LocationIndexMap bind_program_output_location_index_map_;
};
// Tracks the Programs.
@@ -492,6 +540,7 @@ class GPU_EXPORT ProgramManager {
public:
explicit ProgramManager(ProgramCache* program_cache,
uint32 max_varying_vectors,
+ uint32 max_dual_source_draw_buffers,
FeatureInfo* feature_info);
~ProgramManager();
@@ -522,8 +571,9 @@ class GPU_EXPORT ProgramManager {
// Clears the uniforms for this program.
void ClearUniforms(Program* program);
- // Returns true if prefix is invalid for gl.
- static bool IsInvalidPrefix(const char* name, size_t length);
+ // Returns true if |name| has a prefix that is intended for GL built-in shader
+ // variables.
+ static bool HasBuiltInPrefix(const std::string& name);
// Check if a Program is owned by this ProgramManager.
bool IsOwned(Program* program) const;
@@ -534,6 +584,10 @@ class GPU_EXPORT ProgramManager {
return max_varying_vectors_;
}
+ uint32 max_dual_source_draw_buffers() const {
+ return max_dual_source_draw_buffers_;
+ }
+
private:
friend class Program;
@@ -560,6 +614,7 @@ class GPU_EXPORT ProgramManager {
ProgramCache* program_cache_;
uint32 max_varying_vectors_;
+ uint32 max_dual_source_draw_buffers_;
scoped_refptr<FeatureInfo> feature_info_;
« no previous file with comments | « gpu/command_buffer/service/mocks.h ('k') | gpu/command_buffer/service/program_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698