1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-01-18 02:52:10 +01:00

[d3d11] Experimental support for typed shader buffer views

This commit is contained in:
Philip Rebohle 2017-12-27 14:32:07 +01:00
parent 7f5fa18d0b
commit e668c65017
3 changed files with 77 additions and 22 deletions

View File

@ -1696,9 +1696,9 @@ namespace dxvk {
if (resView != nullptr) {
// Figure out what we have to bind based on the resource type
if (resView->GetResourceType() == D3D11_RESOURCE_DIMENSION_BUFFER) {
Logger::warn("D3D11: Texel buffers not yet supported");
// TODO support raw and structured buffers
m_context->bindResourceTexelBuffer(
slotId + i, nullptr);
slotId + i, resView->GetDXVKBufferView());
} else {
m_context->bindResourceImage(
slotId + i, resView->GetDXVKImageView());

View File

@ -146,8 +146,42 @@ namespace dxvk {
}
if (resourceDim == D3D11_RESOURCE_DIMENSION_BUFFER) {
Logger::err("D3D11: Shader resource views for buffers not yet supported");
return E_INVALIDARG;
auto resource = static_cast<D3D11Buffer*>(pResource);
// TODO implement raw and structured buffers
if (pDesc->Format == DXGI_FORMAT_UNKNOWN) {
Logger::err("D3D11Device: Raw and structured buffers not yet supported");
return E_INVALIDARG;
}
// Typed buffer views support uncompressed color formats only
const VkFormat format = m_dxgiAdapter->LookupFormat(
pDesc->Format, DxgiFormatMode::Color).format;
const DxvkFormatInfo* formatInfo = imageFormatInfo(format);
if (formatInfo->flags.test(DxvkFormatFlag::BlockCompressed)) {
Logger::err("D3D11Device: Compressed formats for buffer views not supported");
return E_INVALIDARG;
}
DxvkBufferViewCreateInfo viewInfo;
viewInfo.format = format;
viewInfo.rangeOffset = formatInfo->elementSize * pDesc->Buffer.FirstElement;
viewInfo.rangeLength = formatInfo->elementSize * pDesc->Buffer.NumElements;
if (ppSRView == nullptr)
return S_FALSE;
try {
*ppSRView = ref(new D3D11ShaderResourceView(
this, pResource, desc,
m_dxvkDevice->createBufferView(
resource->GetBufferSlice().buffer(), viewInfo)));
return S_OK;
} catch (const DxvkError& e) {
Logger::err(e.message());
return E_FAIL;
}
} else {
// Retrieve info about the image
D3D11TextureInfo textureInfo;
@ -249,7 +283,7 @@ namespace dxvk {
}
if (ppSRView == nullptr)
return S_OK;
return S_FALSE;
try {
*ppSRView = ref(new D3D11ShaderResourceView(
@ -353,7 +387,7 @@ namespace dxvk {
// Create the actual image view if requested
if (ppRTView == nullptr)
return S_OK;
return S_FALSE;
try {
*ppRTView = ref(new D3D11RenderTargetView(
@ -363,7 +397,7 @@ namespace dxvk {
return S_OK;
} catch (const DxvkError& e) {
Logger::err(e.message());
return DXGI_ERROR_DRIVER_INTERNAL_ERROR;
return E_FAIL;
}
}
@ -447,7 +481,7 @@ namespace dxvk {
// Create the actual image view if requested
if (ppDepthStencilView == nullptr)
return S_OK;
return S_FALSE;
try {
*ppDepthStencilView = ref(new D3D11DepthStencilView(
@ -457,7 +491,7 @@ namespace dxvk {
return S_OK;
} catch (const DxvkError& e) {
Logger::err(e.message());
return DXGI_ERROR_DRIVER_INTERNAL_ERROR;
return E_FAIL;
}
}
@ -571,7 +605,7 @@ namespace dxvk {
return S_OK;
} catch (const DxvkError& e) {
Logger::err(e.message());
return E_INVALIDARG;
return E_FAIL;
}
}
@ -723,9 +757,10 @@ namespace dxvk {
}
}
if (ppBlendState != nullptr)
if (ppBlendState != nullptr) {
*ppBlendState = m_bsStateObjects.Create(this, desc);
return S_OK;
return S_OK;
} return S_FALSE;
}
@ -753,9 +788,10 @@ namespace dxvk {
desc.BackFace = stencilOp;
}
if (ppDepthStencilState != nullptr)
if (ppDepthStencilState != nullptr) {
*ppDepthStencilState = m_dsStateObjects.Create(this, desc);
return S_OK;
return S_OK;
} return S_FALSE;
}
@ -779,9 +815,10 @@ namespace dxvk {
desc.AntialiasedLineEnable = FALSE;
}
if (ppRasterizerState != nullptr)
if (ppRasterizerState != nullptr) {
*ppRasterizerState = m_rsStateObjects.Create(this, desc);
return S_OK;
return S_OK;
} return S_FALSE;
}
@ -827,7 +864,7 @@ namespace dxvk {
// Create sampler object if the application requests it
if (ppSamplerState == nullptr)
return S_OK;
return S_FALSE;
try {
*ppSamplerState = ref(new D3D11SamplerState(this,
@ -835,7 +872,7 @@ namespace dxvk {
return S_OK;
} catch (const DxvkError& e) {
Logger::err(e.message());
return S_OK;
return E_FAIL;
}
}
@ -1147,7 +1184,7 @@ namespace dxvk {
return S_OK;
} catch (const DxvkError& e) {
Logger::err(e.message());
return E_INVALIDARG;
return E_FAIL;
}
}

View File

@ -17,8 +17,10 @@ struct Vertex {
};
const std::string g_vertexShaderCode =
"Buffer<float4> buf : register(t0);\n"
"struct vs_out {\n"
" float4 pos : SV_POSITION;\n"
" float4 color : COLOR;\n"
" uint vid : VID;\n"
" uint iid : IID;\n"
"};\n"
@ -27,6 +29,7 @@ const std::string g_vertexShaderCode =
" uint iid : SV_INSTANCEID) {\n"
" vs_out result;\n"
" result.pos = vsIn;\n"
" result.color = buf[vid];\n"
" result.vid = vid;\n"
" result.iid = iid;\n"
" return result;\n"
@ -35,12 +38,14 @@ const std::string g_vertexShaderCode =
const std::string g_pixelShaderCode =
"struct vs_out {\n"
" float4 pos : SV_POSITION;\n"
" float4 color : COLOR;\n"
" uint vid : VID;\n"
" uint iid : IID;\n"
"};\n"
"cbuffer c_buffer { float4 ccolor[2]; };\n"
"float4 main(vs_out ps_in) : SV_TARGET {\n"
" return 0.5f * (ccolor[min(ps_in.vid, 1u)] + ccolor[min(ps_in.iid, 1u)]);\n"
" return ps_in.color;\n"
// " return 0.5f * (ccolor[min(ps_in.vid, 1u)] + ccolor[min(ps_in.iid, 1u)]);\n"
"}\n";
class TriangleApp {
@ -157,15 +162,17 @@ public:
if (FAILED(m_device->CreateBuffer(&indexDesc, &indexDataInfo, &m_indexBuffer)))
throw DxvkError("Failed to create index buffer");
std::array<Vertex, 2> constantData = {{
std::array<Vertex, 3> constantData = {{
{ 0.03f, 0.03f, 0.03f, 1.0f },
{ 1.00f, 0.00f, 0.00f, 1.0f },
{ 1.00f, 1.00f, 0.00f, 1.0f },
}};
D3D11_BUFFER_DESC constantDesc;
constantDesc.ByteWidth = sizeof(Vertex) * constantData.size();
constantDesc.Usage = D3D11_USAGE_IMMUTABLE;
constantDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constantDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER
| D3D11_BIND_SHADER_RESOURCE;
constantDesc.CPUAccessFlags = 0;
constantDesc.MiscFlags = 0;
constantDesc.StructureByteStride = 0;
@ -178,6 +185,15 @@ public:
if (FAILED(m_device->CreateBuffer(&constantDesc, &constantDataInfo, &m_constantBuffer)))
throw DxvkError("Failed to create constant buffer");
D3D11_SHADER_RESOURCE_VIEW_DESC constantViewDesc;
constantViewDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
constantViewDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
constantViewDesc.Buffer.FirstElement = 0;
constantViewDesc.Buffer.NumElements = 3;
if (FAILED(m_device->CreateShaderResourceView(m_constantBuffer.ptr(), &constantViewDesc, &m_constantView)))
throw DxvkError("Failed to create texel buffer view");
Com<ID3DBlob> vertexShaderBlob;
Com<ID3DBlob> pixelShaderBlob;
@ -250,6 +266,7 @@ public:
m_context->ClearRenderTargetView(m_bufferView.ptr(), color);
m_context->VSSetShader(m_vertexShader.ptr(), nullptr, 0);
m_context->VSSetShaderResources(0, 1, &m_constantView);
m_context->PSSetShader(m_pixelShader.ptr(), nullptr, 0);
m_context->PSSetConstantBuffers(0, 1, &m_constantBuffer);
@ -328,6 +345,7 @@ private:
Com<ID3D11Texture2D> m_buffer;
Com<ID3D11RenderTargetView> m_bufferView;
Com<ID3D11Buffer> m_constantBuffer;
Com<ID3D11ShaderResourceView> m_constantView;
Com<ID3D11Buffer> m_indexBuffer;
Com<ID3D11Buffer> m_vertexBuffer;
Com<ID3D11InputLayout> m_vertexFormat;