blob: 5a7c98749441284d958af5d4a5bb81fc25d2a286 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com813bb782012-11-28 21:03:30 +00002//
Geoff Lang48dcae72014-02-05 16:28:24 -05003// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com813bb782012-11-28 21:03:30 +00004// 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
Brandon Jonesc7a41042014-06-23 12:03:25 -070011#include "libGLESv2/renderer/d3d/d3d11/ShaderExecutable11.h"
daniel@transgaming.com813bb782012-11-28 21:03:30 +000012
Brandon Jonesc7a41042014-06-23 12:03:25 -070013#include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
daniel@transgaming.com813bb782012-11-28 21:03:30 +000014
15namespace rx
16{
17
daniel@transgaming.com7b18d0c2012-11-28 21:04:10 +000018ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable)
19 : ShaderExecutable(function, length)
daniel@transgaming.com813bb782012-11-28 21:03:30 +000020{
21 mPixelExecutable = executable;
22 mVertexExecutable = NULL;
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +000023 mGeometryExecutable = NULL;
Geoff Lang48dcae72014-02-05 16:28:24 -050024 mStreamOutExecutable = NULL;
daniel@transgaming.com813bb782012-11-28 21:03:30 +000025}
26
Geoff Lang48dcae72014-02-05 16:28:24 -050027ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable, ID3D11GeometryShader *streamOut)
daniel@transgaming.com7b18d0c2012-11-28 21:04:10 +000028 : 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;
Geoff Lang48dcae72014-02-05 16:28:24 -050033 mStreamOutExecutable = streamOut;
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +000034}
35
36ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable)
37 : ShaderExecutable(function, length)
38{
39 mGeometryExecutable = executable;
40 mVertexExecutable = NULL;
41 mPixelExecutable = NULL;
Geoff Lang48dcae72014-02-05 16:28:24 -050042 mStreamOutExecutable = NULL;
daniel@transgaming.com813bb782012-11-28 21:03:30 +000043}
44
45ShaderExecutable11::~ShaderExecutable11()
46{
Geoff Langea228632013-07-30 15:17:12 -040047 SafeRelease(mVertexExecutable);
48 SafeRelease(mPixelExecutable);
49 SafeRelease(mGeometryExecutable);
Geoff Lang48dcae72014-02-05 16:28:24 -050050 SafeRelease(mStreamOutExecutable);
daniel@transgaming.com813bb782012-11-28 21:03:30 +000051}
52
53ShaderExecutable11 *ShaderExecutable11::makeShaderExecutable11(ShaderExecutable *executable)
54{
apatrick@chromium.org8b400b12013-01-30 21:53:40 +000055 ASSERT(HAS_DYNAMIC_TYPE(ShaderExecutable11*, executable));
daniel@transgaming.com813bb782012-11-28 21:03:30 +000056 return static_cast<ShaderExecutable11*>(executable);
57}
58
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +000059ID3D11VertexShader *ShaderExecutable11::getVertexShader() const
daniel@transgaming.com813bb782012-11-28 21:03:30 +000060{
61 return mVertexExecutable;
62}
63
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +000064ID3D11PixelShader *ShaderExecutable11::getPixelShader() const
daniel@transgaming.com813bb782012-11-28 21:03:30 +000065{
66 return mPixelExecutable;
67}
68
shannon.woods@transgaming.com3e773bb2013-01-25 21:55:47 +000069ID3D11GeometryShader *ShaderExecutable11::getGeometryShader() const
70{
71 return mGeometryExecutable;
72}
73
Geoff Lang48dcae72014-02-05 16:28:24 -050074ID3D11GeometryShader *ShaderExecutable11::getStreamOutShader() const
75{
76 return mStreamOutExecutable;
77}
78
Jamie Madillc47a6782014-02-04 16:04:03 -050079UniformStorage11::UniformStorage11(Renderer11 *renderer, size_t initialSize)
80 : UniformStorage(initialSize),
81 mConstantBuffer(NULL)
82{
83 ID3D11Device *d3d11Device = renderer->getDevice();
84
85 if (initialSize > 0)
shannon.woods@transgaming.com5929ef22013-01-25 21:53:24 +000086 {
87 D3D11_BUFFER_DESC constantBufferDescription = {0};
Jamie Madillc47a6782014-02-04 16:04:03 -050088 constantBufferDescription.ByteWidth = initialSize;
shannon.woods@transgaming.com09bf2a72013-02-28 23:12:54 +000089 constantBufferDescription.Usage = D3D11_USAGE_DYNAMIC;
shannon.woods@transgaming.com5929ef22013-01-25 21:53:24 +000090 constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
shannon.woods@transgaming.com09bf2a72013-02-28 23:12:54 +000091 constantBufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
shannon.woods@transgaming.com5929ef22013-01-25 21:53:24 +000092 constantBufferDescription.MiscFlags = 0;
93 constantBufferDescription.StructureByteStride = 0;
94
Jamie Madillc47a6782014-02-04 16:04:03 -050095 HRESULT result = d3d11Device->CreateBuffer(&constantBufferDescription, NULL, &mConstantBuffer);
Geoff Lang9cd19152014-05-28 15:54:34 -040096 UNUSED_ASSERTION_VARIABLE(result);
shannon.woods@transgaming.com5929ef22013-01-25 21:53:24 +000097 ASSERT(SUCCEEDED(result));
98 }
Jamie Madillc47a6782014-02-04 16:04:03 -050099}
shannon.woods@transgaming.com5929ef22013-01-25 21:53:24 +0000100
Jamie Madillc47a6782014-02-04 16:04:03 -0500101UniformStorage11::~UniformStorage11()
102{
103 SafeRelease(mConstantBuffer);
104}
105
106const UniformStorage11 *UniformStorage11::makeUniformStorage11(const UniformStorage *uniformStorage)
107{
Geoff Lang6cec8502014-04-19 12:39:25 -0400108 ASSERT(HAS_DYNAMIC_TYPE(const UniformStorage11*, uniformStorage));
Jamie Madillc47a6782014-02-04 16:04:03 -0500109 return static_cast<const UniformStorage11*>(uniformStorage);
shannon.woods@transgaming.com358e88d2013-01-25 21:53:11 +0000110}
111
Geoff Lang48dcae72014-02-05 16:28:24 -0500112}