A necessidade de recursos de streamingThe need for streaming resources

Os recursos de streaming são necessários para que a memória da GPU não seja desperdiçada armazenando regiões de superfícies que não serão acessadas, e para informar o hardware sobre como fazer a filtragem entre os blocos adjacentes.Streaming resources are needed so GPU memory isn't wasted storing regions of surfaces that won't be accessed, and to tell the hardware how to filter across adjacent tiles.

Recursos de streaming ou texturas esparsasStreaming resources or sparse textures

Recursos de streaming (chamados de recursos lado a lado no Direct3D 11), são recursos lógicos grandes que usam pequenas quantidades de memória física.Streaming resources (called tiled resources in Direct3D 11), are large logical resources that use small amounts of physical memory.

Os recursos de streaming também são chamados de texturas esparsas.Another name for streaming resources is sparse textures. "Esparso" refere-se à natureza lado a lado dos recursos, bem como ao provável motivo principal do agrupamento lado a lado dos recursos: que nem todos eles precisam ser mapeados de uma vez."Sparse" conveys both the tiled nature of the resources as well as perhaps the primary reason for tiling them - that not all of them are expected to be mapped at once. Na verdade, um aplicativo poderia perfeitamente criar um recurso de streaming em que nenhum dado é criado para todas as regiões + mips do recurso, intencionalmente.In fact, an application could conceivably author a streaming resource in which no data is authored for all regions+mips of the resource, intentionally. Então, o conteúdo em si poderia ser esparso, e o mapeamento do conteúdo na memória da GPU em um determinado momento seria um subconjunto disso (ainda mais esparso).So, the content itself could be sparse, and the mapping of the content in graphics processing unit (GPU) memory at a given time would be a subset of that (even more sparse).

Sem o agrupamento lado a lado, as alocações de memória seriam gerenciadas na granularidade de sub-recursoWithout tiling, memory allocations are managed at subresource granularity

Em um sistema gráfico (ou seja, o sistema operacional, driver de vídeo e hardware gráfico) sem suporte para recursos de streaming, o sistema gráfico gerencia todas as alocações de memória do Direct3D em uma granularidade de sub-recurso.In a graphics system (that is, the operating system, display driver, and graphics hardware) without streaming resource support, the graphics system manages all Direct3D memory allocations at subresource granularity.

Para um buffer, todo o buffer é o sub-recurso.For a buffer, the entire buffer is the subresource.

Para uma textura (por exemplo, Texture2D), cada nível de mip é um sub-recurso; para uma matriz de texturas (por exemplo, Texture2DArray), cada nível de mip em uma determinada fatia da matriz é um sub-recurso.For a Texture, (for example, Texture2D), each mip level is a subresource; for a texture array, (for example, Texture2DArray) each mip level at a given array slice is a subresource. O sistema gráfico expõe apenas a capacidade de gerenciar o mapeamento de alocações nessa granularidade de sub-recursos.The graphics system only exposes the ability to manage the mapping of allocations at this subresource granularity. No contexto de recursos de streaming, "mapeamento" refere-se a tornar os dados visíveis para a GPU.In the context of streaming resources, "mapping" refers to making data visible to the GPU.

Sem o agrupamento lado a lado, não é possível acessar somente uma pequena parte da cadeia de mipmapsWithout tiling, can't access only a small portion of mipmap chain

Suponhamos que um aplicativo saiba que uma operação de renderização específica precise acessar apenas uma pequena parte de uma cadeia de mipmaps de imagem (talvez nem mesmo a área completa de um determinado mipmap).Suppose an application knows that a particular rendering operation only needs to access a small portion of an image mipmap chain (perhaps not even the full area of a given mipmap). O ideal seria que o aplicativo pudesse informar o sistema gráfico sobre essa necessidade.Ideally, the app could inform the graphics system about this need. Em seguida, o sistema gráfico se preocuparia apenas em garantir que a memória necessária fosse mapeada para a GPU sem a paginação de muita memória.The graphics system would then only bother to ensure that the needed memory is mapped on the GPU without paging in too much memory.

