top of page

TinyGPU v2.0 Funciona em Silício, mas Sua Alegação de Menor GPU Enfrenta um Teste Maior

A Tom Hardware relata que o TinyGPU v2.0 agora funciona em silício físico, transformando cerca de 240.000 transistores em um processador de gráficos 3D operacional. O designer Pongsagon Vichit mostrou o chip produzindo gráficos após sua rodada de fabricação pelo Tiny Tapeout. Isso transforma o projeto de um experimento em FPGA em um circuito integrado de aplicação específica fabricado, ou ASIC.

O resultado importa porque a fabricação expõe problemas que a simulação de software e os testes em FPGA podem ocultar. Comportamento de clock, temporização de sinais, acesso à memória e integração no nível da placa precisam sobreviver ao contato com o hardware físico. O vídeo de Vichit indica que o pipeline essencial funciona, embora a demonstração disponível não responda a todas as questões de desempenho ou confiabilidade.

Esta não é uma desafiante em miniatura para Nvidia, AMD ou Intel. O TinyGPU v2.0 renderiza cenas deliberadamente modestas em baixa resolução e com profundidade de cor limitada. Seu verdadeiro adversário é a distância entre um protótipo interessante em FPGA e um silício funcional reproduzível. Cruzar essa distância dá ao projeto um valor técnico muito além de sua taxa de quadros.

A próxima questão diz respeito ao TinyGPU v3.0. Vichit está desenvolvendo um design mais programável, com recursos de pixel shader e correções para limitações conhecidas da v2.0. Esse roteiro aumenta o desafio porque cada capacidade adicionada consome lógica, largura de banda de memória e esforço de verificação.

Tom Hardware Afirma que TinyGPU Superou Seu Teste em Silício

A mudança importante não é que o TinyGPU exibe gráficos 3D simples. É que o chip fabricado supostamente faz o que seu projeto digital prometia.

Vichit testou anteriormente o TinyGPU v2.0 em uma placa FPGA Basys3. Uma FPGA é um chip configurável que permite aos designers testar lógica de hardware antes de se comprometerem com um layout fixo. Essa etapa mostrou que a arquitetura podia renderizar modelos, aceitar entrada de controle e acionar uma tela VGA.

Fabricar um ASIC remove essa flexibilidade. A lógica se torna uma disposição física de transistores e fios. Uma falha de projeto não pode ser corrigida carregando uma nova configuração no mesmo chip. Erros significativos normalmente exigem outra rodada de fabricação.

De acordo com o relatório de teste em silício de 4 de agosto, o silício TinyGPU v2.0 retornado produziu gráficos reais durante os testes. O relatório descreve o resultado como uma demonstração bem-sucedida no mundo real após a rodada de produção do Tiny Tapeout.

Essa evidência sustenta uma alegação mais restrita do que a qualificação completa de um produto. Um vídeo pode mostrar que funções principais operam em uma configuração testada. Ele não estabelece rendimento de fabricação, tolerância de tensão, estabilidade de longa duração ou desempenho em múltiplas amostras.

Essas distinções importam na cobertura de semicondutores. Engenheiros frequentemente chamam a primeira versão retornada de silício A0. Obter uma saída útil do A0 é significativo porque muitos erros de hardware se tornam caros após o tapeout. Tapeout é o momento em que o layout concluído de um chip entra em fabricação.

O pipeline demonstrado supostamente lida com transformação, iluminação, rasterização e saída para tela. A transformação converte coordenadas de modelos em posições para a tela. A rasterização determina quais pixels pertencem a cada triângulo. A iluminação ajusta a cor visível de uma superfície usando a direção de luz selecionada.

A documentação do projeto do designer descreve uma arquitetura de 25 MHz que usa cerca de 240.000 transistores na forma fabricada. Ela suporta modelos com até 1.000 triângulos, embora a velocidade real dependa da complexidade da cena e dos recursos ativados.

O alvo de exibição documentado é de 320 por 240 pixels, com cor de 4 bits. A cor de quatro bits fornece 16 valores de cor possíveis dentro do esquema de paleta relevante. Isso é extremamente limitado diante dos gráficos modernos, mas suficiente para mostrar objetos reconhecíveis com sombreamento ou texturas.

