blob: 0ca4643846cb7d0b0793fe166f69b7e1b2f146d0 [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"
13
Brandon Jones22502d52014-08-29 16:58:36 -070014#include <string>
15#include <vector>
16
Brandon Jonesc9610c52014-08-25 17:02:59 -070017namespace gl
18{
19struct LinkedUniform;
Brandon Jones22502d52014-08-29 16:58:36 -070020struct VariableLocation;
Brandon Jonesc9610c52014-08-25 17:02:59 -070021struct VertexFormat;
22}
23
24namespace rx
25{
26
27class UniformStorage;
28
29class ProgramD3D : public ProgramImpl
30{
31 public:
32 ProgramD3D(rx::Renderer *renderer);
33 virtual ~ProgramD3D();
34
35 static ProgramD3D *makeProgramD3D(ProgramImpl *impl);
36 static const ProgramD3D *makeProgramD3D(const ProgramImpl *impl);
37
Brandon Jones22502d52014-08-29 16:58:36 -070038 const std::vector<rx::PixelShaderOutputVariable> &getPixelShaderKey() { return mPixelShaderKey; }
Brandon Jones44151a92014-09-10 11:32:25 -070039 int getShaderVersion() const { return mShaderVersion; }
40
41 bool usesPointSize() const;
42 bool usesPointSpriteEmulation() const;
43 bool usesGeometryShader() const;
Brandon Jones22502d52014-08-29 16:58:36 -070044
45 GLenum getBinaryFormat() { return GL_PROGRAM_BINARY_ANGLE; }
46 bool load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream);
47 bool save(gl::BinaryOutputStream *stream);
48
49 ShaderExecutable *getPixelExecutableForOutputLayout(gl::InfoLog &infoLog, const std::vector<GLenum> &outputSignature,
50 const std::vector<gl::LinkedVarying> &transformFeedbackLinkedVaryings,
51 bool separatedOutputBuffers);
52 ShaderExecutable *getVertexExecutableForInputLayout(gl::InfoLog &infoLog,
53 const gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS],
54 const sh::Attribute shaderAttributes[],
55 const std::vector<gl::LinkedVarying> &transformFeedbackLinkedVaryings,
56 bool separatedOutputBuffers);
Brandon Jones44151a92014-09-10 11:32:25 -070057 ShaderExecutable *getGeometryExecutable(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
58 const std::vector<gl::LinkedVarying> &transformFeedbackLinkedVaryings,
59 bool separatedOutputBuffers, int registers);
Brandon Jones18bd4102014-09-22 14:21:44 -070060 ShaderExecutable *loadExecutable(const void *function, size_t length, rx::ShaderType type,
61 const std::vector<gl::LinkedVarying> &transformFeedbackLinkedVaryings,
62 bool separatedOutputBuffers);
Brandon Jones22502d52014-08-29 16:58:36 -070063
64 bool link(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
65 const std::vector<std::string> &transformFeedbackVaryings, int *registers,
66 std::vector<gl::LinkedVarying> *linkedVaryings, std::map<int, gl::VariableLocation> *outputVariables);
Brandon Jonesc9610c52014-08-25 17:02:59 -070067
Brandon Jones44151a92014-09-10 11:32:25 -070068 void getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const;
69
Brandon Jonesc9610c52014-08-25 17:02:59 -070070 void initializeUniformStorage(const std::vector<gl::LinkedUniform*> &uniforms);
Brandon Jones18bd4102014-09-22 14:21:44 -070071 gl::Error applyUniforms(const std::vector<gl::LinkedUniform*> &uniforms);
72 gl::Error applyUniformBuffers(const std::vector<gl::UniformBlock*> uniformBlocks, const std::vector<gl::Buffer*> boundBuffers,
73 const gl::Caps &caps);
74 bool assignUniformBlockRegister(gl::InfoLog &infoLog, gl::UniformBlock *uniformBlock, GLenum shader,
75 unsigned int registerIndex, const gl::Caps &caps);
76 unsigned int getReservedUniformVectors(GLenum shader);
Brandon Jonesc9610c52014-08-25 17:02:59 -070077
78 const UniformStorage &getVertexUniformStorage() const { return *mVertexUniformStorage; }
79 const UniformStorage &getFragmentUniformStorage() const { return *mFragmentUniformStorage; }
80
81 void reset();
82
83 private:
84 DISALLOW_COPY_AND_ASSIGN(ProgramD3D);
85
86 Renderer *mRenderer;
87 DynamicHLSL *mDynamicHLSL;
88
Brandon Jones22502d52014-08-29 16:58:36 -070089 std::string mVertexHLSL;
90 rx::D3DWorkaroundType mVertexWorkarounds;
91
92 std::string mPixelHLSL;
93 rx::D3DWorkaroundType mPixelWorkarounds;
94 bool mUsesFragDepth;
95 std::vector<rx::PixelShaderOutputVariable> mPixelShaderKey;
96
Brandon Jones44151a92014-09-10 11:32:25 -070097 bool mUsesPointSize;
98
Brandon Jonesc9610c52014-08-25 17:02:59 -070099 UniformStorage *mVertexUniformStorage;
100 UniformStorage *mFragmentUniformStorage;
Brandon Jones44151a92014-09-10 11:32:25 -0700101
102 int mShaderVersion;
Brandon Jonesc9610c52014-08-25 17:02:59 -0700103};
104
105}
106
107#endif // LIBGLESV2_RENDERER_PROGRAMD3D_H_