D3D11DeviceContext更新子资源上的模糊内核异常

时间:2013-09-27 14:51:52

标签: c++ direct3d directx-11

我正在开发一个使用D3D11显示10位视频流的类。我采用的解决方案是将每个帧渲染为四边形的纹理。因此,我有一个从YUV表面更新帧/纹理的功能:

void tenBitDisplay::SetTextureData(short int *yuvData) {

    unsigned int size = m_width * m_height, chromaSize;

    short int y1, y2, y3, y4, u, v, r, g, b;
    DWORD *data;

    chromaSize = size * 0.25;

    data = new DWORD[size];

    for(unsigned int k = 0, j = 0; k < size; k += 2, j++) {
        y1 = yuvData[k];
        y2 = yuvData[k + 1];
        y3 = yuvData[k + m_width];
        y4 = yuvData[k + m_width + 1];
        u = yuvData[size + j];
        v = yuvData[size + chromaSize + j];
        convertYUV(y1, u, v, &r, &g, &b);
        packRGB(data, r, g, b, k);

        convertYUV(y2, u, v, &r, &g, &b);
        packRGB(data, r, g, b, k + 1);

        convertYUV(y3, u, v, &r, &g, &b);
        packRGB(data, r, g, b, k + m_width);

        convertYUV(y4, u, v, &r, &g, &b);
        packRGB(data, r, g, b, k + m_width + 1);

        if (k!=0 && (k+2) % m_width == 0)
            k += m_width;
    }

    if (m_pTexture2D != NULL) {
        m_pImmediateContext->UpdateSubresource(m_pTexture2D, 0, NULL, data, m_width * 4, 0);
    }

    free(data);
}

一切正常,直到达到m_pImmediateContext->UpdateSubresource(m_pTexture2D, 0, NULL, data, m_width * 4, 0);来电。在执行此方法期间的某个时刻,抛出以下异常:

First-chance exception at 0x751EC41F (KernelBase.dll) in app.exe: 0x0000087D (parameters: 0x00000000, 0x0273D328, 0x0273C760).

If there is a handler for this exception, the program may be safely continued.

我猜这是堆,堆栈或其他与内存有关的问题。我只是无法弄清楚究竟是什么,我从来没有遇到过这样的问题,也没有太多关于从哪里开始调试它的知识。我检查了前面的循环,以确保缓冲区没有溢出,一切都很好。

编辑:我忘了提到我在将其移入视频解码应用程序之前,在不同的应用程序(直接加载YUV文件)中运行的代码基本相同。

1 个答案:

答案 0 :(得分:1)

我发现了问题。我在一个线程中更新纹理,而另一个线程正在调用render方法。这导致线程在纹理对象上发生冲突。我实现了一个互斥锁,现在似乎工作正常。