O projeto também depende de memória QSPI externa. QSPI é uma interface serial que transfere dados por várias linhas de sinal. O TinyGPU usa esse hardware externo para dados de modelos, armazenamento de quadros e informações de profundidade que consumiriam área demais no chip.

A configuração de Vichit inclui um módulo de saída VGA, hardware QSPI, uma interface de gamepad e um controle SNES. Os usuários podem girar modelos, alterar sua escala ou ajustar a luz direcional. Esses controles tornam a demonstração interativa, em vez de uma animação fixa gravada no circuito.

A Tom Hardware já havia coberto o design antes da fabricação, quando a estimativa relatada de transistores estava mais próxima de 200.000. O número atual de 240.000 reflete a implementação fabricada descrita por Vichit. As estimativas podem mudar à medida que a síntese e o layout físico traduzem a lógica-fonte em células padrão reais.

O resultado, portanto, elimina uma incerteza enquanto deixa várias outras em aberto. O TinyGPU v2.0 não é mais apenas uma alegação baseada em simulação ou FPGA. Ele é, segundo relatos, silício funcional, mas continua sendo um chip experimental, e não uma GPU comercial qualificada.

Uma GPU de 240.000 Transistores É Realmente um Estudo de Restrições

O TinyGPU se torna interessante quando suas limitações são tratadas como requisitos de projeto, e não como comparações constrangedoras com placas gráficas de desktop.

Uma GPU discreta moderna contém bilhões de transistores, cache extenso, blocos especializados de computação, mecanismos de vídeo e grandes interfaces de memória. O TinyGPU v2.0 não tem nada dessa escala. Comparar seu desempenho nominal revelaria pouco sobre o problema de engenharia que Vichit escolheu resolver.

O problema dele é a compressão. A arquitetura precisa preservar o suficiente de um pipeline gráfico convencional para transformar e desenhar geometria 3D dentro de um orçamento minúsculo de lógica. Cada registrador, multiplicador, buffer e estado de controle compete pela mesma área limitada de silício.

A aritmética de ponto fixo ajuda a controlar esse orçamento. Números de ponto fixo reservam bits predeterminados para suas partes inteira e fracionária. Eles exigem menos circuitos do que operações gerais de ponto flutuante, mas os designers precisam gerenciar cuidadosamente intervalo e precisão.

O pipeline também usa sombreamento plano com uma luz direcional dinâmica. O sombreamento plano atribui um valor de iluminação consistente a todo um triângulo, em vez de calcular mudanças suaves para cada vértice ou pixel. Essa escolha reduz o processamento, preservando uma forma 3D visível.

A remoção de faces traseiras elimina triângulos voltados para longe da câmera. Essas superfícies normalmente não podem ser vistas, portanto ignorá-las economiza trabalho de rasterização. Trata-se de uma técnica gráfica padrão cujo benefício se torna especialmente importante com um orçamento pequeno de transistores e clock.

Um buffer de profundidade de 8 bits registra qual superfície deve aparecer à frente em cada posição. Sem o teste de profundidade, triângulos desenhados posteriormente poderiam cobrir incorretamente uma geometria mais próxima. A precisão limitada é adequada para essas cenas compactas, embora fosse insuficiente para muitos ambientes maiores.

O buffer duplo de 4 bits mantém superfícies separadas para desenho e exibição. Um buffer pode ser mostrado enquanto o próximo quadro é preparado. Alterná-los reduz o tearing visível, em que partes de dois quadros aparecem juntas durante uma atualização.

Esses recursos fazem do TinyGPU v2.0 mais do que um gerador de padrões com lógica fixa. O chip aceita dados de modelos e processa geometria por estágios reconhecíveis. No entanto, ele continua sendo um design de função fixa, com limites rígidos para o tamanho das cenas, a qualidade de saída e os efeitos compatíveis.

A faixa de taxa de quadros relatada chega a aproximadamente 7,5 a 15 quadros por segundo em cenas apropriadas. O repositório também documenta um exemplo texturizado de 1.000 triângulos a 6,5 FPS. Esses números descrevem diferentes cargas de trabalho, portanto não devem ser tratados como benchmarks universais conflitantes.

A taxa de quadros depende da contagem de triângulos, da área visível, do trabalho com texturas, dos atrasos de memória e de outros detalhes da cena. Um objeto pequeno pode exigir menos processamento de pixels do que uma geometria que cobre a maior parte da tela. Qualquer comparação séria requer modelos, configurações, clocks e condições de saída idênticos.

