A história da primeira GPU: Rendition Vérité 1000

imagem

Há muita literatura boa sobre o mecanismo do Quake: livros, inúmeros artigos na Internet, blogs e wikis. Entre eles, meus favoritos são o Graphic Programming Black Book, de Michael Abrash, publicado em 1997, e Rocket Jump: Quake e a Era de Ouro dos Atiradores em Primeira Pessoa, por David L. Craddock (2018).

Infelizmente, você pode encontrar muito pouca informação sobre os equipamentos desenvolvidos por volta de 1996, o que possibilitou melhorar a renderização em 3D e, em particular, os gráficos do revolucionário software de identificação de jogos. Dentro da arquitetura e design dessas peças de silício, está a história de um duelo tecnológico entre o Rendition V1000 e o 3dfx Interactive Voodoo.

Após o lançamento do vQuake no início de dezembro de 1996, parecia que a Rendition havia assumido o controle. O V1000 era um cartão rápido capaz de iniciar o Quake com aceleração de hardware, que, segundo o desenvolvedor, fornece uma taxa de preenchimento de 25 megapixels / s [1] . Pouco antes do Natal, a Rendition assumiu o mercado, permitindo aos jogadores iniciar o jogo com alta resolução, taxa de quadros e cores de 16 bits [2] . Mas, como a história demonstrou, a falha no design do Vérité 1000 acabou sendo fatal para a empresa inovadora.

Aplicativos de hora e morte apropriadamente selecionados


A idéia de equipamento especializado para aceleração gráfica não apareceu de repente. Em 1954, a United Airlines possuía simuladores de vôo para treinamento de pilotos. O maior player no campo, Silicon Graphics, Inc. (SGI), apareceu em 1982 e, na época, oferecia estações de trabalho poderosas, como Indy, O2 e Indigo². No entanto, os preços dessas máquinas não permitiam que elas fossem compradas por consumidores comuns (a SGI Infinite Reality de 1993 poderia ser vendida por US $ 100.000, o que equivale a US $ 177.262 em 2019). O motivo da situação que surgiu no final dos anos 90 foi a combinação de três fatores.


Em primeiro lugar, o preço da RAM diminuiu significativamente. Embora houvesse uma enorme escassez de RAM em 1995 (principalmente porque 8 MB de memória eram recomendados para o Microsoft Windows 95), ao longo do ano, o preço da RAM caiu quase 90%. Isso abriu perspectivas de cartões com buffers de quadros incrivelmente grandes (640x480 com cores RGB de 16 bits) que podem armazenar texturas localmente.

Em segundo lugar, aumento do desempenho da RAM. A RAM do FastPage foi um passo à frente em comparação à DRAM, mas após o lançamento da EDO RAM, os atrasos diminuíram em 30% e o tempo de acesso à RAM foi de 50 ns [3] .

A terceira e última peça do quebra-cabeça eram aplicativos matadores. O PC possui CPUs poderosas, por exemplo, Intel Pentium com uma frequência de 166 MHz, que os desenvolvedores costumavam criar jogos 3D de alta qualidade. Em 1996, todo mundo estava falando sobre dois jogos: Tomb Raider da Core Design e Quake da id Software.



Rendition e V1000


A Rendition Inc foi fundada em 1993. Dois anos depois, em 1995, a empresa anunciou a criação da arquitetura V1000, que foi rapidamente licenciada por quatro OEMs. Os Creative Labs 3D Blaster PCI, Sierra Screamin '3D, Canopus Total 3D e Intergraph Reactor foram os primeiros a aparecer no mercado, e logo o MiRO assumiu.


Reator Intergraph. Imagem de vgamuseum.ru.


Creative Labs 3D Blaster. Imagem do clube “Retro Graphics Cards”.

Observe que o primeiro chip V1000-E foi posteriormente substituído por um V1000L-P com menor consumo de energia e 20% mais rápido [4] .


MiroCrystal VRX. Imagem de vgamuseum.info.


Canopus Total3D. Imagem de vgamuseum.ru.


O nome das cartas mudou, mas as fichas usadas nelas eram as mesmas. O único parâmetro pelo qual os fabricantes tiveram que equilibrar preço e desempenho foi a qualidade instalada no cartão de memória RAM.

  1. Porta VGA para conectar a um monitor CRT.
  2. Ramdac, geralmente de BT, mas às vezes um chip da AT&T.
  3. O núcleo da placa é um chip V1000-E, V1000-P ou v1000-L.
  4. Oito chips DRAM / EDO de 512 kibytes (total de 4 mebibytes) para armazenar buffers de quadros e texturas.
  5. 64 kb de EEPROM contendo BIOS.

O V1000 tinha duas propriedades inerentes que são importantes a serem observadas porque o 3dfx Voodoo (que discutirei mais adiante) usou uma abordagem radicalmente diferente.

