| 10 | using namespace gte; |
| 11 | |
| 12 | DX11Texture2Array::DX11Texture2Array(ID3D11Device* device, Texture2Array const* textureArray) |
| 13 | : |
| 14 | DX11TextureArray(textureArray) |
| 15 | { |
| 16 | // Specify the texture description. |
| 17 | D3D11_TEXTURE2D_DESC desc; |
| 18 | desc.Width = textureArray->GetWidth(); |
| 19 | desc.Height = textureArray->GetHeight(); |
| 20 | desc.MipLevels = textureArray->GetNumLevels(); |
| 21 | desc.ArraySize = textureArray->GetNumItems(); |
| 22 | desc.Format = static_cast<DXGI_FORMAT>(textureArray->GetFormat()); |
| 23 | desc.SampleDesc.Count = 1; |
| 24 | desc.SampleDesc.Quality = 0; |
| 25 | desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; |
| 26 | desc.MiscFlags = D3D11_RESOURCE_MISC_NONE; |
| 27 | uint32_t usage = textureArray->GetUsage(); |
| 28 | if (usage == Resource::Usage::IMMUTABLE) |
| 29 | { |
| 30 | desc.Usage = D3D11_USAGE_IMMUTABLE; |
| 31 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE; |
| 32 | } |
| 33 | else if (usage == Resource::Usage::DYNAMIC_UPDATE) |
| 34 | { |
| 35 | desc.Usage = D3D11_USAGE_DYNAMIC; |
| 36 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; |
| 37 | } |
| 38 | else // usage == Resource::Usage::SHADER_OUTPUT |
| 39 | { |
| 40 | desc.Usage = D3D11_USAGE_DEFAULT; |
| 41 | desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS; |
| 42 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE; |
| 43 | } |
| 44 | |
| 45 | if (textureArray->WantAutogenerateMipmaps()) |
| 46 | { |
| 47 | desc.Usage = D3D11_USAGE_DEFAULT; |
| 48 | desc.BindFlags |= D3D11_BIND_RENDER_TARGET; |
| 49 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE; |
| 50 | desc.MiscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS; |
| 51 | } |
| 52 | |
| 53 | // Create the texture. |
| 54 | ID3D11Texture2D* dxTexture = nullptr; |
| 55 | if (textureArray->GetData()) |
| 56 | { |
| 57 | uint32_t const numSubresources = textureArray->GetNumSubresources(); |
| 58 | std::vector<D3D11_SUBRESOURCE_DATA> data(numSubresources); |
| 59 | for (uint32_t index = 0; index < numSubresources; ++index) |
| 60 | { |
| 61 | auto sr = textureArray->GetSubresource(index); |
| 62 | data[index].pSysMem = sr.data; |
| 63 | data[index].SysMemPitch = sr.rowPitch; |
| 64 | data[index].SysMemSlicePitch = 0; |
| 65 | } |
| 66 | DX11Log(device->CreateTexture2D(&desc, &data[0], &dxTexture)); |
| 67 | } |
| 68 | else |
| 69 | { |
nothing calls this directly
no test coverage detected