Skip to content

Missing Release() in the error path of Surface.GetCurrentTexture() #31

Description

@Tnze

I've encountered a problem when resizing the window that the WGPU Validator complains the Texture didn't release properly.
But it turns out the Texture hadn't given to me in this case. I think the wrapper library takes responsibility to release the texture.

2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=1125 height=612
2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=1012 height=601
2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=816 height=568
2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=705 height=542
2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=451 height=468
2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=316 height=420
2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=120 height=341
2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=120 height=293
2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=120 height=188
2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=120 height=140
2026/09/22 21:20:37 ERROR Failed to get current texture of surface surface=1327791530976 err="wgpu: Surface.GetCurrentTexture: failed to get surface texture"

thread '<unnamed>' (13936) panicked at src\lib.rs:605:5:
Error in wgpuSurfaceGetCurrentTexture: Validation Error

Caused by:
  Surface image is already acquired

note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Exception 0xe06d7363 0x19930520 0x44bdff5a8 0x7ffe60ba41ca
PC=0x7ffe60ba41ca

runtime.cgocall(0x7ff7a8c217c0, 0x155f8f980358)
        C:/Program Files/Go/src/runtime/cgocall.go:167 +0x3e fp=0x155f8f89d830 sp=0x155f8f89d7d0 pc=0x7ff7a8c8ef7e
syscall.syscalln(0x7ff7a8f5e4a0?, 0x7ff7a8d9ac3d?, {0x155f8fd9a750?2026/09/22 21:20:37 INFO Window resize hwnd=461548 width=120 height=68
, 0x8?, 0x7ff7a8d7503b?})
        C:/Program Files/Go/src/runtime/syscall_windows.go:427 +0x48 fp=0x155f8f89d850 sp=0x155f8f89d830 pc=0x7ff7a8c948e8
syscall.SyscallN(0x135268ae3e0?, {0x155f8fd9a750?, 0x0?, 0x7ff7a8d8d073?})
        C:/Program Files/Go/src/syscall/dll_windows.go:99 +0x1e fp=0x155f8f89d888 sp=0x155f8f89d850 pc=0x7ff7a8ca603e
syscall.(*Proc).Call(0x7ff7a8c2f213?, {0x155f8fd9a750?, 0x7ff7a8f1b500?, 0x7ff7a8daaee0?})
        C:/Program Files/Go/src/syscall/dll_windows.go:256 +0x1c fp=0x155f8f89d8c8 sp=0x155f8f89d888 pc=0x7ff7a8ca657c
syscall.(*LazyProc).Call(0x155f8f892e40, {0x155f8fd9a750, 0x2, 0x2})
        C:/Program Files/Go/src/syscall/dll_windows.go:376 +0x4a fp=0x155f8f89d8f8 sp=0x155f8f89d8c8 pc=0x7ff7a8ca68ea
github.com/go-webgpu/webgpu/wgpu.(*windowsProc).Call(0x02026/09/22 21:20:37 INFO Window resize hwnd=461548 width=120 height=44
?, {0x155f8fd9a750?, 0x0?, 0x2?})
        C:/Users/Tnze/go/pkg/mod/github.com/go-webgpu/webgpu@v0.5.5/wgpu/loader_windows.go:43 +0x1b fp=0x155f8f89d928 sp=0x155f8f89d8f8 pc=0x7ff7a8d6593b
github.com/go-webgpu/webgpu/wgpu.(*Surface).GetCurrentTexture(0x155f8f874458)

webgpu/wgpu/surface.go

Lines 157 to 201 in 907b82e

// GetCurrentTexture gets the current texture to render to.
// Returns the texture, a suboptimal flag (true if the surface needs reconfiguration
// but is still usable this frame), and any error. This matches the gogpu/wgpu API.
func (s *Surface) GetCurrentTexture() (*SurfaceTexture, bool, error) {
if err := checkInit(); err != nil {
return nil, false, err
}
if s == nil || s.handle == 0 {
return nil, false, &WGPUError{Op: "Surface.GetCurrentTexture", Message: "surface is nil or released"}
}
var surfTex surfaceTexture
procSurfaceGetCurrentTexture.Call( //nolint:errcheck
s.handle,
uintptr(unsafe.Pointer(&surfTex)),
)
result := &SurfaceTexture{
Texture: &Texture{handle: surfTex.texture},
Status: surfTex.status,
}
switch surfTex.status {
case SurfaceGetCurrentTextureStatusSuccessOptimal:
return result, false, nil
case SurfaceGetCurrentTextureStatusSuccessSuboptimal:
// Surface still usable but caller should reconfigure soon.
return result, true, nil
case SurfaceGetCurrentTextureStatusOutdated:
return result, false, ErrSurfaceNeedsReconfigure
case SurfaceGetCurrentTextureStatusLost:
return nil, false, ErrSurfaceLost
case SurfaceGetCurrentTextureStatusTimeout:
return nil, false, ErrSurfaceTimeout
case NativeSurfaceGetCurrentTextureStatusOccluded:
// wgpu-native v29: window is occluded/minimized (Metal backend only).
// No texture is returned; caller should skip this frame and try again.
return nil, false, ErrSurfaceOccluded
default:
// v29: SurfaceGetCurrentTextureStatusError (0x06) covers all error cases
// including former OutOfMemory (0x06) and DeviceLost (0x07).
return nil, false, &WGPUError{Op: "Surface.GetCurrentTexture", Message: "failed to get surface texture"}
}
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions