GteDX11TextureCube.cpp
Go to the documentation of this file.
1 // David Eberly, Geometric Tools, Redmond WA 98052
2 // Copyright (c) 1998-2017
3 // Distributed under the Boost Software License, Version 1.0.
4 // http://www.boost.org/LICENSE_1_0.txt
5 // http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
6 // File Version: 3.0.0 (2016/06/19)
7 
8 #include <GTEnginePCH.h>
10 using namespace gte;
11 
12 DX11TextureCube::DX11TextureCube(ID3D11Device* device, TextureCube const* textureCube)
13  :
14  DX11TextureArray(textureCube)
15 {
16  // Specify the texture description. TODO: Support texture cube RTs?
17  D3D11_TEXTURE2D_DESC desc;
18  desc.Width = textureCube->GetLength();
19  desc.Height = textureCube->GetLength();
20  desc.MipLevels = textureCube->GetNumLevels();
21  desc.ArraySize = textureCube->GetNumItems();
22  desc.Format = static_cast<DXGI_FORMAT>(textureCube->GetFormat());
23  desc.SampleDesc.Count = 1;
24  desc.SampleDesc.Quality = 0;
25  desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
26  desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;
27  Resource::Usage usage = textureCube->GetUsage();
28  if (usage == Resource::IMMUTABLE)
29  {
30  desc.Usage = D3D11_USAGE_IMMUTABLE;
31  desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE;
32  }
33  else if (usage == Resource::DYNAMIC_UPDATE)
34  {
35  // DX11 does not allow a cube map to be a dynamic-update resource.
36  desc.Usage = D3D11_USAGE_DEFAULT;
37  desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE;
38  }
39  else // usage == Resource::SHADER_OUTPUT
40  {
41  desc.Usage = D3D11_USAGE_DEFAULT;
42  desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS;
43  desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE;
44  }
45 
46  if (textureCube->WantAutogenerateMipmaps())
47  {
48  desc.Usage = D3D11_USAGE_DEFAULT;
49  desc.BindFlags |= D3D11_BIND_RENDER_TARGET;
50  desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE;
51  desc.MiscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS;
52  }
53 
54  // Create the texture.
55  ID3D11Texture2D* dxTexture = nullptr;
56  HRESULT hr;
57  if (textureCube->GetData())
58  {
59  unsigned int const numSubresources =
60  textureCube->GetNumSubresources();
61  std::vector<D3D11_SUBRESOURCE_DATA> data(numSubresources);
62  for (unsigned int index = 0; index < numSubresources; ++index)
63  {
64  auto sr = textureCube->GetSubresource(index);
65  data[index].pSysMem = sr.data;
66  data[index].SysMemPitch = sr.rowPitch;
67  data[index].SysMemSlicePitch = 0;
68  }
69  hr = device->CreateTexture2D(&desc, &data[0], &dxTexture);
70  }
71  else
72  {
73  hr = device->CreateTexture2D(&desc, nullptr, &dxTexture);
74  }
75  CHECK_HR_RETURN_VOID("Failed to create texture");
76  mDXObject = dxTexture;
77 
78  // Create views of the texture.
79  CreateSRView(device, desc);
80  if (textureCube->GetUsage() == Resource::SHADER_OUTPUT)
81  {
82  CreateUAView(device, desc);
83  }
84 
85  // Create a staging texture if requested.
86  if (textureCube->GetCopyType() != Resource::COPY_NONE)
87  {
88  CreateStaging(device, desc);
89  }
90 
91  // Generate mipmaps if requested.
92  if (textureCube->WantAutogenerateMipmaps() && mSRView)
93  {
94  ID3D11DeviceContext* context;
95  device->GetImmediateContext(&context);
96  context->GenerateMips(mSRView);
97  context->Release();
98  }
99 }
100 
101 std::shared_ptr<GEObject> DX11TextureCube::Create(void* device, GraphicsObject const* object)
102 {
103  if (object->GetType() == GT_TEXTURE_CUBE)
104  {
105  return std::make_shared<DX11TextureCube>(
106  reinterpret_cast<ID3D11Device*>(device),
107  static_cast<TextureCube const*>(object));
108  }
109 
110  LogError("Invalid object type.");
111  return nullptr;
112 }
113 
114 void DX11TextureCube::CreateStaging(ID3D11Device* device, D3D11_TEXTURE2D_DESC const& tx)
115 {
116  D3D11_TEXTURE2D_DESC desc;
117  desc.Width = tx.Width;
118  desc.Height = tx.Height;
119  desc.MipLevels = tx.MipLevels;
120  desc.ArraySize = tx.ArraySize;
121  desc.Format = tx.Format;
122  desc.SampleDesc.Count = tx.SampleDesc.Count;
123  desc.SampleDesc.Quality = tx.SampleDesc.Quality;
124  desc.Usage = D3D11_USAGE_STAGING;
125  desc.BindFlags = D3D11_BIND_NONE;
126  desc.CPUAccessFlags = msStagingAccess[GetTexture()->GetCopyType()];
127  desc.MiscFlags = D3D11_RESOURCE_MISC_NONE;
128 
129  HRESULT hr = device->CreateTexture2D(&desc, nullptr,
130  reinterpret_cast<ID3D11Texture2D**>(&mStaging));
131  CHECK_HR_RETURN_NONE("Failed to create staging texture");
132 }
133 
134 void DX11TextureCube::CreateSRView(ID3D11Device* device, D3D11_TEXTURE2D_DESC const& tx)
135 {
136  D3D11_SHADER_RESOURCE_VIEW_DESC desc;
137  desc.Format = tx.Format;
138  desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
139  desc.TextureCube.MostDetailedMip = 0;
140  desc.TextureCube.MipLevels = tx.MipLevels;
141  HRESULT hr = device->CreateShaderResourceView(GetDXTexture(), &desc, &mSRView);
142  CHECK_HR_RETURN_NONE("Failed to create shader resource view");
143 }
144 
145 void DX11TextureCube::CreateUAView(ID3D11Device* device, D3D11_TEXTURE2D_DESC const& tx)
146 {
147  D3D11_UNORDERED_ACCESS_VIEW_DESC desc;
148  desc.Format = tx.Format;
149  desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2DARRAY;
150  desc.Texture2DArray.MipSlice = 0;
151  desc.Texture2DArray.FirstArraySlice = 0;
152  desc.Texture2DArray.ArraySize = tx.ArraySize;
153  HRESULT hr = device->CreateUnorderedAccessView(GetDXTexture(), &desc, &mUAView);
154  CHECK_HR_RETURN_NONE("Failed to create unordered access view");
155 }
DYNAMIC_UPDATE
Definition: GteResource.h:42
COPY_NONE
Definition: GteResource.h:55
void CreateStaging(ID3D11Device *device, D3D11_TEXTURE2D_DESC const &tx)
#define D3D11_RESOURCE_MISC_NONE
void CreateUAView(ID3D11Device *device, D3D11_TEXTURE2D_DESC const &tx)
DX11TextureCube(ID3D11Device *device, TextureCube const *textureCube)
#define CHECK_HR_RETURN_NONE(msg)
IMMUTABLE
Definition: GteResource.h:42
Usage GetUsage() const
Definition: GteResource.h:126
static std::shared_ptr< GEObject > Create(void *device, GraphicsObject const *object)
#define D3D11_BIND_NONE
GraphicsObjectType GetType() const
unsigned int GetLength() const
ID3D11UnorderedAccessView * mUAView
ID3D11Resource * mStaging
#define LogError(message)
Definition: GteLogger.h:92
GLboolean * data
Definition: glcorearb.h:126
GT_TEXTURE_CUBE
ID3D11DeviceChild * mDXObject
char const * GetData() const
Definition: GteResource.h:151
void CreateSRView(ID3D11Device *device, D3D11_TEXTURE2D_DESC const &tx)
unsigned int GetNumItems() const
Definition: GteTexture.h:95
unsigned int GetNumLevels() const
Definition: GteTexture.h:120
GLsizeiptr const void GLenum usage
Definition: glcorearb.h:659
Subresource GetSubresource(unsigned int index) const
Definition: GteTexture.cpp:110
#define D3D11_CPU_ACCESS_NONE
#define CHECK_HR_RETURN_VOID(msg)
GLuint index
Definition: glcorearb.h:781
static UINT const msStagingAccess[]
CopyType GetCopyType() const
Definition: GteResource.h:136
TextureCube * GetTexture() const
ID3D11Texture2D * GetDXTexture() const
bool WantAutogenerateMipmaps() const
Definition: GteTexture.h:175
ID3D11ShaderResourceView * mSRView
unsigned int GetNumSubresources() const
Definition: GteTexture.h:170
DFType GetFormat() const
Definition: GteTexture.h:100


geometric_tools_engine
Author(s): Yijiang Huang
autogenerated on Thu Jul 18 2019 03:59:59