Em primeiro lugar, o cartão deveria substituir o que já estava instalado no comprador. O chip suportava renderização 2D e 3D em VGA e, graças às alternâncias de contexto, tinha um impressionante modo "3D na janela". Portanto, o cartão tinha uma única porta VGA de saída.

O segundo recurso é a arquitetura “big iron”, baseada em uma única CPU Mips que obtém acesso a todos os 4 bytes de memória. O barramento de dados de 64 bits entre eles não tinha propriedades especiais. Esse design padronizado facilitou a programação da placa usando o microcódigo inicializável (isso transformou a placa na primeira GPU de um PC, muito antes da Nvidia apresentar essa definição).

Programação V1000


O SDK [5] veio com um conjunto de arquivos de cabeçalho para interagir com a linguagem C (RRedline no Windows e Speedy3D no DOS). A renderização do triângulo texturizado lembrava o que o Vulkan com VRAM manual fornece hoje. A API, capaz de renderizar triângulos texturizados baseados em ângulos, também suporta testes alfa, mistura alfa e neblina.

#include <string.h> #include <windows.h> #include <redline.h> WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdLine, int cmdShow){ int WIDTH=640, HEIGHT = 480; HWND hWndMain = ... ; // Setup Verite board and resolution/refresh rate v_handle verite; VL_OpenVerite(hWndMain, &verite); V_SetDisplayType(verite, V_FULLSCREEN_APP); V_SetDisplayMode(verite, WIDTH, HEIGHT, 16, 75); // Copy texture to VRAM bmp_info bmp = loadBMP("data\\rlogo.bmp"); v_memory memObj = V_AllocLockedMem(verite, bmp.linebytes*bmp.height); memcpy(V_GetMemoryObjectAddress(memObj), bmp.addr, bmp.linebytes*bmp.height); v_surface *display, *texture; VL_CreateSurface(verite, &display, V_SURFACE_PRIMARY, 2, V_PIXFMT_565, WIDTH, HEIGHT); VL_CreateSurface(verite, &texture, 0, 1, V_PIXFMT_565, bmp.width, bmp.height); v_cmdbuffer cmdbuffer = V_CreateCmdBuffer(verite, 0, 0); VL_LoadBuffer(&cmdbuffer, texture, 0, bmp.linebytes, bmp.width, bmp.height, memObj, 0); VL_InstallDstBuffer(&cmdbuffer, display); VL_InstallTextureMap(&cmdbuffer, texture); VL_SetSrcFunc(&cmdbuffer, V_SRCFUNC_REPLACE) // Clear screen to black VL_FillBuffer(&cmdbuffer, display, 1, 0, 0, display->width, display->height,0); // Populate cmd with triangle coo and textCoo v_kaxyzuvq vertex[3] = ... ; VL_Triangle(&cmdbuffer, V_FIFO_KAXYZUVQ, &vertex[0], &vertex[1], &vertex[2]); V_IssueCmdBuffer(verite, cmdbuffer); VL_SwapDisplaySurface(&cmdbuffer, display); } 

O RRedline carregou 128 KB de microcódigo no Vérité e converteu as chamadas C em chamadas de função do montador V1000.

Um fato interessante: o nome da API "RRedline" venceu a frase "Rendition Ready" e provavelmente foi escolhido coletivamente. No entanto, o nome Speedy3D foi a ideia de Walt Donovan.

De fato, a v1000 era apenas uma CPU lenta (25 MHz), com uma multiplicação de ciclo único de 32 * 32 (ocupando uma parte substancial do chip!), Uma instrução de ciclo único para calcular o valor inverso aproximado (ou seja, divisão inteira aproximada de dois ciclos) e um conjunto comum de instruções RISC. Ah, e também a instrução "carregamento bilinear", que leu um bloco de memória linear 2x2 e executou a filtragem bilinear com base nos valores fracionários de u e v passados ​​para a instrução. Aparentemente, havia um pequeno cache no mapa, apenas 4 pixels. Portanto, se um bloco 2x2 perfeitamente correspondente aparecesse, receberíamos uma redução na carga na largura de banda da memória.

Não havia suporte de hardware para Z-buffers. Portanto, o software em execução na v1000 precisava ler Z, executar uma comparação e decidir se deveria escrever ou não.

- Walt Donovan (arquiteto de algoritmos)

Para enviar texturas e microcódigo para o cartão, o driver usou o DMA para transferir dados via PCI sem intervenção da CPU. Na prática, muitas placas-mãe não tinham controle de barramento corretamente, então os jogos tiveram que retornar ao modo PCI FIFO, o que afetou negativamente o desempenho [6] . Dentro do cartão, todas as operações foram realizadas em números inteiros de ponto fixo de 32 bits.