Esse contexto de benchmark ainda está incompleto. O vídeo do silício confirma uma operação visível, mas não fornece uma suíte ampla de desempenho. Também não estabelece se todos os recursos documentados foram exercitados durante o teste gravado.

É nesse ponto que o rótulo de menor GPU exige cautela. "GPU" não tem um único limite de transistores, e projetos independentes de hobby implementam diferentes subconjuntos de funcionalidades gráficas. Alguns desenham apenas primitivas básicas, enquanto outros incluem transformação, texturas, iluminação ou estágios programáveis.

O título é, portanto, uma abreviação útil, e não uma premiação padronizada. A distinção mais defensável do TinyGPU é sua combinação de silício fabricado e um pipeline 3D compacto e autossuficiente. Os leitores devem avaliar as funções documentadas em vez de se basearem apenas no superlativo.

Essa combinação também cria valor educacional. O código-fonte expõe o pipeline em Verilog, uma linguagem de descrição de hardware usada para definir circuitos digitais. Desenvolvedores podem examinar como conceitos gráficos se tornam máquinas de estado, unidades aritméticas e transações de memória.

Para estudantes, isso torna uma saída visual familiar uma porta de entrada para o design de chips. Um modelo girando é mais fácil de interpretar do que uma forma de onda abstrata. Ainda assim, cada quadro visível depende das mesmas disciplinas de temporização, verificação e projeto físico usadas em chips maiores.

Tiny Tapeout Transforma a Lacuna do Protótipo na Principal Disputa

A principal vitória do TinyGPU é sobre a barreira de custo e coordenação que normalmente mantém pequenos projetos de hardware longe do silício fabricado.

A fabricação de chips normalmente favorece organizações que podem preencher um die grande e gerenciar fluxos de engenharia especializados. Um designer individual raramente precisa de uma wafer inteira. Mesmo um circuito experimental minúsculo envolve requisitos de configuração, encapsulamento, validação e fabricação.

O programa de wafer compartilhada muda essa equação ao colocar muitos designs pequenos no mesmo chip fabricado. Cada participante recebe uma área de tile definida. A infraestrutura compartilhada lida com interfaces comuns, lógica de seleção e acesso por meio de uma placa de demonstração.

Esse modelo se assemelha ao transporte compartilhado. Cada design ocupa apenas parte do veículo disponível, de modo que nenhum participante precisa financiar toda a viagem. A analogia é imperfeita, mas explica por que wafers com múltiplos projetos se tornaram valiosas para educação e experimentação.

O TinyGPU v2.0 usa uma alocação de 4 por 4, equivalente a 16 tiles do Tiny Tapeout. Trata-se de um projeto grande dentro do modelo compacto de design da plataforma. A alocação ainda obriga Vichit a fazer escolhas que uma equipe de GPU para desktop resolveria com muito mais silício.

O programa também impõe limites de interface. Memória externa, saída de vídeo e entrada de controle precisam passar pelos pinos disponíveis e pelas placas complementares compatíveis. Essas restrições moldam a arquitetura tão diretamente quanto a contagem de transistores.

O processo começa muito antes da fabricação. Vichit precisa descrever o circuito em Verilog sintetizável, isto é, código que ferramentas podem converter em lógica real. Verificações automatizadas então validam interfaces, pressupostos de temporização e requisitos de layout físico.

A síntese mapeia o projeto em uma biblioteca de células padrão. O posicionamento atribui locais físicos a essas células. O roteamento as conecta com trilhas metálicas, respeitando as regras de fabricação. O layout concluído então se junta a outros projetos no tapeout compartilhado.

A simulação permanece essencial em todo esse fluxo. Um testbench fornece entradas e verifica as saídas esperadas antes da fabricação. A prototipagem em FPGA acrescenta outra camada ao executar lógica semelhante em hardware reconfigurável com periféricos reais.

Nenhuma das etapas prevê perfeitamente o silício. O roteamento, os blocos de memória e a temporização de uma FPGA diferem de um processo ASIC. Chips físicos também introduzem comportamentos de clock, reset, alimentação e integridade de sinal que testes simplificados podem não detectar.

