bool DirectX11Texture2DHelper::InternalConstruct(ID3D11Device* d3dDevice, int width, int height, DXGI_FORMAT format, UINT bindFlags, int mipLevels, int arraySize, int sampleCount, int sampleQuality, D3D11_RTV_DIMENSION rtvDimension, D3D11_UAV_DIMENSION uavDimension, D3D11_SRV_DIMENSION srvDimension) { CD3D11_TEXTURE2D_DESC textureDesc(format, width, height, arraySize, mipLevels, bindFlags, D3D11_USAGE_DEFAULT, 0, sampleCount, sampleQuality, mipLevels != 1 ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0); if(FAILED(d3dDevice->CreateTexture2D(&textureDesc, 0, mTexture.getModifiablePointer()))) return true; mTexture->GetDesc(&textureDesc); if(bindFlags & D3D11_BIND_RENDER_TARGET) { mRenderTargetElements.resize(arraySize); for(int i = 0; i < arraySize; ++i) { CD3D11_RENDER_TARGET_VIEW_DESC textureRTVDesc(rtvDimension, format, 0, i, 1); if(FAILED(d3dDevice->CreateRenderTargetView(mTexture, &textureRTVDesc, mRenderTargetElements[i].getModifiablePointer()))) return true; } } if(bindFlags & D3D11_BIND_UNORDERED_ACCESS) { mUnorderedAccessElements.resize(arraySize); for(int i = 0; i < arraySize; ++i) { CD3D11_UNORDERED_ACCESS_VIEW_DESC textureUAVDesc(uavDimension, format, 0, i, 1); if(FAILED(d3dDevice->CreateUnorderedAccessView(mTexture, &textureUAVDesc, mUnorderedAccessElements[i].getModifiablePointer()))) return true; } } if(bindFlags & D3D11_BIND_SHADER_RESOURCE) { CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(srvDimension, format, 0, textureDesc.MipLevels, 0, textureDesc.ArraySize); d3dDevice->CreateShaderResourceView(mTexture, &srvDesc, mShaderResource.getModifiablePointer()); mShaderResourceElements.resize(arraySize); for(int i = 0; i < arraySize; ++i) { CD3D11_SHADER_RESOURCE_VIEW_DESC srvElementDesc(srvDimension, format, 0, 1, i, 1); if(FAILED(d3dDevice->CreateShaderResourceView(mTexture, &srvElementDesc, mShaderResourceElements[i].getModifiablePointer()))) return true; } } return false; }
void Texture2D::InternalConstruct(ID3D11Device* d3dDevice, int width, int height, DXGI_FORMAT format, UINT bindFlags, int mipLevels, int arraySize, int sampleCount, int sampleQuality, D3D11_RTV_DIMENSION rtvDimension, D3D11_UAV_DIMENSION uavDimension, D3D11_SRV_DIMENSION srvDimension) { // Initalize mShaderResource = 0; CD3D11_TEXTURE2D_DESC desc( format, width, height, arraySize, mipLevels, bindFlags, D3D11_USAGE_DEFAULT, 0, sampleCount, sampleQuality, // If they request mipmap levels, it's nice to be able to autogenerate them. (mipLevels != 1 ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0)); d3dDevice->CreateTexture2D(&desc, 0, &mTexture); // Update with actual mip levels, etc. mTexture->GetDesc(&desc); if (bindFlags & D3D11_BIND_RENDER_TARGET) { for (int i = 0; i < arraySize; ++i) { CD3D11_RENDER_TARGET_VIEW_DESC rtvDesc( rtvDimension, format, 0, // Mips i, 1 // Array ); ID3D11RenderTargetView* renderTargetView; d3dDevice->CreateRenderTargetView(mTexture, &rtvDesc, &renderTargetView); mRenderTargetElements.push_back(renderTargetView); } } if (bindFlags & D3D11_BIND_UNORDERED_ACCESS) { // UAV's can't point to multisampled resources! assert(uavDimension != D3D11_UAV_DIMENSION_UNKNOWN); for (int i = 0; i < arraySize; ++i) { CD3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc( uavDimension, format, 0, // Mips i, 1 // Array ); ID3D11UnorderedAccessView* unorderedAccessView; d3dDevice->CreateUnorderedAccessView(mTexture, &uavDesc, &unorderedAccessView); mUnorderedAccessElements.push_back(unorderedAccessView); } } if (bindFlags & D3D11_BIND_SHADER_RESOURCE) { // Whole resource CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc( srvDimension, format, 0, desc.MipLevels, // Mips 0, desc.ArraySize // Array ); d3dDevice->CreateShaderResourceView(mTexture, &srvDesc, &mShaderResource); // Single elements for (int i = 0; i < arraySize; ++i) { CD3D11_SHADER_RESOURCE_VIEW_DESC srvElementDesc( srvDimension, format, 0, 1, // Mips i, 1 // Array ); ID3D11ShaderResourceView* shaderResourceView; d3dDevice->CreateShaderResourceView(mTexture, &srvElementDesc, &shaderResourceView); mShaderResourceElements.push_back(shaderResourceView); } } }