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 "libGLESv2/renderer/d3d/d3d11/ShaderExecutable11.h" 11 #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h" 12 13 namespace rx 14 { 15 16 ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable) 17 : ShaderExecutable(function, length) 18 { 19 mPixelExecutable = executable; 20 mVertexExecutable = NULL; 21 mGeometryExecutable = NULL; 22 mStreamOutExecutable = NULL; 23 } 24 25 ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable, ID3D11GeometryShader *streamOut) 26 : ShaderExecutable(function, length) 27 { 28 mVertexExecutable = executable; 29 mPixelExecutable = NULL; 30 mGeometryExecutable = NULL; 31 mStreamOutExecutable = streamOut; 32 } 33 34 ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable) 35 : ShaderExecutable(function, length) 36 { 37 mGeometryExecutable = executable; 38 mVertexExecutable = NULL; 39 mPixelExecutable = NULL; 40 mStreamOutExecutable = NULL; 41 } 42 43 ShaderExecutable11::~ShaderExecutable11() 44 { 45 SafeRelease(mVertexExecutable); 46 SafeRelease(mPixelExecutable); 47 SafeRelease(mGeometryExecutable); 48 SafeRelease(mStreamOutExecutable); 49 } 50 51 ShaderExecutable11 *ShaderExecutable11::makeShaderExecutable11(ShaderExecutable *executable) 52 { 53 ASSERT(HAS_DYNAMIC_TYPE(ShaderExecutable11*, executable)); 54 return static_cast<ShaderExecutable11*>(executable); 55 } 56 57 ID3D11VertexShader *ShaderExecutable11::getVertexShader() const 58 { 59 return mVertexExecutable; 60 } 61 62 ID3D11PixelShader *ShaderExecutable11::getPixelShader() const 63 { 64 return mPixelExecutable; 65 } 66 67 ID3D11GeometryShader *ShaderExecutable11::getGeometryShader() const 68 { 69 return mGeometryExecutable; 70 } 71 72 ID3D11GeometryShader *ShaderExecutable11::getStreamOutShader() const 73 { 74 return mStreamOutExecutable; 75 } 76 77 UniformStorage11::UniformStorage11(Renderer11 *renderer, size_t initialSize) 78 : UniformStorage(initialSize), 79 mConstantBuffer(NULL) 80 { 81 ID3D11Device *d3d11Device = renderer->getDevice(); 82 83 if (initialSize > 0) 84 { 85 D3D11_BUFFER_DESC constantBufferDescription = {0}; 86 constantBufferDescription.ByteWidth = initialSize; 87 constantBufferDescription.Usage = D3D11_USAGE_DYNAMIC; 88 constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 89 constantBufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 90 constantBufferDescription.MiscFlags = 0; 91 constantBufferDescription.StructureByteStride = 0; 92 93 HRESULT result = d3d11Device->CreateBuffer(&constantBufferDescription, NULL, &mConstantBuffer); 94 UNUSED_ASSERTION_VARIABLE(result); 95 ASSERT(SUCCEEDED(result)); 96 } 97 } 98 99 UniformStorage11::~UniformStorage11() 100 { 101 SafeRelease(mConstantBuffer); 102 } 103 104 const UniformStorage11 *UniformStorage11::makeUniformStorage11(const UniformStorage *uniformStorage) 105 { 106 ASSERT(HAS_DYNAMIC_TYPE(const UniformStorage11*, uniformStorage)); 107 return static_cast<const UniformStorage11*>(uniformStorage); 108 } 109 110 } 111