É por isso que uma saída funcional após a fabricação tem mais peso do que outro vídeo de FPGA. O resultado indica que o fluxo de ferramentas, a plataforma compartilhada, a conexão da placa, a memória externa e a lógica gráfica funcionaram em conjunto. Uma falha em qualquer elo crítico poderia ter impedido a exibição de um quadro visível.

Os resultados históricos do Tiny Tapeout oferecem um contexto útil. Execuções anteriores colocaram processadores, geradores de sinais, monitores, aceleradores e circuitos analógicos experimentais em silício compartilhado. A plataforma não é dedicada a gráficos, o que torna o TinyGPU um teste de estresse para seu modelo geral de projeto.

Um pipeline gráfico combina aritmética, sequenciamento, tráfego de memória e temporização rígida de exibição. Perder a sincronização pode corromper uma imagem inteira. Coordenar esses elementos com sucesso torna o projeto uma demonstração mais rica do que um simples contador ou uma luz piscando.

Ainda assim, o tapeout compartilhado não elimina o risco de engenharia. Ele redistribui a infraestrutura e reduz a barreira de entrada. Os projetistas continuam responsáveis pela correção funcional, temporização, uso de recursos e comportamento do hardware ao redor.

A plataforma também não pode fazer um circuito limitado se comportar como um maior. A resolução, a profundidade de cor, a frequência de clock e o orçamento de cena do TinyGPU continuam sendo consequências diretas de suas escolhas de projeto. A acessibilidade não elimina a relação entre área e capacidade.

A pressão, portanto, recai sobre pressupostos tradicionais a respeito de quem pode fabricar um processador interessante. O TinyGPU não pressiona o roteiro de produtos da Nvidia. Ele pressiona a crença de que silício gráfico personalizado pertence apenas a grandes empresas ou laboratórios universitários.

Essa mudança tem implicações além das GPUs. Chips pequenos e abertos permitem que desenvolvedores testem aceleradores incomuns, interfaces e processadores educacionais em seu meio físico final. Algumas ideias falharão, mas essas falhas podem se tornar evidências de engenharia visíveis e reproduzíveis.

O que a demonstração do TinyGPU v2.0 não comprova

A saída funcional estabelece a funcionalidade básica, mas não estabelece um benchmark completo, prontidão para produção ou um recorde mundial incontestável.

A primeira incerteza diz respeito ao escopo dos testes. Imagens públicas podem mostrar um modelo aparecendo em um monitor e respondendo a entradas. Elas não podem revelar se todos os caminhos aritméticos, condições de memória, orientações de triângulos ou estados de controle se comportam corretamente.

Uma validação abrangente exigiria múltiplas cenas de teste e medições repetíveis. Os avaliadores também precisariam de informações sobre amostras de silício, estabilidade de clock, tensão, temperatura, resets e operação de longa duração. Esses resultados não acompanharam o relatório inicial.

A segunda incerteza diz respeito ao desempenho. A faixa citada de 7,5 a 15 FPS parece consistente com expectativas anteriores para FPGA, mas as cargas de trabalho influenciam fortemente o resultado. Um benchmark precisa de um modelo, câmera, textura, viewport e método de medição fixos.

A dependência do chip em relação à memória QSPI externa complica ainda mais a interpretação. A latência de memória pode interromper ou ditar o ritmo de diferentes estágios do pipeline. O repositório inclusive documenta configurações de latência ajustáveis para o módulo de memória conectado.

Isso não enfraquece o projeto. A memória externa é uma escolha arquitetural legítima, especialmente quando o armazenamento no chip dominaria a área. Isso apenas significa que a expressão "GPU independente" não deve ser confundida com um único componente que não requer hardware de suporte.

A GPU ainda precisa de memória, clock, alimentação, conexões de vídeo e hardware de entrada. Processadores comerciais também dependem de sistemas ao redor. Aqui, "independente" significa que o pipeline gráfico roda em lógica fabricada, e não dentro de uma FPGA ou microcontrolador.

A terceira incerteza é a falha de viewport documentada por Vichit. Na v2.0, uma geometria que se estende além do viewport visível pode congelar a GPU e forçar um reset. Um viewport define a área retangular da tela onde a cena deve aparecer.

Essa é uma limitação substancial para renderização 3D geral. Câmeras rotineiramente movem objetos parcialmente para fora da tela. Um processador gráfico deveria recortar ou rejeitar a geometria relevante sem travar seu pipeline.

