1 #include "precompiled.h" 2 // 3 // Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 // 7 8 // ShaderExecutable11.cpp: Implements a D3D11-specific class to contain shader 9 // executable implementation details. 10 11 #include "libGLESv2/renderer/ShaderExecutable11.h" 12 13 #include "common/debug.h" 14 15 namespace rx 16 { 17 18 ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable) 19 : ShaderExecutable(function, length) 20 { 21 mPixelExecutable = executable; 22 mVertexExecutable = NULL; 23 mGeometryExecutable = NULL; 24 25 mConstantBuffer = NULL; 26 } 27 28 ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable) 29 : ShaderExecutable(function, length) 30 { 31 mVertexExecutable = executable; 32 mPixelExecutable = NULL; 33 mGeometryExecutable = NULL; 34 35 mConstantBuffer = NULL; 36 } 37 38 ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable) 39 : ShaderExecutable(function, length) 40 { 41 mGeometryExecutable = executable; 42 mVertexExecutable = NULL; 43 mPixelExecutable = NULL; 44 45 mConstantBuffer = NULL; 46 } 47 48 ShaderExecutable11::~ShaderExecutable11() 49 { 50 if (mVertexExecutable) 51 { 52 mVertexExecutable->Release(); 53 } 54 if (mPixelExecutable) 55 { 56 mPixelExecutable->Release(); 57 } 58 if (mGeometryExecutable) 59 { 60 mGeometryExecutable->Release(); 61 } 62 63 if (mConstantBuffer) 64 { 65 mConstantBuffer->Release(); 66 } 67 } 68 69 ShaderExecutable11 *ShaderExecutable11::makeShaderExecutable11(ShaderExecutable *executable) 70 { 71 ASSERT(HAS_DYNAMIC_TYPE(ShaderExecutable11*, executable)); 72 return static_cast<ShaderExecutable11*>(executable); 73 } 74 75 ID3D11VertexShader *ShaderExecutable11::getVertexShader() const 76 { 77 return mVertexExecutable; 78 } 79 80 ID3D11PixelShader *ShaderExecutable11::getPixelShader() const 81 { 82 return mPixelExecutable; 83 } 84 85 ID3D11GeometryShader *ShaderExecutable11::getGeometryShader() const 86 { 87 return mGeometryExecutable; 88 } 89 90 ID3D11Buffer *ShaderExecutable11::getConstantBuffer(ID3D11Device *device, unsigned int registerCount) 91 { 92 if (!mConstantBuffer && registerCount > 0) 93 { 94 D3D11_BUFFER_DESC constantBufferDescription = {0}; 95 constantBufferDescription.ByteWidth = registerCount * sizeof(float[4]); 96 constantBufferDescription.Usage = D3D11_USAGE_DYNAMIC; 97 constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 98 constantBufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 99 constantBufferDescription.MiscFlags = 0; 100 constantBufferDescription.StructureByteStride = 0; 101 102 HRESULT result = device->CreateBuffer(&constantBufferDescription, NULL, &mConstantBuffer); 103 ASSERT(SUCCEEDED(result)); 104 } 105 106 return mConstantBuffer; 107 } 108 109 }