2 điểm bởi GN⁺ 2024-09-03 | 1 bình luận | Chia sẻ qua WhatsApp

Mô phỏng PlayStation 2 GS – ranh giới cuối cùng của mô phỏng compute Vulkan

  • Năm 2020, tác giả đã viết paraLLEl-RDP để triển khai N64 RDP bằng Vulkan compute. Nó rất nhanh, rất chính xác và còn được bổ sung hỗ trợ nâng độ phân giải.
  • Từ đó nảy ra ý tưởng về một dự án tương tự cho PlayStation 2. Cho đến nay, GSdx đã là tiêu chuẩn trong suốt 20 năm.
  • paraLLEl-GS không phải là triển khai compute đầu tiên của PS2 GS. Đã từng có một nỗ lực bằng OpenCL vào năm 2014 nhưng chưa hoàn thành.

Tổng quan cơ bản về GS

GS là quái vật xử lý pixel

  • GS nổi tiếng với fillrate và băng thông cực lớn. Vào năm 2000, nó có thể xử lý hơn 1 tỷ pixel mỗi giây.
  • VRAM tuy nhỏ nhưng được thiết kế để liên tục stream bằng nhiều engine DMA khác nhau.

Pipeline pixel của GS cơ bản nhưng kỳ lạ

  • GS đơn giản hơn N64 RDP. Nó có một texture duy nhất và bộ combiner một chu kỳ duy nhất.
  • Blending có thể vượt quá 1.0. 0x80 được xử lý là 1.0 và có thể lên đến tối đa 0xff.
  • Có nhiều tính năng khác lạ như kiểm tra alpha đích, blending có điều kiện, hiệu chỉnh alpha, v.v.

Quy tắc raster kiểu D3D9

  • Primitive được cung cấp dưới dạng đơn giản trong clip space. Khối VU1 đảm nhiệm biến đổi và clipping.
  • X/Y: fixed-point 12.4, Z: uint 24-bit hoặc 32-bit, FOG: uint 8-bit, RGBA: 8-bit, STQ: texture mapping phối cảnh với tọa độ chuẩn hóa.

Hàng đợi vertex

  • GS mang lại cảm giác tương tự OpenGL 1.0. Nó hỗ trợ TRIANGLE_FAN.
  • Ghi vào thanh ghi XYZ sẽ cố định trạng thái vertex và đẩy hàng đợi tiến lên.

Các định dạng swizzle thú vị

  • Khi render bằng màu hoặc độ sâu 24-bit, 8 bit trên cùng có thể được dùng làm texture.
  • Tọa độ pixel được sắp xếp theo các "page". Mỗi page là 8 KiB và được chia nhỏ thành 32 block.

Cache framebuffer và cache texture

  • Có cache chuyên dụng cho render framebuffer và cho texture. Game thường thực hiện các vòng lặp phản hồi.

Texturing

  • Texturing vừa quen thuộc vừa đầy tính bí truyền. Tâm texel nằm ở nửa pixel.
  • Có các chế độ địa chỉ hóa đặc biệt như REGION_CLAMP và REGION_REPEAT.

CLUT

  • Có một cache 1 KiB lưu bảng màu hiện tại. Cần một bước sao chép tường minh từ VRAM sang cache CLUT.

TEXFLUSH

  • Có lệnh để đồng bộ và vô hiệu hóa cache texture. Tác giả chọn bỏ qua TEXFLUSH và dùng chiến lược cache tối thiểu.

Điều khiển thanh ghi bằng GIF

  • Phần cứng GS được tương tác thông qua GIF. Header của gói GIF thiết lập thanh ghi đích để ghi và số vòng lặp.

Trongle – GS

  • Một API dành cho những ai nhớ sự đơn giản của OpenGL 1.0.
  • Tác giả đã thêm công cụ tạo định dạng dump .gs cho mục đích kiểm thử.

Chi tiết triển khai

Pipeline render

  • Đồng bộ dữ liệu từ CPU sang VRAM, tải dữ liệu lên VRAM, cập nhật cache CLUT, unswizzle từ VRAM sang VkImages, render, rồi đồng bộ VRAM từ GPU về CPU.

Page tracker

  • VRAM được chia và theo dõi theo từng page. Trạng thái page được theo dõi để xử lý các hazard tiềm ẩn.

Cache texture

  • Mỗi page có một danh sách các VkImage liên quan. Khi texture của page bị vô hiệu hóa, image sẽ bị hủy và được unswizzle lại từ VRAM.

Cập nhật CLUT

  • Để batch việc tải texture, việc tải CLUT cũng được batch. Tác giả dùng 1024 snapshot CLUT.

Unswizzle texture từ VRAM

  • Vulkan được dùng để cấp phát VkImage mới và xử lý bằng compute shader.

Thiết lập tam giác và binning

  • Tương tự paraLLEl-RDP, đây là một tile-based renderer. Nó cung cấp mảng thuộc tính để thiết lập tam giác.

Tóm tắt của GN⁺

  • Bài viết này nói về mô phỏng GS của PlayStation 2, đặc biệt tập trung vào cách triển khai bằng compute shader Vulkan.
  • PS2 GS rất khó mô phỏng do pipeline pixel phức tạp và nhiều tính năng kỳ lạ.
  • Dự án này giải thích nhiều đặc tính khác nhau của GS và các cách tiếp cận kỹ thuật để mô phỏng chúng.
  • Nội dung này hữu ích cho những ai quan tâm đến mô phỏng PS2, đặc biệt là các góc nhìn về mô phỏng hiệu năng cao bằng Vulkan.

1 bình luận

 
GN⁺ 2024-09-03
Ý kiến trên Hacker News
  • Tò mò không biết chữ viết tắt "GS" có nghĩa là gì
  • Đã từng cầu mong có programmable blending
    • Từ đầu những năm 2000, khi lần đầu học pixel shader, cũng đã cầu mong có programmable texture decoding
    • GPU lại đưa ray tracing vào trước
    • Programmable blending là việc thay thế các khối fixed-function
    • Vẫn đang chờ texture shader
  • Bus của GS rất rộng, tới 2560-bit
    • PS3 có cảm giác thua GS về mặt blending
  • Mong ai đó viết lại dynarmic và viết một bài blog về nó
  • Tò mò cách tiếp cận này so với ubershader của Dolphin như thế nào
  • Tò mò "top-left raster" có nghĩa là gì