Na realidade, sem o suporte para recursos de streaming, o sistema gráfico pode apenas ser informado sobre a memória que precisa ser mapeada para a GPU na granularidade de sub-recurso (por exemplo, uma variedade de níveis de mipmap completos que podem ser acessados).In reality, without streaming resource support, the graphics system can only be informed about the memory that needs to be mapped on the GPU at subresource granularity (for example, a range of full mipmap levels that could be accessed). Também não há falha de demanda no sistema gráfico. Portanto, provavelmente deve ser usada muita memória da GPU em excesso para mapear sub-recursos completos antes de um comando de renderização que referencie qualquer parte da memória seja executado.There is no demand faulting in the graphics system either, so potentially a lot of excess GPU memory must be used to make full subresources mapped before a rendering command that references any part of the memory is executed. Esse é apenas um problema que dificulta o uso de grandes alocações de memória no Direct3D sem o suporte para recursos de streaming.This is just one issue that makes the use of large memory allocations difficult in Direct3D without streaming resource support.

Paginação de software para dividir a superfície em blocos menoresSoftware paging to break the surface into smaller tiles

A paginação de software pode ser usada para dividir a superfície em blocos que sejam pequenos o suficiente para o hardware processar.Software paging can be used to break the surface into tiles that are small enough for the hardware to handle.

O Direct3D dá suporte para superfícies Texture2D com até 16384 pixels em um determinado lado.Direct3D supports Texture2D surfaces with up to 16384 pixels on a given side. Uma imagem de 16384 de largura por 16384 de altura e 4 bytes por pixel consumiria 1 GB de memória de vídeo (e adicionar mipmaps duplicaria essa quantidade).An image that is 16384 wide by 16384 tall and 4 bytes per pixel would consume 1GB of video memory (and adding mipmaps would double that amount). Na prática, raramente seria necessário referenciar o volume todo de 1 GB em uma única operação de renderização.In practice, all 1GB would rarely need to be referenced in a single rendering operation.

Alguns desenvolvedores de jogos modelam superfícies de terreno grandes de até 128 K por 128 K.Some game developers model terrain surfaces as large as 128K by 128K. Eles fazem isso funcionar nas GPUs existentes dividindo a superfície em blocos que sejam pequenos o suficiente para o hardware processar.The way they get this to work on existing GPUs is to break the surface into tiles that are small enough for hardware to handle. O aplicativo deve descobrir quais blocos podem ser necessário e carregá-los em um cache de texturas na GPU – um sistema de paginação de software.The application must figure out which tiles might be needed and load them into a cache of textures on the GPU - a software paging system.

Uma desvantagem significativa dessa abordagem é que o hardware não sabe nada sobre a paginação que está acontecendo: quando uma parte de uma imagem precisa ser mostrada na tela que cobre os blocos, o hardware não sabe como executar a filtragem de função fixa (ou seja, eficiente) nos blocos.A significant downside to that approach comes from the hardware not knowing anything about the paging that is going on: When a part of an image needs to be shown on screen that straddles tiles, the hardware does not know how to perform fixed function (that is, efficient) filtering across tiles. Isso significa que o aplicativo que gerencia o próprio agrupamento lado a lado de software deve recorrer à filtragem de textura manual no código do sombreador (que se torna muito caro se for desejado um filtro anisotrópico de boa qualidade) e/ou desperdiçar memória criando medianizes em torno de blocos que contenham dados de blocos vizinhos para que a filtragem de hardware de função fixa possa continuar a fornecer alguma ajuda.This means the application managing its own software tiling must resort to manual texture filtering in shader code (which becomes very expensive if a good quality anisotropic filter is desired) and/or waste memory authoring gutters around tiles that contain data from neighboring tiles so that fixed function hardware filtering can continue to provide some assistance.

Tornando a representação lado a lado das alocações de superfície um recurso de primeira classeMaking tiled representation of surface allocations a first-class feature

Se uma representação lado a lado das alocações de superfície for um recurso de primeira classe no sistema gráfico, o aplicativo poderá dizer ao hardware quais blocos devem ser disponibilizados.If a tiled representation of surface allocations is a first-class feature in the graphics system, the application could tell the hardware which tiles to make available. Dessa forma, menos memória da GPU é desperdiçada com o armazenamento de regiões de superfícies que o aplicativo sabe que não serão acessadas, e o hardware pode saber como filtrar blocos adjacentes, diminuindo os problemas enfrentados por desenvolvedores que executam o agrupamento lado a lado de software por conta própria.In this way, less GPU memory is wasted storing regions of surfaces that the application knows will not be accessed, and the hardware can understand how to filter across adjacent tiles, alleviating some of the pain experienced by developers who perform software tiling on their own.

