blob: 45a0574a31e7cfe3deab01b33784a75f0fdcdcb3 [file] [log] [blame]
Brandon Jonesc9610c52014-08-25 17:02:59 -07001//
2// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// ProgramD3D.h: Defines the rx::ProgramD3D class which implements rx::ProgramImpl.
8
9#ifndef LIBGLESV2_RENDERER_PROGRAMD3D_H_
10#define LIBGLESV2_RENDERER_PROGRAMD3D_H_
11
12#include "libGLESv2/renderer/ProgramImpl.h"
Jamie Madill7acae0a2014-09-24 17:10:51 -040013#include "libGLESv2/renderer/Workarounds.h"
Brandon Jonesc9610c52014-08-25 17:02:59 -070014
Brandon Jones22502d52014-08-29 16:58:36 -070015#include <string>
16#include <vector>
17
Brandon Jonesc9610c52014-08-25 17:02:59 -070018namespace gl
19{
20struct LinkedUniform;
Brandon Jones22502d52014-08-29 16:58:36 -070021struct VariableLocation;
Brandon Jonesc9610c52014-08-25 17:02:59 -070022struct VertexFormat;
23}
24
25namespace rx
26{
27
28class UniformStorage;
29
30class ProgramD3D : public ProgramImpl
31{
32 public:
33 ProgramD3D(rx::Renderer *renderer);
34 virtual ~ProgramD3D();
35
36 static ProgramD3D *makeProgramD3D(ProgramImpl *impl);
37 static const ProgramD3D *makeProgramD3D(const ProgramImpl *impl);
38
Brandon Jones22502d52014-08-29 16:58:36 -070039 const std::vector<rx::PixelShaderOutputVariable> &getPixelShaderKey() { return mPixelShaderKey; }
Brandon Jones44151a92014-09-10 11:32:25 -070040 int getShaderVersion() const { return mShaderVersion; }
Brandon Joneseb994362014-09-24 10:27:28 -070041 GLenum getTransformFeedbackBufferMode() const { return mTransformFeedbackBufferMode; }
42 std::vector<gl::LinkedVarying> &getTransformFeedbackLinkedVaryings() { return mTransformFeedbackLinkedVaryings; }
43 sh::Attribute *getShaderAttributes() { return mShaderAttributes; }
Brandon Jones44151a92014-09-10 11:32:25 -070044
Brandon Joneseb994362014-09-24 10:27:28 -070045 bool usesPointSize() const { return mUsesPointSize; }
Brandon Jones44151a92014-09-10 11:32:25 -070046 bool usesPointSpriteEmulation() const;
47 bool usesGeometryShader() const;
Brandon Jones22502d52014-08-29 16:58:36 -070048
49 GLenum getBinaryFormat() { return GL_PROGRAM_BINARY_ANGLE; }
Geoff Langb543aff2014-09-30 14:52:54 -040050 gl::LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream);
51 gl::Error save(gl::BinaryOutputStream *stream);
Brandon Jones22502d52014-08-29 16:58:36 -070052
Geoff Langb543aff2014-09-30 14:52:54 -040053 gl::Error getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo, ShaderExecutable **outExectuable);
54 gl::Error getPixelExecutableForOutputLayout(const std::vector<GLenum> &outputLayout, ShaderExecutable **outExectuable);
55 gl::Error getVertexExecutableForInputLayout(const gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS], ShaderExecutable **outExectuable);
Brandon Joneseb994362014-09-24 10:27:28 -070056 ShaderExecutable *getGeometryExecutable() const { return mGeometryExecutable; }
57
Geoff Langb543aff2014-09-30 14:52:54 -040058 gl::LinkResult compileProgramExecutables(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
59 int registers);
Brandon Jones22502d52014-08-29 16:58:36 -070060
Geoff Langb543aff2014-09-30 14:52:54 -040061 gl::LinkResult link(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
62 const std::vector<std::string> &transformFeedbackVaryings, GLenum transformFeedbackBufferMode,
63 int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
64 std::map<int, gl::VariableLocation> *outputVariables, const gl::Caps &caps);
Brandon Jonesc9610c52014-08-25 17:02:59 -070065
Brandon Jones44151a92014-09-10 11:32:25 -070066 void getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const;
67
Brandon Jonesc9610c52014-08-25 17:02:59 -070068 void initializeUniformStorage(const std::vector<gl::LinkedUniform*> &uniforms);
Brandon Jones18bd4102014-09-22 14:21:44 -070069 gl::Error applyUniforms(const std::vector<gl::LinkedUniform*> &uniforms);
70 gl::Error applyUniformBuffers(const std::vector<gl::UniformBlock*> uniformBlocks, const std::vector<gl::Buffer*> boundBuffers,
71 const gl::Caps &caps);
72 bool assignUniformBlockRegister(gl::InfoLog &infoLog, gl::UniformBlock *uniformBlock, GLenum shader,
73 unsigned int registerIndex, const gl::Caps &caps);
74 unsigned int getReservedUniformVectors(GLenum shader);
Brandon Jonesc9610c52014-08-25 17:02:59 -070075
76 const UniformStorage &getVertexUniformStorage() const { return *mVertexUniformStorage; }
77 const UniformStorage &getFragmentUniformStorage() const { return *mFragmentUniformStorage; }
78
79 void reset();
80
81 private:
82 DISALLOW_COPY_AND_ASSIGN(ProgramD3D);
83
Brandon Joneseb994362014-09-24 10:27:28 -070084 class VertexExecutable
85 {
86 public:
87 VertexExecutable(const gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS],
88 const GLenum signature[gl::MAX_VERTEX_ATTRIBS],
89 rx::ShaderExecutable *shaderExecutable);
90 ~VertexExecutable();
91
92 bool matchesSignature(const GLenum convertedLayout[gl::MAX_VERTEX_ATTRIBS]) const;
93
94 const gl::VertexFormat *inputs() const { return mInputs; }
95 const GLenum *signature() const { return mSignature; }
96 rx::ShaderExecutable *shaderExecutable() const { return mShaderExecutable; }
97
98 private:
99 gl::VertexFormat mInputs[gl::MAX_VERTEX_ATTRIBS];
100 GLenum mSignature[gl::MAX_VERTEX_ATTRIBS];
101 rx::ShaderExecutable *mShaderExecutable;
102 };
103
104 class PixelExecutable
105 {
106 public:
107 PixelExecutable(const std::vector<GLenum> &outputSignature, rx::ShaderExecutable *shaderExecutable);
108 ~PixelExecutable();
109
110 bool matchesSignature(const std::vector<GLenum> &signature) const { return mOutputSignature == signature; }
111
112 const std::vector<GLenum> &outputSignature() const { return mOutputSignature; }
113 rx::ShaderExecutable *shaderExecutable() const { return mShaderExecutable; }
114
115 private:
116 std::vector<GLenum> mOutputSignature;
117 rx::ShaderExecutable *mShaderExecutable;
118 };
119
Brandon Jonesc9610c52014-08-25 17:02:59 -0700120 Renderer *mRenderer;
121 DynamicHLSL *mDynamicHLSL;
122
Brandon Joneseb994362014-09-24 10:27:28 -0700123 std::vector<VertexExecutable *> mVertexExecutables;
124 std::vector<PixelExecutable *> mPixelExecutables;
125 rx::ShaderExecutable *mGeometryExecutable;
126
Brandon Jones22502d52014-08-29 16:58:36 -0700127 std::string mVertexHLSL;
128 rx::D3DWorkaroundType mVertexWorkarounds;
129
130 std::string mPixelHLSL;
131 rx::D3DWorkaroundType mPixelWorkarounds;
132 bool mUsesFragDepth;
133 std::vector<rx::PixelShaderOutputVariable> mPixelShaderKey;
134
Brandon Jones44151a92014-09-10 11:32:25 -0700135 bool mUsesPointSize;
136
Brandon Jonesc9610c52014-08-25 17:02:59 -0700137 UniformStorage *mVertexUniformStorage;
138 UniformStorage *mFragmentUniformStorage;
Brandon Jones44151a92014-09-10 11:32:25 -0700139
Brandon Joneseb994362014-09-24 10:27:28 -0700140 GLenum mTransformFeedbackBufferMode;
141 std::vector<gl::LinkedVarying> mTransformFeedbackLinkedVaryings;
142
143 sh::Attribute mShaderAttributes[gl::MAX_VERTEX_ATTRIBS];
144
Brandon Jones44151a92014-09-10 11:32:25 -0700145 int mShaderVersion;
Brandon Jonesc9610c52014-08-25 17:02:59 -0700146};
147
148}
149
150#endif // LIBGLESV2_RENDERER_PROGRAMD3D_H_