Os desenvolvedores decidiram que o Rendition seria totalmente programável, mas não usavam pipeline inteligente ou sincronização rápida. Portanto, se forem necessárias 25 instruções para gravar um pixel, obteremos apenas 1 megapixel / s. Se você usar equipamento com funcionalidade fixa, poderá criar um transportador equivalente a essas 25 instruções e atingir 25 megapixels / s. Os funcionários da 3dfx vieram da SGI, então escolheram a abordagem que acabou sendo a decisão certa - criar um mecanismo de processamento triangular com funcionalidade fixa e um subconjunto de funções OpenGL para gerenciamento no equipamento. Os desenvolvedores do V1000 tiveram uma experiência completamente diferente, não conheciam o OpenGL e, portanto, decidiram que seria mais correto criar uma CPU.

- Walt Donovan (arquiteto de algoritmos)

Além de todo esse conjunto de funções, o cartão também tinha um inovador sistema anti-aliasing, que teve um efeito colateral engraçado.

O algoritmo anti-aliasing usado no vQuake foi patenteado (número de patente 6005580). Havia uma piada engraçada sobre esse algoritmo. Funcionava apenas com triângulos, mas não com intervalos. Quake usou o conceito de "buffer z perfeito", no qual os gráficos foram divididos em intervalos e classificados visualmente usando BSP / PVS (particionamento de espaço binário / conjunto de elementos potencialmente visíveis). Portanto, o mecanismo criou um conjunto de intervalos que idealmente cobriam a tela sem sobreposições e pixels ausentes e, para renderização, uma única operação de gravação (sem buffer z!) Na memória do monitor era necessária. No entanto, os dados iniciais para esses intervalos foram triângulos. O algoritmo antialiasing procurou bordas das silhuetas e as suavizou. (Para obter mais informações sobre essa idéia, consulte humus.name, entrada de antialiasing geométrica pós-processo de março de 2011 - o autor inventou essa tecnologia novamente!) Mas como o antialiasing foi realizado após a renderização da tela (todos os intervalos já foram desenhados), o algoritmo de conceito aparentemente, tinha uma costela ou não. Ele pintou de qualquer maneira. (Se um buffer z fosse usado, apenas as bordas visíveis seriam redesenhadas!) Na prática, isso não era um grande problema, porque o BSP geralmente corta triângulos invisíveis muito bem.

Mas não com modelos de personagens! Portanto, o vquake permitiu ao jogador ver pessoas se escondendo atrás de portas e paredes, criando uma distorção pequena e comovente nas texturas!

- Walt Donovan (arquiteto de algoritmos)

vQuake


No momento do lançamento dos cartões, eles apoiavam alguns bons jogos. Sim, Descent II, Grand Prix Legends, IndyCar Racing II, Myst, Nascar Racing, EF2000 e Tomb Raider eram bons jogos, mas Quake era o verdadeiro diamante da coroa, a venda mais exigente e promotora. O game id Software recebeu sua própria porta na Vérité chamada vQuake, lançada em 2 de dezembro de 1996. Foi escrito por Walt Donovan e Stefan Share, da Vérité, em colaboração com o id Abrash Michael.

O trabalho foi bastante meticuloso, mas o porto funcionou. O Pentium 166Mhz, capaz de renderizar o Quake na resolução 320x200 a 26 quadros por segundo, poderia pular para 640x480 com filtragem bilinear e ainda renderizar 22 quadros por segundo [8] . Na prática, os jogadores escolheram uma resolução de 512x384, que parecia bonita e possibilitou fornecer 32 quadros por segundo no P166. Por um curto período de tempo, o vQuake tem sido inegavelmente a melhor maneira de jogar Quake.

imagem

Renderização de software

imagem

Vérité V1000

Muito obrigado ao usuário @swaaye do fórum vogons.org pelas capturas de tela da V1000 e Fruit Of the Dojo por seu Quake de alta qualidade e fácil de hackear no MacOSX [9] .

imagem

Renderização de software

imagem

Vérité V1000

Falha no buffer Z


O que faltava ao V1000 (e indiretamente seu sucessor V2200) era a aceleração de hardware do z-buffer. Assim que o desenvolvedor incluiu um teste de profundidade, a taxa de preenchimento caiu para 12,5 megapixels / se a taxa de quadros foi reduzida pela metade. Como Stefan Podell explicou mais tarde [10] , o vQuake (e todos os outros jogos) foram portados para o V1000 de forma a minimizar a leitura do z-buffer.

Os desenvolvedores descobriram que a única maneira de garantir a velocidade necessária era transferir a parte principal do trabalho para a CPU. No caso do vQuake, isso significava que o mapa seria usado como um renderizador de intervalo horizontal ultra-rápido que sempre grava no buffer z, mas z é lido e comparado apenas ao renderizar inimigos. E, embora os desenvolvedores tenham conseguido criar bons produtos, as consequências dessa escolha de arquitetura pairaram por um longo tempo.

