blob: d645c57daa0e06c8e919ea8e5eefd67d2d76c378 [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
38 Renderer *getRenderer() { return mRenderer; }
39 DynamicHLSL *getDynamicHLSL() { return mDynamicHLSL; }
Brandon Jones22502d52014-08-29 16:58:36 -070040 const std::vector<rx::PixelShaderOutputVariable> &getPixelShaderKey() { return mPixelShaderKey; }
41
42 GLenum getBinaryFormat() { return GL_PROGRAM_BINARY_ANGLE; }
43 bool load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream);
44 bool save(gl::BinaryOutputStream *stream);
45
46 ShaderExecutable *getPixelExecutableForOutputLayout(gl::InfoLog &infoLog, const std::vector<GLenum> &outputSignature,
47 const std::vector<gl::LinkedVarying> &transformFeedbackLinkedVaryings,
48 bool separatedOutputBuffers);
49 ShaderExecutable *getVertexExecutableForInputLayout(gl::InfoLog &infoLog,
50 const gl::VertexFormat inputLayout[gl::MAX_VERTEX_ATTRIBS],
51 const sh::Attribute shaderAttributes[],
52 const std::vector<gl::LinkedVarying> &transformFeedbackLinkedVaryings,
53 bool separatedOutputBuffers);
54
55 bool link(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
56 const std::vector<std::string> &transformFeedbackVaryings, int *registers,
57 std::vector<gl::LinkedVarying> *linkedVaryings, std::map<int, gl::VariableLocation> *outputVariables);
Brandon Jonesc9610c52014-08-25 17:02:59 -070058
59 // D3D only
60 void initializeUniformStorage(const std::vector<gl::LinkedUniform*> &uniforms);
61
62 const UniformStorage &getVertexUniformStorage() const { return *mVertexUniformStorage; }
63 const UniformStorage &getFragmentUniformStorage() const { return *mFragmentUniformStorage; }
64
65 void reset();
66
67 private:
68 DISALLOW_COPY_AND_ASSIGN(ProgramD3D);
69
70 Renderer *mRenderer;
71 DynamicHLSL *mDynamicHLSL;
72
Brandon Jones22502d52014-08-29 16:58:36 -070073 std::string mVertexHLSL;
74 rx::D3DWorkaroundType mVertexWorkarounds;
75
76 std::string mPixelHLSL;
77 rx::D3DWorkaroundType mPixelWorkarounds;
78 bool mUsesFragDepth;
79 std::vector<rx::PixelShaderOutputVariable> mPixelShaderKey;
80
Brandon Jonesc9610c52014-08-25 17:02:59 -070081 UniformStorage *mVertexUniformStorage;
82 UniformStorage *mFragmentUniformStorage;
83};
84
85}
86
87#endif // LIBGLESV2_RENDERER_PROGRAMD3D_H_