1 //
2 // Copyright (c) 2012-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 // ShaderExecutable11.cpp: Implements a D3D11-specific class to contain shader
8 // executable implementation details.
9 
10 #include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h"
11 #include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
12 
13 namespace rx
14 {
15 
ShaderExecutable11(const void * function,size_t length,d3d11::PixelShader && executable)16 ShaderExecutable11::ShaderExecutable11(const void *function,
17                                        size_t length,
18                                        d3d11::PixelShader &&executable)
19     : ShaderExecutableD3D(function, length),
20       mPixelExecutable(std::move(executable)),
21       mVertexExecutable(),
22       mGeometryExecutable(),
23       mStreamOutExecutable(),
24       mComputeExecutable()
25 {
26 }
27 
ShaderExecutable11(const void * function,size_t length,d3d11::VertexShader && executable,d3d11::GeometryShader && streamOut)28 ShaderExecutable11::ShaderExecutable11(const void *function,
29                                        size_t length,
30                                        d3d11::VertexShader &&executable,
31                                        d3d11::GeometryShader &&streamOut)
32     : ShaderExecutableD3D(function, length),
33       mPixelExecutable(),
34       mVertexExecutable(std::move(executable)),
35       mGeometryExecutable(),
36       mStreamOutExecutable(std::move(streamOut)),
37       mComputeExecutable()
38 {
39 }
40 
ShaderExecutable11(const void * function,size_t length,d3d11::GeometryShader && executable)41 ShaderExecutable11::ShaderExecutable11(const void *function,
42                                        size_t length,
43                                        d3d11::GeometryShader &&executable)
44     : ShaderExecutableD3D(function, length),
45       mPixelExecutable(),
46       mVertexExecutable(),
47       mGeometryExecutable(std::move(executable)),
48       mStreamOutExecutable(),
49       mComputeExecutable()
50 {
51 }
52 
ShaderExecutable11(const void * function,size_t length,d3d11::ComputeShader && executable)53 ShaderExecutable11::ShaderExecutable11(const void *function,
54                                        size_t length,
55                                        d3d11::ComputeShader &&executable)
56     : ShaderExecutableD3D(function, length),
57       mPixelExecutable(),
58       mVertexExecutable(),
59       mGeometryExecutable(),
60       mStreamOutExecutable(),
61       mComputeExecutable(std::move(executable))
62 {
63 }
64 
~ShaderExecutable11()65 ShaderExecutable11::~ShaderExecutable11()
66 {
67 }
68 
getVertexShader() const69 const d3d11::VertexShader &ShaderExecutable11::getVertexShader() const
70 {
71     return mVertexExecutable;
72 }
73 
getPixelShader() const74 const d3d11::PixelShader &ShaderExecutable11::getPixelShader() const
75 {
76     return mPixelExecutable;
77 }
78 
getGeometryShader() const79 const d3d11::GeometryShader &ShaderExecutable11::getGeometryShader() const
80 {
81     return mGeometryExecutable;
82 }
83 
getStreamOutShader() const84 const d3d11::GeometryShader &ShaderExecutable11::getStreamOutShader() const
85 {
86     return mStreamOutExecutable;
87 }
88 
getComputeShader() const89 const d3d11::ComputeShader &ShaderExecutable11::getComputeShader() const
90 {
91     return mComputeExecutable;
92 }
93 
UniformStorage11(size_t initialSize)94 UniformStorage11::UniformStorage11(size_t initialSize)
95     : UniformStorageD3D(initialSize), mConstantBuffer()
96 {
97 }
98 
~UniformStorage11()99 UniformStorage11::~UniformStorage11()
100 {
101 }
102 
getConstantBuffer(Renderer11 * renderer,const d3d11::Buffer ** bufferOut)103 gl::Error UniformStorage11::getConstantBuffer(Renderer11 *renderer, const d3d11::Buffer **bufferOut)
104 {
105     if (size() > 0 && !mConstantBuffer.valid())
106     {
107         D3D11_BUFFER_DESC desc = {0};
108         desc.ByteWidth         = static_cast<unsigned int>(size());
109         desc.Usage             = D3D11_USAGE_DEFAULT;
110         desc.BindFlags         = D3D11_BIND_CONSTANT_BUFFER;
111 
112         ANGLE_TRY(renderer->allocateResource(desc, &mConstantBuffer));
113     }
114 
115     *bufferOut = &mConstantBuffer;
116     return gl::NoError();
117 }
118 
119 }  // namespace rx
120