3dfx e drop Rendition


A id Software lançou o GLQuake em 22 de janeiro de 1997. Foi implementado com base no miniGL (um subconjunto do padrão OpenGL 1.0, que, entre outras coisas, carecia de GL_LIGHT e GL_FOG). Esse binário abriu a porta para todas as placas de PC aceleradas por hardware. Nesse sentido, as placas Voodoo da 3dfx Interactive foram particularmente destacadas, seu desempenho impressionante (41fps na resolução 512x384 com cores de 16 bits na P166 [11] ) tornou-se o padrão de fato para os aceleradores 3D. A taxa de preenchimento do V1000 de 25 megapixels / s, que antes se compara favoravelmente à renderização do software Pentium, agora parecia medíocre contra um fundo de 50 megapixels / s do cartão Voodoo, que nem foi afetado pelos testes z.

A resposta da Rendition foi a V2x00 mais poderosa, que paradoxalmente piorou a situação. Foi anunciado que, graças ao buffer z do hardware, o V2x00 era duas vezes mais rápido, no entanto, não foi possível melhorar nem mesmo a taxa de quadros no vQuake. Essa anomalia minou a confiança do cliente e teve um efeito negativo no desenvolvedor do vQuake, Stefan Sharele, que sentiu que precisava explicar por que o desempenho do vQuake era limitado pela CPU e não pela GPU [12] .

... minha reputação acabou sendo manchada pelo fato de o VQuake e o VHexen2 não funcionarem mais rapidamente no V2x00, por isso devo explicar por que isso aconteceu.

[...]

Walt e Michael decidiram que, como o Verite 1000 não apresentava um desempenho muito bom em pixels com buffer Z, permitir que o Pentium fizesse essa classificação de intervalos reduziria o número de pixels que a Verite precisa desenhar. Além disso, poderíamos desativar a função de comparação Z no Verite.

[...]

... qualquer que fosse o chip Verite, a CPU teve muito trabalho.

- Stefan Podell

Além disso, houve problemas significativos na arquitetura do hardware, o que inicialmente levou à falha do [13] V2x00. Demorou vários meses para resolver o problema, e mesmo depois disso a placa ainda trabalhava com uma frequência de 50 MHz, enquanto a NVidia NV3 e o Voodoo2 já atingiam 100 MHz.

A terceira geração, baseada no V3300, poderia mudar o curso da história, mas saiu tarde demais. O projeto foi cancelado em 1998, após a aquisição da Rendition pela Micron Technology.

Enquanto trabalhava na Rendition, cometemos muitos erros. Era possível lançar a v1000 alguns meses antes (e não ter concorrentes durante esses meses) se desenvolvêssemos o esquema e não transferíssemos para a fábrica. Além disso, o controle de qualidade do chip levantou questões. Um cara da nossa empresa passou vários meses implementando a descompressão de mpeg na linguagem assembly V1000, mas não conseguiu fazê-lo funcionar devido a erros imprevisíveis de chip.

O vQuake funcionou bem apenas porque o v1000 não fez muito trabalho. "Renderize esta lista de intervalos", "suavize essa margem" - foi quase tudo o que ele fez. Mike Abrash e eu gastamos muito tempo tornando o Quake compatível com o V1000, portanto esse modelo não era adequado a longo prazo.

- Walt Donovan (arquiteto de algoritmos)

Após o colapso da Rendition, a 3dfx redobrou seus esforços para promover o Voodoo2, cujas características excepcionais permitiram varrer todos os concorrentes. O rei dos gráficos 3D no PC governa o mercado há um tempo. Então o jogo continuou, novos concorrentes apareceram em cena e entre eles estavam a ATI canadense e uma empresa quase desconhecida na época chamada Nvidia.

Referências


[1] Fonte: Museu VGA, V1000 Texel Fillrate (MTexel / s) relatado como 25

[2] Fonte: John Carmack .plan, 22 de agosto de 1996 "às 512 * 384 é quase o dobro da velocidade"

[3] Fonte: 3dfx VOODOO1 Reference Rev. 1.0

[4] Fonte: Revisão do V1000

[5] Fonte: Rendition Verite V1000 SDK

[6] Fonte: A imaturidade do barramento PCI [...] causado pela superfície de bugs de DMA

[7] Fonte: Guia de programação RRedline

[8] Fonte: Pontos de referência para comparar a Rendition Vérité V1000-E e V1000L-P.

[9] Fonte: código fonte da porta MacOSX X Quake no github.com

[10] Fonte: publicação de Stephan Podell BSS.

[11] Fonte: Comparação das taxas de quadros no GLQuake usando o Voodoo1.

[12] Fonte: publicação de Stephan Podell BSS

[13] Fonte: wikipedia.com, seção de queda

Source: https://habr.com/ru/post/pt446570/


All Articles