Mas, para fornecer uma solução completa, algo deve ser feito para lidar com o fato de que, independentemente de haver suporte para o agrupamento lado a lado em uma superfície, a dimensão máxima de superfície é atualmente 16384 – não chega nem perto dos mais de 128 K que os aplicativos já querem.But to provide a complete solution, something must be done to deal with the fact that, independent of whether tiling within a surface is supported, the maximum surface dimension is currently 16384 - nowhere near the 128K+ that applications already want. Exigir apenas que hardware dê suporte para tamanhos maiores de textura é uma abordagem, mas existem custos e/ou compensações significativos para seguir esse caminho.Just requiring the hardware to support larger texture sizes is one approach, however there are significant costs and/or tradeoffs to going this route.

O caminho do filtro de textura e o caminho de renderização do Direct3D já estão saturados em termos de precisão no suporte para texturas de 16 K com os outros requisitos, como suporte para extensões do visor que saem da superfície durante a renderização ou suporte para encapsulamento de textura fora da borda da superfície durante a filtragem.Direct3D's texture filter path and rendering path are already saturated in terms of precision in supporting 16K textures with the other requirements, such as supporting viewport extents falling off the surface during rendering, or supporting texture wrapping off the surface edge during filtering. Uma possibilidade é definir uma compensação como, por exemplo, à medida que o tamanho da textura ultrapassa 16 K, a funcionalidade/precisão é renunciada de alguma maneira.A possibility is to define a tradeoff such that as the texture size increases beyond 16K, functionality/precision is given up in some manner. Mesmo com essa concessão, porém, os custos adicionais de hardware podem ser necessários em termos de endereçamento de funcionalidade em todo o sistema de hardware para chegar a tamanhos de textura maiores.Even with this concession however, additional hardware costs might be required in terms of addressing capability throughout the hardware system to go to larger texture sizes.

Problema com texturas grandes: precisão de locais na superfícieIssue with large textures: precision for locations on surface

Um problema que vem à tona quando as texturas ficam muito grandes é que as coordenadas de textura de ponto flutuante de precisão (e os interpoladores associados para dar suporte à rasterização) perdem a precisão para especificar locais na superfície com exatidão.One issue that comes into play as textures get very large is that single precision floating point texture coordinates (and the associated interpolators to support rasterization) run out of precision to specify locations on the surface accurately. Pode ocorrer filtragem de textura irregular.Jittery texture filtering would ensue. Uma opção cara seria exigir duplo suporte para interpoladores de precisão, embora isso possa ser um exagero visto que há uma alternativa razoável.One expensive option would be to require double precision interpolator support, though that could be overkill given a reasonable alternative.

Permitindo que vários recursos de dimensões diferentes compartilhem a memóriaEnabling multiple resources of different dimensions to share memory

Outro cenário pode ser servido por recursos de streaming é permitir que vários recursos de diferentes dimensões/formatos compartilhem a mesma memória.Another scenario that could be served by streaming resources is enabling multiple resources of different dimensions/formats to share the same memory. Às vezes, os aplicativos têm conjuntos de recursos exclusivos que não são usados ao mesmo tempo ou recursos que são criados apenas para uso muito breve e, em seguida, são destruídos, seguidos pela criação de outros recursos.Sometimes applications have exclusive sets of resources that are known not to be used at the same time, or resources that are created only for very brief use and then destroyed, followed by creation of other resources. Uma forma de generalidade que pode não se enquadrar nos "recursos de streaming" é que é possível permitir que o usuário aponte vários recursos diferentes para a mesma memória (sobreposta).A form of generality that can fall out of "streaming resources" is that it is possible to allow the user to point multiple different resources at the same (overlapping) memory. Em outras palavras, a criação e a destruição de "recursos" (que definem uma dimensão/formato e assim por diante) podem ser desvinculadas do gerenciamento da memória subjacente aos recursos do ponto de vista do aplicativo.In other words, the creation and destruction of "resources" (which define a dimension/format and so on) can be decoupled from the management of the memory underlying the resources from the application's point of view.

Tópicos relacionadosRelated topics

Recursos de streamingStreaming resources