Share 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 mais leves 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 diretos colocados e reservados 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 mais refinados. Somente a invalidação completa de recursos sobrepostos ocorre.

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 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 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 GUID (identificador global exclusivo) para a interface de recurso. Esse é um parâmetro de entrada.

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

ppvResource

Tipo: [out, opcional] void**

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

Retornar valor

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 retornados possíveis.

Comentários

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 uma técnica de peso ainda mais leve para reutilizar a memória do que a criação e a destruição de recursos, ou seja, reutilizar por meio de aliasing e 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 que 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 para a GPU ler ou gravar de um recurso inativo. Os recursos colocados são criados no estado inativo.

Para ativar um recurso com uma barreira de alias 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 se tornam inativos, o que inclui recursos sobrepostos colocados e reservados.

As barreiras de alias devem ser agrupadas e enviadas juntas, a fim de maximizar a eficiência.

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

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

Determinados tipos de recursos ainda exigem inicialização. Os recursos com o destino de renderização ou os sinalizadores de estêncil de profundidade devem ser inicializados com uma operação clara ou uma coleção de cópias completas do sub-recurso. Se uma barreira de alias foi usada para indicar a transição entre dois recursos com alias, a inicialização deve ocorrer após a barreira de alias. 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 os sinalizadores de estêncil de profundidade devem ser inicializados com uma das operações a seguir antes que outras operações sejam compatíveis.

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 de pixel normalmente requer que cada texel de profundidade comece em 1,0 ou 0. Portanto, uma operação Clear deve ser a opção mais eficiente para inicialização de buffer de profundidade com alias.
  • Um aplicativo pode usar um destino de renderização com alias 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 respeitar essas regras de nível inferior.

  • Uma barreira de alias deve estar entre dois acessos de recursos de GPU diferentes da mesma memória física, desde que esses acessos estejam dentro da mesma 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 um sub-recurso inteiro ou em uma granularidade de 64 KB. Há suporte para uma inicialização de sub-recurso 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).

Observações sobre a barreira de alias

A barreira de alias 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 as mesmas, de modo que dois acessos com alias à mesma memória física não precisam de nenhuma barreira de alias quando os acessos estão em duas invocações ExecuteCommandLists diferentes.

Para modelos de uso avançado D3D12, a definição de sincronização de ExecuteCommandLists é equivalente a uma barreira de alias. Portanto, os aplicativos podem inserir uma barreira de alias entre reutilização de memória física ou garantir que os dois usos de alias 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 Alias de memória e herança de dados.

Requisitos

Requisito Valor
Plataforma de Destino Windows
Cabeçalho d3d12.h
Biblioteca D3D12.lib
DLL D3D12.dll

Confira também

CreateCommittedResource

CreateReservedResource

ID3D12Device

Heaps compartilhados