From 7d6f3dbc16ec3085fe2be53bdbb2d3ee6b4176b1 Mon Sep 17 00:00:00 2001 From: MajorPainTheCactus Date: Sat, 14 Feb 2026 09:53:24 +0000 Subject: [PATCH] Revert mipmap generation on render targets from 66a7657 Reverts the render target mipmap generation feature introduced in 66a7657 (fix mipmaps on generated textures) across d3d10, d3d11, and d3d12 while preserving the non-square texture mipmap count fix (|| vs &&) and all HDR pipeline fixes from 7df941e. --- gfx/drivers/d3d10.c | 10 ++----- gfx/drivers/d3d11.c | 12 ++------ gfx/drivers/d3d12.c | 73 +++++++++++++++++++-------------------------- 3 files changed, 34 insertions(+), 61 deletions(-) diff --git a/gfx/drivers/d3d10.c b/gfx/drivers/d3d10.c index de1291bd0558..856cf0819ab9 100644 --- a/gfx/drivers/d3d10.c +++ b/gfx/drivers/d3d10.c @@ -406,8 +406,8 @@ static void d3d10_init_texture(D3D10Device device, d3d10_texture_t* texture) unsigned width, height; texture->desc.BindFlags |= D3D10_BIND_RENDER_TARGET; - width = texture->desc.Width; - height = texture->desc.Height; + width = texture->desc.Width >> 5; + height = texture->desc.Height >> 5; while ((width > 1) || (height > 1)) { @@ -2378,7 +2378,6 @@ static void d3d10_init_render_targets(d3d10_video_t* d3d10, d3d10->pass[i].rt.desc.BindFlags = D3D10_BIND_RENDER_TARGET; d3d10->pass[i].rt.desc.Format = glslang_format_to_dxgi( d3d10->pass[i].semantics.format); - d3d10->pass[i].rt.desc.MiscFlags = D3D10_RESOURCE_MISC_GENERATE_MIPS; d3d10_release_texture(&d3d10->pass[i].rt); d3d10_init_texture(d3d10->device, &d3d10->pass[i].rt); @@ -2721,11 +2720,6 @@ static bool d3d10_gfx_frame( #endif /* D3D10_ROLLING_SCANLINE_SIMULATION */ context->lpVtbl->Draw(context, 4, 0); - - /* Generate mipmaps for render target if needed */ - if (d3d10->pass[i].rt.desc.MiscFlags & D3D10_RESOURCE_MISC_GENERATE_MIPS) - context->lpVtbl->GenerateMips(context, d3d10->pass[i].rt.view); - texture = &d3d10->pass[i].rt; } else diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index d2e3f019ad4f..40982d102a78 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -579,9 +579,8 @@ static void d3d11_init_texture(D3D11Device device, d3d11_texture_t* texture) unsigned width, height; texture->desc.BindFlags |= D3D11_BIND_RENDER_TARGET; - width = texture->desc.Width; - height = texture->desc.Height; - texture->desc.MipLevels = 1; + width = texture->desc.Width >> 5; + height = texture->desc.Height >> 5; while ((width > 1) || (height > 1)) { @@ -3226,13 +3225,10 @@ static void d3d11_init_render_targets(d3d11_video_t* d3d11, unsigned width, unsi d3d11->pass[i].viewport.Width = width; d3d11->pass[i].viewport.Height = height; d3d11->pass[i].viewport.MaxDepth = 1.0; - d3d11->pass[i].rt.desc.Width = width; d3d11->pass[i].rt.desc.Height = height; d3d11->pass[i].rt.desc.BindFlags = D3D11_BIND_RENDER_TARGET; d3d11->pass[i].rt.desc.Format = glslang_format_to_dxgi(d3d11->pass[i].semantics.format); - d3d11->pass[i].rt.desc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS; - d3d11_release_texture(&d3d11->pass[i].rt); d3d11_init_texture(d3d11->device, &d3d11->pass[i].rt); @@ -3728,10 +3724,6 @@ static bool d3d11_gfx_frame( else context->lpVtbl->Draw(context, 4, 4); - /* Generate mipmaps for render target if needed */ - if (d3d11->pass[i].rt.desc.MiscFlags & D3D11_RESOURCE_MISC_GENERATE_MIPS) - context->lpVtbl->GenerateMips(context, d3d11->pass[i].rt.view); - texture = &d3d11->pass[i].rt; } } diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index d3c08aecedce..4ced2a18e5f8 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -726,11 +726,11 @@ static void d3d12_init_texture(D3D12Device device, d3d12_texture_t* texture) if (!texture->desc.MipLevels) texture->desc.MipLevels = 1; - /* Calculate mipmap count */ - if (texture->desc.Width > 1 || texture->desc.Height > 1) + if ( !(texture->desc.Width >> (texture->desc.MipLevels - 1)) + && !(texture->desc.Height >> (texture->desc.MipLevels - 1))) { - unsigned width = texture->desc.Width; - unsigned height = texture->desc.Height; + unsigned width = texture->desc.Width >> 5; + unsigned height = texture->desc.Height >> 5; texture->desc.MipLevels = 1; while ((width > 1) || (height > 1)) { @@ -846,11 +846,33 @@ static void d3d12_init_texture(D3D12Device device, d3d12_texture_t* texture) texture->size_data.w = 1.0f / texture->desc.Height; } -static void d3d12_generate_mipmaps( - D3D12GraphicsCommandList cmd, - d3d12_texture_t* texture, - void *userdata) +static void d3d12_upload_texture(D3D12GraphicsCommandList cmd, + d3d12_texture_t* texture, void *userdata) { + D3D12_TEXTURE_COPY_LOCATION src, dst; + + src.pResource = texture->upload_buffer; + src.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + src.PlacedFootprint = texture->layout; + + dst.pResource = texture->handle; + dst.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dst.SubresourceIndex = 0; + + D3D12_RESOURCE_TRANSITION( + cmd, + texture->handle, + D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, + D3D12_RESOURCE_STATE_COPY_DEST); + + cmd->lpVtbl->CopyTextureRegion(cmd, &dst, 0, 0, 0, &src, NULL); + + D3D12_RESOURCE_TRANSITION( + cmd, + texture->handle, + D3D12_RESOURCE_STATE_COPY_DEST, + D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + if (texture->desc.MipLevels > 1) { unsigned i; @@ -906,36 +928,6 @@ static void d3d12_generate_mipmaps( } } } -} - -static void d3d12_upload_texture(D3D12GraphicsCommandList cmd, - d3d12_texture_t* texture, void *userdata) -{ - D3D12_TEXTURE_COPY_LOCATION src, dst; - - src.pResource = texture->upload_buffer; - src.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; - src.PlacedFootprint = texture->layout; - - dst.pResource = texture->handle; - dst.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; - dst.SubresourceIndex = 0; - - D3D12_RESOURCE_TRANSITION( - cmd, - texture->handle, - D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, - D3D12_RESOURCE_STATE_COPY_DEST); - - cmd->lpVtbl->CopyTextureRegion(cmd, &dst, 0, 0, 0, &src, NULL); - - D3D12_RESOURCE_TRANSITION( - cmd, - texture->handle, - D3D12_RESOURCE_STATE_COPY_DEST, - D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); - - d3d12_generate_mipmaps(cmd, texture, userdata); texture->dirty = false; } @@ -3776,8 +3768,6 @@ static void d3d12_init_render_targets(d3d12_video_t* d3d12, unsigned width, unsi d3d12->pass[i].rt.desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; d3d12->pass[i].rt.srv_heap = &d3d12->desc.srv_heap; d3d12->pass[i].rt.desc.Format = glslang_format_to_dxgi(d3d12->pass[i].semantics.format); - /* Initialize MipLevels so mipmaps are created for render target */ - d3d12->pass[i].rt.desc.MipLevels = 0; d3d12_release_texture(&d3d12->pass[i].rt); d3d12_init_texture(d3d12->device, &d3d12->pass[i].rt); @@ -4424,9 +4414,6 @@ static bool d3d12_gfx_frame( D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); - /* Generate mipmaps for framebuffer if it has multiple mipmap levels */ - d3d12_generate_mipmaps(cmd, &d3d12->pass[i].rt, d3d12); - D3D12_RESOURCE_TRANSITION( cmd, d3d12->pass[i].rt.handle,