Compartilhar via


Método ID3D12Device::CreatePlacedResource (d3d12.h)

Cria um recurso que é colocado em um heap específico. Os recursos colocados são os objetos de recurso de peso mais leve disponíveis e são os mais rápidos para criar e destruir.

Seu aplicativo pode reutilização da memória de vídeo sobrepondo vários recursos colocados e reservados do Direct3D em regiões de heap. O modelo de reutilização de memória simples (descrito em Comentários) existe para esclarecer qual recurso sobreposto é válido a qualquer momento. Para maximizar o suporte à ferramenta de gráficos, não há suporte para a herança de dados do modelo simples; não há suporte para a invalidação de blocos e sub-recursos refinados. Ocorre apenas a invalidação completa do recurso sobreposto.

Sintaxe

HRESULT CreatePlacedResource(
  ID3D12Heap                *pHeap,
  UINT64                    HeapOffset,
  const D3D12_RESOURCE_DESC *pDesc,
  D3D12_RESOURCE_STATES     InitialState,
  const D3D12_CLEAR_VALUE   *pOptimizedClearValue,
  REFIID                    riid,
  void                      **ppvResource
);

Parâmetros

pHeap

Tipo: [in] ID3D12Heap*

Um ponteiro para a interface ID3D12Heap do que representa o heap no qual o recurso é colocado.

HeapOffset

Tipo: UINT64

O deslocamento, em bytes, para o recurso. O heapOffset deve ser um múltiplo do alinhamento do recurso e heapOffset mais o tamanho do recurso deve ser menor ou igual ao tamanho do heap. GetResourceAllocationInfo deve ser usado para entender os tamanhos dos recursos de textura.

pDesc

Tipo: [in] const D3D12_RESOURCE_DESC*

Um ponteiro para uma estrutura de D3D12_RESOURCE_DESC que descreve o recurso.

InitialState

Tipo: D3D12_RESOURCE_STATES

O estado inicial do recurso, como uma combinação OR'd bit a bit de D3D12_RESOURCE_STATES constantes de enumeração.

Quando um recurso é criado junto com um heap de D3D12_HEAP_TYPE_UPLOAD, InitialState deve ser D3D12_RESOURCE_STATE_GENERIC_READ. Quando um recurso é criado junto com um heap de D3D12_HEAP_TYPE_READBACK, InitialState deve ser D3D12_RESOURCE_STATE_COPY_DEST.

pOptimizedClearValue

Tipo: [in, opcional] const D3D12_CLEAR_VALUE*

Especifica um D3D12_CLEAR_VALUE que descreve o valor padrão para uma cor clara.

pOptimizedClearValue especifica um valor para o qual as operações claras são mais ideais. Quando o recurso criado é uma textura com os sinalizadores D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET ou D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL, seu aplicativo deve escolher o valor com o qual a operação clara será mais comumente chamada.

Operações claras podem ser chamadas com outros valores, mas essas operações não serão tão eficientes quanto quando o valor corresponder ao passado para a criação de recursos.

pOptimizedClearValue deve ser NULL quando usado com D3D12_RESOURCE_DIMENSION_BUFFER.

riid

Tipo: REFIID

O identificador global exclusivo (GUID) para a interface de recurso. Esse é um parâmetro de entrada.

OREFIID , ou GUID, da interface para o recurso pode ser obtido usando a macro . Por exemplo, __uuidof(ID3D12Resource) obtém o guid da interface para um recurso. Embora riid seja, mais comumente, o GUID para ID3D12Resource, pode ser qualquer GUID para qualquer interface. Se o objeto de recurso não der suporte à interface para este guid, a criação falhará com E_NOINTERFACE.

ppvResource

Tipo: [out, opcional] nulo**

Um ponteiro para um bloco de memória que recebe um ponteiro para o recurso. ppvResource pode ser NULL, para habilitar o teste de capacidade. Quando ppvResource for NULL, nenhum objeto será criado e S_FALSE será retornado quando pResourceDesc e outros parâmetros forem válidos.

Valor de retorno

Tipo: HRESULT

Esse método retornará E_OUTOFMEMORY se não houver memória suficiente para criar o recurso. Consulte códigos de retorno do Direct3D 12 para obter outros valores de retorno possíveis.

Observações

CreatePlacedResource é semelhante ao mapeamento completo de um recurso reservado para um deslocamento dentro de um heap; mas o espaço de endereço virtual associado a um heap também pode ser reutilizado.

Os recursos colocados são mais leves para criar e destruir do que os recursos confirmados. Isso ocorre porque nenhum heap é criado nem destruído durante essas operações. Além disso, os recursos colocados permitem que uma técnica de peso ainda mais leve reutilize a memória do que a criação e a destruição de recursos, ou seja, reutilize por meio do aliasing e das barreiras de alias. Vários recursos colocados podem se sobrepor simultaneamente no mesmo heap, mas apenas um único recurso sobreposto pode ser usado por vez.

