簡體   English   中英

為什么遵循GLES代碼在Windows CE 6.0上生成DataAbort?

[英]Why following GLES code generates DataAbort on Windows CE 6.0?

我正在使用Qt 4.8和Open GL ES 1.0開發Windows CE OpenGL應用程序。 問題在於以下代碼會導致不可預測的DataAbort異常(不可預測,因為它可能在啟動后幾秒鍾或幾小時內發生)。 可能是驅動程序問題,還是我做錯了什么? PS測試了沒有Qt的此代碼-相同的行為。

// GLWidget.hpp

#pragma pack(push, 1)
struct drPoint {

    GLfloat x;
    GLfloat y;
    GLfloat R;
    GLfloat G;
    GLfloat B;
    GLfloat A;

};
#pragma pack(pop)

class GLWidget : public QGLWidget {

    Q_OBJECT

public:
    GLWidget(QWidget *parent = 0);
    ~GLWidget();


private:

    drPoint*    arr;
    unsigned int ui32Vbo;

    void initializeGL();
    void paintGL();
    void resizeGL(int width, int height);

};

// GLWidget.cpp

GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) {}

void GLWidget::initializeGL() {

        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glPointSize(1.0);

        arr = new drPoint[this->height()];

        for (int i = 0; i < this->height(); ++i) {

            arr[i].x    = 0;
            arr[i].y    = i;
            arr[i].R    = 1.0f;
            arr[i].G    = 0.0f;
            arr[i].B    = 0.0f;
            arr[i].A    = 1.0f;

        }

        glEnable(GL_VERTEX_ARRAY);
        glEnable(GL_COLOR_ARRAY);

        glGenBuffers(1, &ui32Vbo);
        glBindBuffer(GL_ARRAY_BUFFER, ui32Vbo);
        glBufferData(GL_ARRAY_BUFFER, sizeof(drPoint) * this->height(), arr, GL_DYNAMIC_DRAW);
        glVertexPointer(2, GL_FLOAT, sizeof(GLfloat) * 6, (void*)0);
        glColorPointer(4, GL_FLOAT, sizeof(GLfloat) * 6, (void*)(sizeof(GLfloat) * 2));
        glBindBuffer(GL_ARRAY_BUFFER, 0);

    }

void GLWidget::paintGL() {

    // Some buffer filling code

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    glBindBuffer(GL_ARRAY_BUFFER, ui32Vbo);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(drPoint) * this->height(), arr);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glDrawArrays(GL_POINTS, 0, this->height());

    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

}

void GLWidget::resizeGL(int width, int height)
{

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    float halfWidth  = width * 0.5f;
    float halfHeight = height * 0.5f;

    glOrthof(-halfWidth, halfWidth, -halfHeight, halfHeight, 0.0f, 10.0f);
    glTranslatef(-halfWidth, -halfHeight, 0.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

}

GLWidget::~GLWidget() {

    glDeleteBuffers(1, &ui32Vbo);

    delete [] arr;

}

異常看起來像這樣:

13:08:40.534>  Exception 'Data Abort'(4) Thread-Id=04930016(pth=8674ec28) PC=81221700 BVA=b6200040, dwInfo = 00001008
13:08:40.534>  R0=00000049  R1=00000001  R2=82f994e8  R3=00000000
13:08:40.534>  R4=00000000  R5=00000001  R6=00000049  R7=82f99978
13:08:40.534>  R8=82f9ac38  R9=82f9df0c R10=82f9df0c R11=000007e0
13:08:40.534> R12=00000000  SP=d354f840  Lr=8121edf8 Psr=6000011f
13:08:40.574>  R7=81235608
13:08:40.574>  R8=00000001  R9=00000002 R10=82f9df0c R11=82f9df0c
13:08:40.574> R12=812360e0  SP=ffffc634  Lr=812360f8 Psr=60000193
13:08:40.574> Exception 'Data Abort' (4): Thread-Id=04930016(pth=8674ec28), Proc-Id=00400002(pprc=82fa1448) 'NK.EXE', VM-active=04920016(pprc=8674e9ac) 'opengl_hello.exe'
13:08:40.574> PC=8121a6d8(NK.EXE+0x0001a6d8) RA=812360f8(kernel.dll+0x0000e0f8) SP=ffffc634, BVA=00000000
13:08:40.534> 360f8(kernel.dll+0x0000e0f8) SP=ffffc634, BVA=00000000
13:08:40.534> e4) PC=8121a6d8 BVA=b6200040, dwInfo = 00001008
13:08:40.534>  R0=81235608  R1=60000113  R2=b6200000  R3=82f9ac38
13:08:40.659>  R4=82f9d424  R5=00000000  R6=82f9ecc0 Proc-Id=00400002(pprc=82fa1448) 'NK.EXE', VM-active=04920016(pprc=8674e9ac) 'opengl_hello.exe'
13:08:40.659> PC=c00bb9a4(k.coredll.dll+0x0001b9a4) RA=812354c4(kernel.dll+0x0000d4c4) SP=d354f558, BVA=ffffffff

很抱歉張貼這種類型的問題(“代碼有什么問題?!”),但是大約一個月左右我找不到任何解決方案。

PS使用了官方德州儀器sdk的GLES 1.0庫。 硬件為帶PowerVR的DM3730。 PPS發現這種行為僅在D1電源狀態下才會發生(在D0中工作正常,而在D2中,繪圖由於SystemIdle而停止)。

編輯:我將代碼更改為以下代碼,但仍然崩潰。 現在,它變得更加罕見。

#pragma pack(push, 1)
struct drPoint {

    GLfloat x;
    GLfloat y;

};
struct clrPoint {

    GLfloat R;
    GLfloat G;
    GLfloat B;
    GLfloat A;

};
#pragma pack(pop)

void GLWidget::initializeGL() {

        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glPointSize(1.0);

        arr = new drPoint[this->height()];
        clr = new clrPoint[this->height()];

        for (int i = 0; i < this->height(); ++i) {

            arr[i].x    = 0;
            arr[i].y    = i;
            clr[i].R    = 1.0f;
            clr[i].G    = 0.0f;
            clr[i].B    = 0.0f;
            clr[i].A    = 1.0f;

        }

        glEnable(GL_VERTEX_ARRAY);
        glEnable(GL_COLOR_ARRAY);

    }

void GLWidget::paintGL() {

    // Some buffer filling code

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    glVertexPointer(2, GL_FLOAT, 0, arr);
    glColorPointer(4, GL_FLOAT, 0, clr);
    glDrawArrays(GL_POINTS, 0, this->height());

    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

}

似乎沒有顏色,一切工作正常(或者只是需要更多時間崩潰)。

GLES 1.0僅支持VBO“頂點陣列”。

您的代碼是VBO與“頂點數組”之間的雜亂無章,並且您沒有正確地綁定任何一個。

請咨詢GLES以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM