blob: 4a944fe52dd5fb1819fe7eaead6437004b67ed07 [file] [log] [blame]
daniel@transgaming.com813bb782012-11-28 21:03:30 +00001//
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +00002// Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com813bb782012-11-28 21:03:30 +00003// 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/ShaderExecutable11.h"
11
12#include "common/debug.h"
13
14namespace rx
15{
16
daniel@transgaming.com7b18d0c2012-11-28 21:04:10 +000017ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable)
18 : ShaderExecutable(function, length)
daniel@transgaming.com813bb782012-11-28 21:03:30 +000019{
20 mPixelExecutable = executable;
21 mVertexExecutable = NULL;
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +000022 mGeometryExecutable = NULL;
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +000023
24 mConstantBuffer = NULL;
daniel@transgaming.com813bb782012-11-28 21:03:30 +000025}
26
daniel@transgaming.com7b18d0c2012-11-28 21:04:10 +000027ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable)
28 : ShaderExecutable(function, length)
daniel@transgaming.com813bb782012-11-28 21:03:30 +000029{
30 mVertexExecutable = executable;
31 mPixelExecutable = NULL;
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +000032 mGeometryExecutable = NULL;
33
34 mConstantBuffer = NULL;
35}
36
37ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable)
38 : ShaderExecutable(function, length)
39{
40 mGeometryExecutable = executable;
41 mVertexExecutable = NULL;
42 mPixelExecutable = NULL;
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +000043
44 mConstantBuffer = NULL;
daniel@transgaming.com813bb782012-11-28 21:03:30 +000045}
46
47ShaderExecutable11::~ShaderExecutable11()
48{
49 if (mVertexExecutable)
50 {
51 mVertexExecutable->Release();
52 }
53 if (mPixelExecutable)
54 {
55 mPixelExecutable->Release();
56 }
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +000057 if (mGeometryExecutable)
58 {
59 mGeometryExecutable->Release();
60 }
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +000061
62 if (mConstantBuffer)
63 {
64 mConstantBuffer->Release();
65 }
daniel@transgaming.com813bb782012-11-28 21:03:30 +000066}
67
68ShaderExecutable11 *ShaderExecutable11::makeShaderExecutable11(ShaderExecutable *executable)
69{
70 ASSERT(dynamic_cast<ShaderExecutable11*>(executable) != NULL);
71 return static_cast<ShaderExecutable11*>(executable);
72}
73
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +000074ID3D11VertexShader *ShaderExecutable11::getVertexShader() const
daniel@transgaming.com813bb782012-11-28 21:03:30 +000075{
76 return mVertexExecutable;
77}
78
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +000079ID3D11PixelShader *ShaderExecutable11::getPixelShader() const
daniel@transgaming.com813bb782012-11-28 21:03:30 +000080{
81 return mPixelExecutable;
82}
83
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +000084ID3D11GeometryShader *ShaderExecutable11::getGeometryShader() const
85{
86 return mGeometryExecutable;
87}
88
shannon.woods@transgaming.com5929ef22013-01-25 21:53:24 +000089ID3D11Buffer *ShaderExecutable11::getConstantBuffer(ID3D11Device *device, unsigned int registerCount)
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +000090{
shannon.woods@transgaming.com5929ef22013-01-25 21:53:24 +000091 if (!mConstantBuffer && registerCount > 0)
92 {
93 D3D11_BUFFER_DESC constantBufferDescription = {0};
94 constantBufferDescription.ByteWidth = registerCount * sizeof(float[4]);
95 constantBufferDescription.Usage = D3D11_USAGE_DEFAULT;
96 constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
97 constantBufferDescription.CPUAccessFlags = 0;
98 constantBufferDescription.MiscFlags = 0;
99 constantBufferDescription.StructureByteStride = 0;
100
101 HRESULT result = device->CreateBuffer(&constantBufferDescription, NULL, &mConstantBuffer);
102 ASSERT(SUCCEEDED(result));
103 }
104
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +0000105 return mConstantBuffer;
106}
107
daniel@transgaming.com813bb782012-11-28 21:03:30 +0000108}