
221220000 张三 Linux zzy 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux 23:05:37 up 3 days, 18:11, 1 user, load average: 0.42, 0.54, 0.51
51 lines
1.3 KiB
C
51 lines
1.3 KiB
C
#include <am.h>
|
|
#include <nemu.h>
|
|
|
|
#define SYNC_ADDR (VGACTL_ADDR + 4)
|
|
#define GET_W(var) uint16_t var = inw(VGACTL_ADDR + 2)
|
|
#define GET_H(var) uint16_t var = inw(VGACTL_ADDR)
|
|
|
|
void __am_gpu_init() {
|
|
// int i;
|
|
// GET_W(w);
|
|
// GET_H(h);
|
|
// // int w = inw(VGACTL_ADDR + 2); // TODO: get the correct width
|
|
// // int h = inw(VGACTL_ADDR); // TODO: get the correct height
|
|
// uint32_t *fb = (uint32_t *)(uintptr_t)FB_ADDR;
|
|
// for (i = 0; i < w * h; i ++) fb[i] = i;
|
|
// outl(SYNC_ADDR, 1);
|
|
}
|
|
|
|
void __am_gpu_config(AM_GPU_CONFIG_T *cfg) {
|
|
// uint32_t vgactl = inl(VGACTL_ADDR);
|
|
GET_W(w);
|
|
// PNT_BITS(w, 16, 'W');
|
|
GET_H(h);
|
|
// PNT_BITS(h, 16, 'H');
|
|
*cfg = (AM_GPU_CONFIG_T) {
|
|
.present = true, .has_accel = false,
|
|
.width = w, .height = h,
|
|
.vmemsz = w*h*32
|
|
};
|
|
}
|
|
|
|
void __am_gpu_fbdraw(AM_GPU_FBDRAW_T *ctl) {
|
|
GET_W(w);
|
|
uint32_t* fb_addr = (uint32_t*)FB_ADDR;
|
|
for (int i = 0; i < ctl->h; i++) {
|
|
for (int j = 0; j < ctl->w; j++) {
|
|
outl((uintptr_t)(fb_addr +
|
|
(w * (ctl->y + i) + ctl->x + j)),
|
|
((uint32_t*)ctl->pixels)[ctl->w * i + j]);
|
|
}
|
|
}
|
|
if (ctl->sync) {
|
|
while (inl(SYNC_ADDR) != 0) ;
|
|
outl(SYNC_ADDR, 1);
|
|
}
|
|
}
|
|
|
|
void __am_gpu_status(AM_GPU_STATUS_T *status) {
|
|
status->ready = inl(SYNC_ADDR) == 0 ? true : false;
|
|
}
|