HLSL: add subpass input types and methods

Add support for Subpass Input proposal of issue #1069.

Subpass input types are given as:

    layout(input_attachment_index = 1) SubpassInput<float4> subpass_f;
    layout(input_attachment_index = 2) SubpassInput<int4>   subpass_i;
    layout(input_attachment_index = 3) SubpassInput<uint4>  subpass_u;

    layout(input_attachment_index = 1) SubpassInputMS<float4> subpass_ms_f;
    layout(input_attachment_index = 2) SubpassInputMS<int4>   subpass_ms_i;
    layout(input_attachment_index = 3) SubpassInputMS<uint4>  subpass_ms_u;

The input attachment may also be specified using attribute syntax:

    [[vk::input_attachment_index(7)]] SubpassInput subpass_2;

The template type may be a shorter-than-vec4 vector, but currently user
structs are not supported.  (An unimplemented error will be issued).

The load operations are methods on objects of the above type:

    float4 result = subpass_f.SubpassLoad();
    int4   result = subpass_i.SubpassLoad();
    uint4  result = subpass_u.SubpassLoad();

    float4 result = subpass_ms_f.SubpassLoad(samp);
    int4   result = subpass_ms_i.SubpassLoad(samp);
    uint4  result = subpass_ms_u.SubpassLoad(samp);

Additionally, the AST printer could not print EOpSubpass* nodes.  Now it can.

Fixes #1069
This commit is contained in:
LoopDawg
2017-09-27 09:04:43 -06:00
parent 092b7d2e20
commit 7f93d56ef2
14 changed files with 1136 additions and 16 deletions

View File

@@ -4215,6 +4215,25 @@ void HlslParseContext::decomposeSampleMethods(const TSourceLoc& loc, TIntermType
break;
}
case EOpSubpassLoad:
{
const TIntermTyped* argSubpass =
argAggregate ? argAggregate->getSequence()[0]->getAsTyped() :
arguments->getAsTyped();
const TSampler& sampler = argSubpass->getType().getSampler();
// subpass load: the multisample form is overloaded. Here, we convert that to
// the EOpSubpassLoadMS opcode.
if (argAggregate != nullptr && argAggregate->getSequence().size() > 1)
node->getAsOperator()->setOp(EOpSubpassLoadMS);
node = convertReturn(node, sampler);
break;
}
default:
break; // most pass through unchanged
}
@@ -8952,6 +8971,12 @@ bool HlslParseContext::setTextureReturnType(TSampler& sampler, const TType& retT
return false;
}
// TODO: Subpass doesn't handle struct returns, due to some oddities with fn overloading.
if (sampler.isSubpass()) {
error(loc, "Unimplemented: structure template type in subpass input", "", "");
return false;
}
TTypeList* members = retType.getWritableStruct();
// Check for too many or not enough structure members.