From 383bae65e22d7e1c6a84f2877a2a615fd1546ff0 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 3 Nov 2022 15:42:29 +0600 Subject: [PATCH 1/5] qt: force update to happen after hardware renderer is created --- src/qt/qt_hardwarerenderer.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/qt_hardwarerenderer.hpp b/src/qt/qt_hardwarerenderer.hpp index 6bf0d3276..30515a2e8 100644 --- a/src/qt/qt_hardwarerenderer.hpp +++ b/src/qt/qt_hardwarerenderer.hpp @@ -75,6 +75,7 @@ public: m_context = new QOpenGLContext(); m_context->setFormat(format()); m_context->create(); + update(); } ~HardwareRenderer() { From 7928093c2b3468e4facc9f75c02a848e6eaa4886 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 3 Nov 2022 21:05:47 +0600 Subject: [PATCH 2/5] qt: display at initialization time (update() call doesn't work there) --- src/qt/qt_hardwarerenderer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qt/qt_hardwarerenderer.cpp b/src/qt/qt_hardwarerenderer.cpp index 006eb1d77..dd0eed632 100644 --- a/src/qt/qt_hardwarerenderer.cpp +++ b/src/qt/qt_hardwarerenderer.cpp @@ -140,7 +140,8 @@ void HardwareRenderer::initializeGL() pclog("OpenGL shader language version: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); glClearColor(0, 0, 0, 1); m_texture->setWrapMode(QOpenGLTexture::ClampToEdge); - update(); + glClear(GL_COLOR_BUFFER_BIT); + m_context->swapBuffers(this); } void HardwareRenderer::paintGL() { From 2dc2d912b2ebd2ac1672792d336b245bc191b34b Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 3 Nov 2022 21:58:54 +0600 Subject: [PATCH 3/5] qt: disable Vulkan early if not available --- src/qt/qt_mainwindow.cpp | 25 ++++++++++++++++++++++--- src/qt/qt_vulkanwindowrenderer.cpp | 12 +----------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 0f3c152f5..9e81531ab 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -75,6 +75,10 @@ extern "C" { #include #include #include +#if QT_CONFIG(vulkan) +#include +#include +#endif #include #include @@ -325,10 +329,25 @@ MainWindow::MainWindow(QWidget *parent) : ui->actionVNC->setVisible(false); #endif -#if !QT_CONFIG(vulkan) - if (vid_api == 4) vid_api = 0; - ui->actionVulkan->setVisible(false); +#if QT_CONFIG(vulkan) + bool vulkanAvailable = false; + { + QVulkanInstance instance; + instance.setApiVersion(QVersionNumber(1, 0)); + if (instance.create()) { + uint32_t physicalDevices = 0; + instance.functions()->vkEnumeratePhysicalDevices(instance.vkInstance(), &physicalDevices, nullptr); + if (physicalDevices != 0) { + vulkanAvailable = true; + } + } + } + if (!vulkanAvailable) #endif + { + if (vid_api == 4) vid_api = 0; + ui->actionVulkan->setVisible(false); + } QActionGroup* actGroup = nullptr; diff --git a/src/qt/qt_vulkanwindowrenderer.cpp b/src/qt/qt_vulkanwindowrenderer.cpp index 629665d62..ba32d6e9b 100644 --- a/src/qt/qt_vulkanwindowrenderer.cpp +++ b/src/qt/qt_vulkanwindowrenderer.cpp @@ -795,18 +795,8 @@ VulkanWindowRenderer::VulkanWindowRenderer(QWidget* parent) : QVulkanWindow(parent->windowHandle()) { parentWidget = parent; - instance.setLayers(QByteArrayList() << "VK_LAYER_KHRONOS_validation"); - instance.setExtensions(QByteArrayList() << "VK_EXT_debug_report"); instance.setApiVersion(QVersionNumber(1, 0)); - if (!instance.create()) { - throw std::runtime_error("Could not create Vulkan instance"); - } - uint32_t physicalDevices = 0; - instance.functions()->vkEnumeratePhysicalDevices(instance.vkInstance(), &physicalDevices, nullptr); - if (physicalDevices == 0) { - throw std::runtime_error("No physical devices available."); - } - qDebug() << instance.layers(); + instance.create(); setVulkanInstance(&instance); setPhysicalDeviceIndex(0); setPreferredColorFormats({VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_A8B8G8R8_UNORM_PACK32}); From c5f7cf5fa2fa23ac1df15bc9e1fd9890bb005266 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 4 Nov 2022 01:48:49 +0600 Subject: [PATCH 4/5] Improve Banshee error reporting Stubbed Banshee AGP registers --- src/video/vid_voodoo_banshee.c | 76 ++++++++++++++++++++++++++++------ 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index faf35c945..1a0b77085 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -98,6 +98,12 @@ typedef struct banshee_t { uint32_t vidScreenSize; uint32_t vidSerialParallelPort; + uint32_t agpReqSize; + uint32_t agpHostAddressHigh; + uint32_t agpHostAddressLow; + uint32_t agpGraphicsAddress; + uint32_t agpGraphicsStride; + int overlay_pix_fmt; uint32_t hwCurPatAddr, hwCurLoc, hwCurC0, hwCurC1; @@ -161,19 +167,25 @@ enum { Video_vidOverlayDvdy = 0xac, Video_vidOverlayDvdyOffset = 0xe0, Video_vidDesktopStartAddr = 0xe4, - Video_vidDesktopOverlayStride = 0xe8 + Video_vidDesktopOverlayStride = 0xe8, }; enum { - cmdBaseAddr0 = 0x20, - cmdBaseSize0 = 0x24, - cmdBump0 = 0x28, - cmdRdPtrL0 = 0x2c, - cmdRdPtrH0 = 0x30, - cmdAMin0 = 0x34, - cmdAMax0 = 0x3c, - cmdFifoDepth0 = 0x44, - cmdHoleCnt0 = 0x48 + cmdBaseAddr0 = 0x20, + cmdBaseSize0 = 0x24, + cmdBump0 = 0x28, + cmdRdPtrL0 = 0x2c, + cmdRdPtrH0 = 0x30, + cmdAMin0 = 0x34, + cmdAMax0 = 0x3c, + cmdFifoDepth0 = 0x44, + cmdHoleCnt0 = 0x48, + + Agp_agpReqSize = 0x00, + Agp_agpHostAddressLow = 0x04, + Agp_agpHostAddressHigh = 0x08, + Agp_agpGraphicsAddress = 0x0C, + Agp_agpGraphicsStride = 0x10, }; #define VGAINIT0_EXTENDED_SHIFT_OUT (1 << 12) @@ -1123,6 +1135,26 @@ banshee_cmd_read(banshee_t *banshee, uint32_t addr) uint32_t ret = 0xffffffff; switch (addr & 0x1fc) { + case Agp_agpHostAddressLow: + ret = banshee->agpHostAddressLow; + break; + + case Agp_agpHostAddressHigh: + ret = banshee->agpHostAddressHigh; + break; + + case Agp_agpGraphicsAddress: + ret = banshee->agpGraphicsAddress; + break; + + case Agp_agpGraphicsStride: + ret = banshee->agpGraphicsStride; + break; + + case Agp_agpReqSize: + ret = banshee->agpReqSize; + break; + case cmdBaseAddr0: ret = voodoo->cmdfifo_base >> 12; // banshee_log("Read cmdfifo_base %08x\n", ret); @@ -1142,7 +1174,7 @@ banshee_cmd_read(banshee_t *banshee, uint32_t addr) break; default: - fatal("Unknown banshee_cmd_read %08x\n", addr); + fatal("Unknown banshee_cmd_read 0x%08x (reg 0x%03x)\n", addr, addr & 0x1fc); } return ret; @@ -1348,6 +1380,26 @@ banshee_cmd_write(banshee_t *banshee, uint32_t addr, uint32_t val) voodoo_t *voodoo = banshee->voodoo; // banshee_log("banshee_cmd_write: addr=%03x val=%08x\n", addr & 0x1fc, val); switch (addr & 0x1fc) { + case Agp_agpHostAddressLow: + banshee->agpHostAddressLow = val; + break; + + case Agp_agpHostAddressHigh: + banshee->agpHostAddressHigh = val; + break; + + case Agp_agpGraphicsAddress: + banshee->agpGraphicsAddress = val; + break; + + case Agp_agpGraphicsStride: + banshee->agpGraphicsStride = val; + break; + + case Agp_agpReqSize: + banshee->agpReqSize = val; + break; + case cmdBaseAddr0: voodoo->cmdfifo_base = (val & 0xfff) << 12; voodoo->cmdfifo_end = voodoo->cmdfifo_base + (((voodoo->cmdfifo_size & 0xff) + 1) << 12); @@ -1382,7 +1434,7 @@ banshee_cmd_write(banshee_t *banshee, uint32_t addr, uint32_t val) break; default: - banshee_log("Unknown banshee_cmd_write: addr=%08x val=%08x\n", addr, val); + banshee_log("Unknown banshee_cmd_write: addr=%08x val=%08x reg=0x%03x\n", addr, val, addr & 0x1fc); break; } From 89ae64e53afe37d7659dd151865b8732f4d3a226 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 3 Nov 2022 17:46:13 -0400 Subject: [PATCH 5/5] Revert "Rework Voodoo texture precalc to support non-split trilinear textures" for voodoo1/2 Fixes #1137 --- src/include/86box/vid_voodoo_texture.h | 3 +- src/video/vid_voodoo_reg.c | 6 ++ src/video/vid_voodoo_texture.c | 89 +++++++++++++++++++++++++- 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/src/include/86box/vid_voodoo_texture.h b/src/include/86box/vid_voodoo_texture.h index d5ab603ab..2e0af97a3 100644 --- a/src/include/86box/vid_voodoo_texture.h +++ b/src/include/86box/vid_voodoo_texture.h @@ -33,7 +33,8 @@ static const uint32_t texture_offset[LOD_MAX + 3] = { 256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2 + 1 * 1 + 1 }; -void voodoo_recalc_tex(voodoo_t *voodoo, int tmu); +void voodoo_recalc_tex12(voodoo_t *voodoo, int tmu); +void voodoo_recalc_tex3(voodoo_t *voodoo, int tmu); void voodoo_use_texture(voodoo_t *voodoo, voodoo_params_t *params, int tmu); void voodoo_tex_writel(uint32_t addr, uint32_t val, void *p); void flush_texture_cache(voodoo_t *voodoo, uint32_t dirty_addr, int tmu); diff --git a/src/video/vid_voodoo_reg.c b/src/video/vid_voodoo_reg.c index 9eb2dc3f8..1b8e13022 100644 --- a/src/video/vid_voodoo_reg.c +++ b/src/video/vid_voodoo_reg.c @@ -73,6 +73,7 @@ void voodoo_reg_writel(uint32_t addr, uint32_t val, void *p) { voodoo_t *voodoo = (voodoo_t *) p; + void (*voodoo_recalc_tex)(voodoo_t *voodoo, int tmu) = NULL; union { uint32_t i; float f; @@ -82,6 +83,11 @@ voodoo_reg_writel(uint32_t addr, uint32_t val, void *p) if (!chip) chip = 0xf; + if (voodoo->type == VOODOO_3) + voodoo_recalc_tex = voodoo_recalc_tex3; + else + voodoo_recalc_tex = voodoo_recalc_tex12; + tempif.i = val; // voodoo_reg_log("voodoo_reg_write_l: addr=%08x val=%08x(%f) chip=%x\n", addr, val, tempif.f, chip); addr &= 0x3fc; diff --git a/src/video/vid_voodoo_texture.c b/src/video/vid_voodoo_texture.c index 12ec56d0b..9d1149c65 100644 --- a/src/video/vid_voodoo_texture.c +++ b/src/video/vid_voodoo_texture.c @@ -59,7 +59,94 @@ voodoo_texture_log(const char *fmt, ...) #endif void -voodoo_recalc_tex(voodoo_t *voodoo, int tmu) +voodoo_recalc_tex12(voodoo_t *voodoo, int tmu) +{ + int aspect = (voodoo->params.tLOD[tmu] >> 21) & 3; + int width = 256, height = 256; + int shift = 8; + int lod; + uint32_t base = voodoo->params.texBaseAddr[tmu]; + uint32_t offset = 0; + int tex_lod = 0; + + if (voodoo->params.tLOD[tmu] & LOD_S_IS_WIDER) + height >>= aspect; + else { + width >>= aspect; + shift -= aspect; + } + + if ((voodoo->params.tLOD[tmu] & LOD_SPLIT) && (voodoo->params.tLOD[tmu] & LOD_ODD)) { + width >>= 1; + height >>= 1; + shift--; + tex_lod++; + if (voodoo->params.tLOD[tmu] & LOD_TMULTIBASEADDR) + base = voodoo->params.texBaseAddr1[tmu]; + } + + for (lod = 0; lod <= LOD_MAX + 1; lod++) { + if (!width) + width = 1; + if (!height) + height = 1; + if (shift < 0) + shift = 0; + voodoo->params.tex_base[tmu][lod] = base + offset; + if (voodoo->params.tformat[tmu] & 8) + voodoo->params.tex_end[tmu][lod] = base + offset + (width * height * 2); + else + voodoo->params.tex_end[tmu][lod] = base + offset + (width * height); + voodoo->params.tex_w_mask[tmu][lod] = width - 1; + voodoo->params.tex_w_nmask[tmu][lod] = ~(width - 1); + voodoo->params.tex_h_mask[tmu][lod] = height - 1; + voodoo->params.tex_shift[tmu][lod] = shift; + voodoo->params.tex_lod[tmu][lod] = tex_lod; + + if (!(voodoo->params.tLOD[tmu] & LOD_SPLIT) || ((lod & 1) && (voodoo->params.tLOD[tmu] & LOD_ODD)) || (!(lod & 1) && !(voodoo->params.tLOD[tmu] & LOD_ODD))) { + if (!(voodoo->params.tLOD[tmu] & LOD_ODD) || lod != 0) { + if (voodoo->params.tformat[tmu] & 8) + offset += width * height * 2; + else + offset += width * height; + + if (voodoo->params.tLOD[tmu] & LOD_SPLIT) { + width >>= 2; + height >>= 2; + shift -= 2; + tex_lod += 2; + } else { + width >>= 1; + height >>= 1; + shift--; + tex_lod++; + } + + if (voodoo->params.tLOD[tmu] & LOD_TMULTIBASEADDR) { + switch (tex_lod) { + case 0: + base = voodoo->params.texBaseAddr[tmu]; + break; + case 1: + base = voodoo->params.texBaseAddr1[tmu]; + break; + case 2: + base = voodoo->params.texBaseAddr2[tmu]; + break; + default: + base = voodoo->params.texBaseAddr38[tmu]; + break; + } + } + } + } + } + + voodoo->params.tex_width[tmu] = width; +} + +void +voodoo_recalc_tex3(voodoo_t *voodoo, int tmu) { int aspect = (voodoo->params.tLOD[tmu] >> 21) & 3; int width = 256, height = 256;