1

次のコードは非常に速くクラッシュします (2^27 テクセルの最大バッファー サイズの前に)

読みやすくするために、無駄なコード行をすべて取り除きました。

const int MAX_LAYER_DEPTH = 5;

#include "vapp.h"

#include "vmath.h"

#include <stdio.h>

BEGIN_APP_DECLARATION(OITDemo)
    // Override functions from base class
   virtual void Initialize(const char * title);
    virtual void Display(bool auto_redraw);
    virtual void Finalize(void);
    virtual void Reshape(int width, int height);

    GLuint  linked_list_buffer;
    GLuint  linked_list_texture;
    GLint current_width;
    GLint current_height;
END_APP_DECLARATION()

DEFINE_APP(OITDemo, "Order Independent Transparency")

void OITDemo::Initialize(const char * title)
{
    base::Initialize(title);
    glGenBuffers(1, &linked_list_buffer);
    glGenTextures(1, &linked_list_texture);
    Reshape(100,100);
    return;
}

void OITDemo::Display(bool auto_redraw)
{

    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glBindImageTexture(1, linked_list_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32UI);
    glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);

    base::Display();

    return;
}

void OITDemo::Reshape(int width, int height)
{
    current_width = width;
    current_height = height;

    glBindImageTexture(1, 0, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32UI);
    static GLuint texBufferSize = 2047;
    ++texBufferSize;
    printf("%d : texBufferSize\n",texBufferSize);
    glBindBuffer(GL_TEXTURE_BUFFER, linked_list_buffer);
    glBufferData(GL_TEXTURE_BUFFER, texBufferSize * texBufferSize * MAX_LAYER_DEPTH * sizeof(vmath::vec4), NULL, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_TEXTURE_BUFFER, 0);

    // Bind it to a texture (for use as a TBO)
    glBindTexture(GL_TEXTURE_BUFFER, linked_list_texture);
    glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32UI, linked_list_buffer);
    glBindTexture(GL_TEXTURE_BUFFER, 0);

    glViewport(0, 0, current_width, current_height);
    return;
}

void OITDemo::Finalize(void)
{
    glDeleteTextures(1, &linked_list_texture);
    glDeleteBuffers(1, &linked_list_buffer);
}

ドライバーはおそらく断片化を処理できません。21694445 (2083 x 2083 x 5) の要素と 23587920 の要素の再割り当ての間にクラッシュします。グラフィック カードから返される最大バッファ サイズ (テクセル数) は 2^27 (1 億 3400 万テクセル) です。

アプリケーションの開始時に 1 つの大きなバッファーを割り当て、それを決して変更しない方がうまくいくようです。しかし、アプリケーションの存続期間中に再割り当てしようとすると、惨めに失敗します。

元々、コードはイメージ テクスチャをバインドし、そのイメージ テクスチャを imageStore で使用するシェーダーを使用してトレースしますが、ドライバーをクラッシュさせるためにシェーダーは必要ないことがわかりました。

ドライバーのクラッシュを予測/防止する手がかりはありますか?

4

0 に答える 0