2014-02-27 52 views
1

機是飛思卡爾iMX53,我的程序有這樣一個電話創造了許多圖片分配的圖像:兩幅圖像eglCreateImageKHR的非電力

eglQueryImageFSL(egl_display, img, EGL_CLIENTBUFFER_TYPE_FSL, (EGLint *)&info); 

iMX53運行EGL 1.4和OpenGL ES 2.0。在我看來(通過調查stride值)eglCreateImageKHR(...)能夠以32的倍數分配圖像寬度,這對我來說是絕對不好的。不幸的是,我不能使用glTexImage2D和朋友,因爲他們造成的性能損失。

我可以以某種方式讓eglCreateImageKHR(...)避免使用32字節倍數,甚至強制它使用4/8/16字節對齊? 16字節的對齊對我來說也是足夠的。我沒有使用Android,只是一個2.6.35.4內核和帶有定製Linux發行版的OpenGL ES/EGL庫。

回答

1

我看了一下我在飛思卡爾iMX53上的實現,你說得對 - eglCreateImageKHR()要求紋理尺寸至少是32像素(不是字節)的倍數。實際上,我的代碼將寬度提高到了64的倍數。

我相信這是AMD Z430(GPU)的一項要求。我的解決方案是隻分配一次1920 x 1088的最壞情況大小,並將這些紋理用於所有視頻格式,因爲它們的EGL不允許調整大小。使用紋理座標來補償更小的格式,如下所示:

static GLfloat gafTexCoords[] = 
{ 
    0.0f, 1.0f, 
    1.0f, 1.0f, 
    1.0f, 0.0f, 
    0.0f, 0.0f 
}; 

iTextureWidth = (iOriginalTextureWidth + 63) & ~63; 
iTextureHeight = (iOriginalTextureHeight + 31) & ~31; 

gafTexCoords[2] = gafTexCoords[4] = (GLfloat)iOriginalTextureWidth/(GLfloat)iTextureWidth; 
gafTexCoords[1] = gafTexCoords[3] = (GLfloat)iOriginalTextureHeight/(GLfloat)iTextureHeight; 
+0

謝謝。你說得對,我們談論像素而不是字節。真正的問題不在於生成的視頻幀的縮放(沒關係),儘管VPU輸出似乎不是跨步大小的32個字節的倍數,因此在紋理化後顯示爲「垃圾」。但是我發現VPU可以得到精確的步幅,所以現在我正在試驗這個(事實上,Y分量現在正好顯示)。 – tselmeci