Há duas semânticas de uso de recursos colocadas: um modelo simples e um modelo avançado. Recomendamos que você escolha o modelo simples (ele maximiza o suporte à ferramenta gráfica em todo o ecossistema diversificado de GPUs), a menos e até descobrir que precisa do modelo avançado para seu aplicativo.

Modelo simples

Nesse modelo, você pode considerar que um recurso colocado está em um dos dois estados: ativo ou inativo. É inválido que a GPU leia ou escreva de um recurso inativo. Os recursos colocados são criados no estado inativo.

Para ativar um recurso com uma barreira de aliasing em uma lista de comandos, seu aplicativo deve passar o recurso em D3D12_RESOURCE_ALIASING_BARRIER::p ResourceAfter. pResourceBefore pode ser deixado NULL durante uma ativação. Todos os recursos que compartilham memória física com o recurso ativado agora ficam inativos, o que inclui sobreposição de recursos colocados e reservados.

As barreiras de aliasing devem ser agrupadas e enviadas em conjunto, a fim de maximizar a eficiência.

Após a ativação, os recursos com o destino de renderização ou sinalizadores de estêncil de profundidade devem ser inicializados. Veja as anotações sobre a inicialização de recursos necessária abaixo.

Anotações sobre a inicialização de recursos necessária

Determinados tipos de recursos ainda exigem inicialização. Recursos com o destino de renderização ou sinalizadores de estêncil de profundidade devem ser inicializados com uma operação clara ou uma coleção de cópias de sub-recursos completas. Se uma barreira de aliasing foi usada para indicar a transição entre dois recursos aliased, a inicialização deve ocorrer após a barreira de aliasing. Essa inicialização ainda é necessária sempre que um recurso teria sido ativado no modelo simples.

Os recursos colocados e reservados com o destino de renderização ou sinalizadores de estêncil de profundidade devem ser inicializados com uma das seguintes operações antes que outras operações sejam suportadas.

  • Uma operação Limpar; por exemplo, ClearRenderTargetView ou ClearDepthStencilView .
  • Uma operação de DiscardResource.
  • Uma operação Copiar; por exemplo, CopyBufferRegion, CopyTextureRegionou CopyResource.

Os aplicativos devem preferir a operação mais explícita que resulta na menor quantidade de texels modificados. Considere os exemplos a seguir.

  • O uso de um buffer de profundidade para resolver a visibilidade do pixel normalmente requer que cada texel de profundidade comece em 1,0 ou 0. Portanto, uma operação Limpar deve ser a opção mais eficiente para inicialização do buffer de profundidade aliased.
  • Um aplicativo pode usar um destino de renderização aliased como um destino para mapeamento de tom. Como o aplicativo será renderizado em cada pixel durante o mapeamento de tom, DiscardResource deve ser a opção mais eficiente para inicialização.

Modelo avançado

Nesse modelo, você pode ignorar a abstração de estado ativo/inativo. Em vez disso, você deve honrar essas regras de nível inferior.

  • Uma barreira de aliasing deve estar entre dois acessos diferentes de recursos de GPU da mesma memória física, desde que esses acessos estejam dentro do mesmo chamada ExecuteCommandLists.
  • A primeira operação de renderização para determinados tipos de recurso de alias ainda deve ser uma inicialização, assim como o modelo simples.

As operações de inicialização devem ocorrer em uma sub-fonte inteira ou em uma granularidade de 64 KB. Há suporte para uma inicialização de sub-recursos inteira para todos os tipos de recursos. Uma granularidade de inicialização de 64 KB, alinhada a um deslocamento de 64 KB, tem suporte para buffers e texturas com o layout de textura 64KB_UNDEFINED_SWIZZLE ou 64KB_STANDARD_SWIZZLE (consulte D3D12_TEXTURE_LAYOUT).

Anotações sobre a barreira de aliasing

A barreira de aliasing pode definir NULL para pResourceAfter e pResourceBefore. A definição de coerência de memória de ExecuteCommandLists e uma barreira de aliasing são iguais, de modo que dois acessos de alias à mesma memória física não precisam de nenhuma barreira de aliasing quando os acessos estão em duas ExecuteCommandLists invocações.

Para modelos de uso avançado D3D12, a definição de sincronização de ExecuteCommandLists é equivalente a uma barreira de aliasing. Portanto, os aplicativos podem inserir uma barreira de aliasing entre reutilização da memória física ou garantir que os dois usos aliased da memória física ocorram em duas chamadas separadas para ExecuteCommandLists.

A quantidade de inativação varia de acordo com as propriedades do recurso. Texturas com layouts de memória indefinidos são o pior caso, pois toda a textura deve ser inativada atomicamente. Para dois recursos sobrepostos com layouts definidos, a inativação pode resultar apenas nas regiões alinhadas sobrepostas de um recurso. A herança de dados pode até mesmo ser bem definida. Para obter mais detalhes, consulte aliasing de memória e herança de dados.

Requisitos

Requisito Valor
da Plataforma de Destino Windows
cabeçalho d3d12.h
biblioteca D3D12.lib
de DLL D3D12.dll

Consulte também

CreateCommittedResource

CreateReservedResource

ID3D12Device

heaps compartilhados