Vichit afirma que o TinyGPU v3.0 resolve o problema. Até que essa versão seja publicada e testada, a correção permanece parte do roteiro. A limitação também ilustra por que hardware programável ou flexível aumenta as exigências de verificação.

Uma quarta preocupação envolve a descrição de "menor do mundo". O anterior primeiro projeto de GPU de Vichit usava cerca de 16.000 portas e renderizava apenas dois triângulos texturizados. Outros circuitos gráficos minúsculos fazem concessões diferentes, o que torna a classificação direta difícil.

O chip anterior tinha como alvo saída de 640 por 480 a 60 FPS, o que parece mais rápido do que a v2.0. No entanto, ele lidava com uma cena radicalmente menor e não tinha a capacidade da v2.0 para arquivos de modelo contendo até 1.000 triângulos.

Essa aparente inversão mostra por que comparações unidimensionais falham. Maior resolução ou taxa de quadros não significa automaticamente uma arquitetura mais capaz. O TinyGPU v2.0 aceita geometria muito mais rica enquanto opera em uma taxa de exibição menor.

GPUs modernas representam o extremo oposto. Seus bilhões de transistores suportam aritmética paralela massiva, agendamento complexo, shaders programáveis, hierarquias de cache e memória de alta largura de banda. O TinyGPU remove intencionalmente a maior parte desses sistemas.

A GeForce 256 da Nvidia oferece uma referência histórica mais relevante do que uma placa gamer atual. Lançada em 1999, ela ajudou a popularizar transformação e iluminação por hardware como uma função definidora de GPU. O TinyGPU reproduz conceitos relacionados em escala experimental.

No entanto, terminologia compartilhada não implica amplitude comparável. Hardware da classe GeForce tinha como alvo jogos comerciais, compatibilidade de software e cargas de trabalho sustentadas de clientes. O TinyGPU é um projeto aberto de aprendizado que ilustra mecanismos selecionados.

Tom Hardware enquadra adequadamente o dispositivo como uma conquista de entusiasta, e não como uma alternativa de compra. A leitura mais útil segue essa distinção. Sua importância está no silício visível e na economia arquitetural, não no desempenho para consumidores.

O projeto ganharia evidências mais fortes com arquivos de teste reproduzíveis, condições de clock registradas e resultados de vários chips. Desenvolvedores independentes poderiam então comparar o comportamento do hardware com a simulação e a saída de FPGA.

O código aberto torna esse processo possível, mas a publicação por si só não o completa. O código-fonte permite inspeção. Testes de hardware repetíveis transformam a inspeção em uma verificação mais robusta.

O TinyGPU v3.0 testará se a programabilidade cabe no mesmo pequeno envelope

A próxima versão precisa adicionar flexibilidade sem perder a simplicidade disciplinada que permitiu à v2.0 chegar a silício funcional.

O roteiro público de Vichit descreve o TinyGPU v3.0 como uma mudança de um pipeline fixo para o processamento programável de pixels. Um pixel shader é um pequeno programa que calcula a cor de saída dos pixels. Ele permite efeitos que regras fixas de iluminação e textura não conseguem expressar.

Publicações públicas atribuídas a Vichit descrevem um projeto inspirado nos pixel shaders do início do DirectX 8. O núcleo proposto processa quatro pixels em paralelo por meio de execução de instrução única, múltiplos dados. SIMD aplica uma instrução a vários elementos de dados simultaneamente.

O projeto relatado usa um conjunto compacto de instruções e um número limitado de registradores temporários. A execução mascarada fornece um método restrito para lidar com comportamentos condicionais. Essas escolhas buscam preservar a programabilidade sem importar a complexidade de uma arquitetura moderna de shaders.

Esse é o mecanismo que vale acompanhar. A programabilidade pode substituir vários circuitos fixos por lógica reutilizável de aritmética e controle. Ela também pode exigir armazenamento de instruções, decodificação, registradores, agendamento e testes de hazards mais extensos.

A v3.0 também precisa resolver o problema do viewport. Vichit discutiu rejeição de plano próximo e plano distante juntamente com recorte por guard band. O recorte por guard band permite coordenadas além da área visível antes que estágios posteriores restrinjam os pixels à tela.

