|
|
@@ -378,6 +378,14 @@ bool Texture2D::Create()
|
|
|
|
|
|
D3D11_TEXTURE2D_DESC textureDesc;
|
|
|
memset(&textureDesc, 0, sizeof textureDesc);
|
|
|
+ textureDesc.Format = (DXGI_FORMAT)(sRGB_ ? GetSRGBFormat(format_) : format_);
|
|
|
+
|
|
|
+ // Disable multisampling if not supported
|
|
|
+ if (multiSample_ > 1 && !graphics_->GetImpl()->CheckMultiSampleSupport(textureDesc.Format, multiSample_))
|
|
|
+ {
|
|
|
+ multiSample_ = 1;
|
|
|
+ autoResolve_ = false;
|
|
|
+ }
|
|
|
|
|
|
// Set mipmapping
|
|
|
if (usage_ == TEXTURE_DEPTHSTENCIL)
|
|
|
@@ -390,9 +398,9 @@ bool Texture2D::Create()
|
|
|
// Disable mip levels from the multisample texture. Rather create them to the resolve texture
|
|
|
textureDesc.MipLevels = multiSample_ == 1 ? levels_ : 1;
|
|
|
textureDesc.ArraySize = 1;
|
|
|
- textureDesc.Format = (DXGI_FORMAT)(sRGB_ ? GetSRGBFormat(format_) : format_);
|
|
|
textureDesc.SampleDesc.Count = (UINT)multiSample_;
|
|
|
- textureDesc.SampleDesc.Quality = multiSample_ > 1 ? 0xffffffff : 0;
|
|
|
+ textureDesc.SampleDesc.Quality = graphics_->GetImpl()->GetMultiSampleQuality(textureDesc.Format, multiSample_);
|
|
|
+
|
|
|
textureDesc.Usage = usage_ == TEXTURE_DYNAMIC ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_DEFAULT;
|
|
|
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
|
|
if (usage_ == TEXTURE_RENDERTARGET)
|
|
|
@@ -401,6 +409,10 @@ bool Texture2D::Create()
|
|
|
textureDesc.BindFlags |= D3D11_BIND_DEPTH_STENCIL;
|
|
|
textureDesc.CPUAccessFlags = usage_ == TEXTURE_DYNAMIC ? D3D11_CPU_ACCESS_WRITE : 0;
|
|
|
|
|
|
+ // D3D feature level 10.0 or below does not support readable depth when multisampled
|
|
|
+ if (usage_ == TEXTURE_DEPTHSTENCIL && multiSample_ > 1 && graphics_->GetImpl()->GetDevice()->GetFeatureLevel() < D3D_FEATURE_LEVEL_10_1)
|
|
|
+ textureDesc.BindFlags &= ~D3D11_BIND_SHADER_RESOURCE;
|
|
|
+
|
|
|
HRESULT hr = graphics_->GetImpl()->GetDevice()->CreateTexture2D(&textureDesc, 0, (ID3D11Texture2D**)&object_);
|
|
|
if (FAILED(hr))
|
|
|
{
|
|
|
@@ -427,22 +439,25 @@ bool Texture2D::Create()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- D3D11_SHADER_RESOURCE_VIEW_DESC resourceViewDesc;
|
|
|
- memset(&resourceViewDesc, 0, sizeof resourceViewDesc);
|
|
|
- resourceViewDesc.Format = (DXGI_FORMAT)GetSRVFormat(textureDesc.Format);
|
|
|
- resourceViewDesc.ViewDimension = (multiSample_ > 1 && !autoResolve_) ? D3D11_SRV_DIMENSION_TEXTURE2DMS :
|
|
|
- D3D11_SRV_DIMENSION_TEXTURE2D;
|
|
|
- resourceViewDesc.Texture2D.MipLevels = (UINT)levels_;
|
|
|
-
|
|
|
- // Sample the resolve texture if created, otherwise the original
|
|
|
- ID3D11Resource* viewObject = resolveTexture_ ? (ID3D11Resource*)resolveTexture_ : (ID3D11Resource*)object_.ptr_;
|
|
|
- hr = graphics_->GetImpl()->GetDevice()->CreateShaderResourceView(viewObject, &resourceViewDesc,
|
|
|
- (ID3D11ShaderResourceView**)&shaderResourceView_);
|
|
|
- if (FAILED(hr))
|
|
|
+ if (textureDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE)
|
|
|
{
|
|
|
- URHO3D_LOGD3DERROR("Failed to create shader resource view for texture", hr);
|
|
|
- URHO3D_SAFE_RELEASE(shaderResourceView_);
|
|
|
- return false;
|
|
|
+ D3D11_SHADER_RESOURCE_VIEW_DESC resourceViewDesc;
|
|
|
+ memset(&resourceViewDesc, 0, sizeof resourceViewDesc);
|
|
|
+ resourceViewDesc.Format = (DXGI_FORMAT)GetSRVFormat(textureDesc.Format);
|
|
|
+ resourceViewDesc.ViewDimension = (multiSample_ > 1 && !autoResolve_) ? D3D11_SRV_DIMENSION_TEXTURE2DMS :
|
|
|
+ D3D11_SRV_DIMENSION_TEXTURE2D;
|
|
|
+ resourceViewDesc.Texture2D.MipLevels = (UINT)levels_;
|
|
|
+
|
|
|
+ // Sample the resolve texture if created, otherwise the original
|
|
|
+ ID3D11Resource* viewObject = resolveTexture_ ? (ID3D11Resource*)resolveTexture_ : (ID3D11Resource*)object_.ptr_;
|
|
|
+ hr = graphics_->GetImpl()->GetDevice()->CreateShaderResourceView(viewObject, &resourceViewDesc,
|
|
|
+ (ID3D11ShaderResourceView**)&shaderResourceView_);
|
|
|
+ if (FAILED(hr))
|
|
|
+ {
|
|
|
+ URHO3D_LOGD3DERROR("Failed to create shader resource view for texture", hr);
|
|
|
+ URHO3D_SAFE_RELEASE(shaderResourceView_);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (usage_ == TEXTURE_RENDERTARGET)
|
|
|
@@ -478,13 +493,17 @@ bool Texture2D::Create()
|
|
|
}
|
|
|
|
|
|
// Create also a read-only version of the view for simultaneous depth testing and sampling in shader
|
|
|
- depthStencilViewDesc.Flags = D3D11_DSV_READ_ONLY_DEPTH;
|
|
|
- hr = graphics_->GetImpl()->GetDevice()->CreateDepthStencilView((ID3D11Resource*)object_.ptr_, &depthStencilViewDesc,
|
|
|
- (ID3D11DepthStencilView**)&renderSurface_->readOnlyView_);
|
|
|
- if (FAILED(hr))
|
|
|
+ // Requires feature level 11
|
|
|
+ if (graphics_->GetImpl()->GetDevice()->GetFeatureLevel() >= D3D_FEATURE_LEVEL_11_0)
|
|
|
{
|
|
|
- URHO3D_LOGD3DERROR("Failed to create read-only depth-stencil view for texture", hr);
|
|
|
- URHO3D_SAFE_RELEASE(renderSurface_->readOnlyView_);
|
|
|
+ depthStencilViewDesc.Flags = D3D11_DSV_READ_ONLY_DEPTH;
|
|
|
+ hr = graphics_->GetImpl()->GetDevice()->CreateDepthStencilView((ID3D11Resource*)object_.ptr_, &depthStencilViewDesc,
|
|
|
+ (ID3D11DepthStencilView**)&renderSurface_->readOnlyView_);
|
|
|
+ if (FAILED(hr))
|
|
|
+ {
|
|
|
+ URHO3D_LOGD3DERROR("Failed to create read-only depth-stencil view for texture", hr);
|
|
|
+ URHO3D_SAFE_RELEASE(renderSurface_->readOnlyView_);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|