Exposição de recursos lado a lado HLSL
A nova sintaxe HLSL (Linguagem de Sombreador de Alto Nível) da Microsoft é necessária para dar suporte a recursos lado a lado no Modelo de Sombreador 5.
A nova sintaxe HLSL é permitida somente em dispositivos com suporte a recursos lado a lado. Cada método HLSL relevante para recursos lado a lado na tabela a seguir aceita um (feedback) ou dois parâmetros opcionais adicionais (fixação e comentários nesta ordem). Por exemplo, um método de Amostra é:
Sample(sampler, location [, offset [, clamp [, feedback] ] ])
Um exemplo de um método de Amostra é Texture2D.Sample(S,float,int,float,uint).
Os parâmetros de deslocamento, vinculação e feedback são opcionais. Você deve especificar todos os parâmetros opcionais até aquele que você precisa, que é consistente com as regras do C++ para argumentos de função padrão. Por exemplo, se for necessário o status de feedback, parâmetros de compensação e vinculação precisam ser fornecidos explicitamente à Amostra, mesmo que eles talvez não sejam logicamente necessários.
O parâmetro de vinculação é um valor flutuante escalar. O valor literal de vinculação = 0.0f indica que a operação de vinculação não é executada.
O parâmetro de feedback é uma variável uint que você pode fornecer para o acesso à memória consultando a função intrínseca CheckAccessFullyMapped. Você não deve modificar ou interpretar o valor do parâmetro de feedback; porém, o compilador não fornece qualquer análise avançada e diagnóstico para detectar se você modificou o valor.
Veja aqui a sintaxe de CheckAccessFullyMapped:
bool CheckAccessFullyMapped(em uint FeedbackVar);
CheckAccessFullyMapped interpreta o valor de FeedbackVar e retorna true se todos os dados que estão sendo acessados foram mapeados no recurso; caso contrário, CheckAccessFullyMapped retorna false.
Se o parâmetro de feedback ou vinculação estiver presente, o compilador emite uma variante de instrução básica. Por exemplo, o exemplo de um recurso lado a lado gera a sample_cl_s
instrução . Se nem a vinculação nem o feedback forem especificados, o compilador emite a instrução básica, para que não haja nenhuma alteração do comportamento atual. O valor de vinculação de 0.0f indica que nenhuma vinculação é realizada; dessa forma, o compilador de driver adicional pode continuar adaptando a instrução para o hardware de destino. Se o feedback for um registro NULL em uma instrução, o feedback não é utilizado; dessa forma, o compilador de driver pode continuar adaptando a instrução para a arquitetura de destino.
Se o compilador HLSL infere que vinculação é 0.0f e feedback não é utilizado, o compilador emite a instrução básica correspondente (por exemplo, sample
em vez de sample_cl_s
).
Se um acesso a recursos lado a lado consistir em várias instruções de código de byte constituinte, por exemplo, para recursos estruturados, o compilador agrega valores de comentários individuais por meio da operação OR para produzir o valor final dos comentários. Portanto, você pode ver um único valor de feedback para tal acesso complexo.
Esta é a tabela resumida dos métodos HLSL que são alterados para dar suporte a feedback e/ou vinculação. Todos eles funcionam em recursos lado a lado e não lado a lado de todas as dimensões. Os recursos não lado a lado sempre parecem estar totalmente mapeados.
Objetos HLSL | Métodos intrínsecos com opção de feedback (*) - também tem a opção de vinculação |
---|---|
[RW]Texture2D [RW]Texture2DArray TextureCUBE TextureCUBEArray |
Coletar GatherRed GatherGreen GatherBlue GatherAlpha GatherCmp GatherCmpRed GatherCmpGreen GatherCmpBlue GatherCmpAlpha |
[RW] Texture1D [RW]Texture1DArray [RW]Texture2D [RW]Texture2DArray [RW]Texture3D TextureCUBE TextureCUBEArray |
Amostra* SampleBias* SampleCmp* SampleCmpLevelZero SampleGrad* SampleLevel |
[RW] Texture1D [RW]Texture1DArray [RW]Texture2D Texture2DMS [RW]Texture2DArray Texture2DArrayMS [RW]Texture3D [RW]Buffer [RW]ByteAddressBuffer [RW]StructuredBuffer |
Carregar |