es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Formato de textura de metal bgra8Unorm_srgb no escribible en GPU de la Familia 2 de Metal.

Estoy pasando una textura con MTLPixelFormat.bgra8Unorm_srgb a un shader de cálculo, que tiene una textura2D< float, access::write > para esta textura. Estoy obteniendo el siguiente error:

  • validateComputeFunctionArguments:818: fallo en la aserción: la función de cálculo(rescaleTexture): se está enlazando un formato de textura no escribible MTLPixelFormat.BGRA8Unorm_sRGB en el índice 1 a un argumento de shader con acceso de escritura habilitado.

Tengo una “GPU de la familia Metal 2” (Intel Iris Plus Graphics 640, familia Metal: compatible, GPUFamily Metal macOS 2), y según la documentación de Apple, una textura con el formato de píxeles MTLPixelFormat.BGRA8Unorm_sRGB debería ser escribible.

¿Qué estoy haciendo mal?

Aquí está (parte del) código que uso para crear la(s) textura(s):

let desc = MTLTextureDescriptor.texture2DDescriptor(
pixelFormat: MTLPixelFormat.bgra8Unorm_srgb,
width: outputTextureWidth,
height: outputTextureHeight,
mipmapped: false)
desc.usage = [.shaderRead, .shaderWrite]
let tex = device.makeTexture(descriptor: desc)

Aquí está (parte del) código del shader:
“`
kernel void
rescaleTexture(texture2d<float, access::sample=""> source [[texture(0)]],
texture2d<float, access::write=""> target [[texture(1)]],
uint2 id [[thread_position_in_grid]])
{
if (id.x >= target.get_width() || id.y >= target.get_height()) {
return;
}

<pre><code>const float u = (float)id.x / (target.get_width() – 1);
const float v = (float)id.y / (target.get_height() – 1);

target.write(source.sample(sampler_linear_no_mipmap, float2(u, v)), id);
</code></pre>

}
“`</float,></float,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que estás intentando enlazar una textura no escribible (MTLPixelFormat.BGRA8Unorm_sRGB) a un argumento de sombreador con acceso de escritura habilitado. Esto sugiere que el problema podría estar en la forma en que estás enlazando la textura al sombreador en tu código.

    Sin embargo, según los fragmentos de código que proporcionaste, parece que estás creando la textura con las banderas de uso .shaderRead y .shaderWrite, lo que debería permitir escribir en la textura desde el sombreador de cómputo.

    Una posible explicación para el error es que la textura se esté utilizando en un contexto o canalización diferente al que se creó, lo que genera conflictos con los derechos de acceso.

    Para diagnosticar aún más el problema, puedes intentar establecer puntos de interrupción o rastrear el código para ver qué llamada específica está causando el problema. También puedes intentar crear un sombreador de cómputo más simple que solo escriba en la textura para ver si funciona correctamente, y luego agregar gradualmente complejidad para ver si el problema vuelve a surgir.

    Además, es posible que desees verificar si tu GPU admite el formato MTLPixelFormat.BGRA8Unorm_sRGB con acceso de escritura. Si bien la documentación sugiere que debería ser compatible, podría haber limitaciones específicas de hardware o errores de controladores que causen problemas con ciertas combinaciones de formatos y modos de acceso.

Comments are closed.