Se esse mecanismo funcionar, objetos parcialmente visíveis devem deixar de congelar o processador. A melhoria tornaria o movimento de câmera e cenas gerais mais práticos. Ela também resolveria uma fraqueza claramente documentada da v2.0, em vez de adicionar recursos apenas por si mesmos.

Três sinais agora importam mais.

Primeiro, Vichit precisa publicar uma arquitetura v3.0 estável e uma implementação sintetizável. As descrições de recursos podem mudar enquanto a lógica está sendo otimizada. Um repositório público exporia o formato real das instruções, o pipeline e o uso de recursos.

Segundo, o projeto precisa de resultados de FPGA reproduzíveis usando cenas que pressionem o recorte e a execução de shaders em conjunto. Manter a taxa de quadros durante um efeito simples não é suficiente. Os testes deveriam posicionar geometria atravessando os limites da tela enquanto exercitam profundidade e memória externa.

Terceiro, a v3.0 eventualmente precisa de outro resultado em silício. O sucesso em FPGA validaria grande parte da lógica, mas a lição central da v2.0 é que a fabricação representa um limiar separado. Silício A0 funcional reforçaria as alegações da nova arquitetura.

Uma falha em qualquer estágio ainda produziria informações úteis. Exceder o orçamento de tile revelaria o custo em área da programabilidade. Problemas de temporização identificariam caminhos lentos. Erros visuais poderiam expor pressupostos de precisão ou ordenação de memória.

O roteiro, portanto, importa mesmo que a v3.0 perca uma janela planejada de lançamento em 2026. Os cronogramas de chips dependem da maturidade do projeto e de oportunidades compartilhadas de fabricação. Um atraso seria menos informativo do que a razão por trás dele.

Os leitores também devem evitar tratar a v3.0 como uma linha de produtos inevitável. Não há mercado consumidor anunciado, ecossistema de drivers ou pilha de software comercial. Atualmente, o projeto funciona como desenvolvimento de hardware aberto e experimentação pública.

Esse foco permite que Vichit faça escolhas que fornecedores comerciais de GPU não podem fazer. A compatibilidade com jogos existentes é desnecessária. O suporte a drivers pode continuar restrito. O projeto pode favorecer transparência e educação visual em vez de desempenho de uso geral.

Ao mesmo tempo, a programabilidade convidará comparações mais rigorosas. Quando um processador executa instruções de shader, os desenvolvedores perguntarão sobre limites de instruções, comportamento de ramificação, acesso a texturas, precisão e throughput. Cada resposta cria outra obrigação de verificação.

A conquista da v2.0 dá credibilidade a esse roteiro porque sua predecessora chegou ao silício e supostamente produziu gráficos. Isso não garante que a v3.0 caberá, funcionará ou será fabricada com sucesso. O progresso em hardware permanece cumulativo, mas implacável.

Para desenvolvedores que acompanham a cobertura do Tom Hardware, o melhor próximo passo é examinar o projeto aberto em vez de focar no superlativo. Compare a especificação do repositório com futuros benchmarks, cenas de teste e imagens do silício.

O valor duradouro do TinyGPU dependerá de outros conseguirem reproduzir, estudar e ampliar suas técnicas. Uma única demonstração bem-sucedida cria atenção. A verificação documentada transforma essa atenção em conhecimento de engenharia reutilizável.

Acompanhe se a v3.0 preserva uma relação clara entre cada recurso e seu custo em hardware. Se a flexibilidade dos shaders, o clipping e o processamento paralelo de pixels continuarem compreensíveis, o projeto manterá sua principal vantagem.

A menor GPU útil não é necessariamente a que tem menos transistores. É aquela cujas restrições revelam como o hardware gráfico realmente funciona. A TinyGPU v2.0 chegou a esse ponto em silício.

Agora, a v3.0 precisa mostrar se essa mesma clareza resiste a um pipeline mais programável. Esse teste, e não uma disputa com GPUs de desktop, determinará o próximo capítulo do projeto.

 
 

Comece grátis

Um assistente de IA local-first com gestão de conhecimento pessoal

Para oferecer uma experiência de IA melhor,

atualmente, o remio é compatível apenas com Windows 10+ (x64) e M-Chip Macs.

​Adicione uma barra de pesquisa ao seu cérebro

É só perguntar ao remio

Lembre-se de tudo

Não organize nada

bottom of page