2011-03-21 3 views
1

Intel Mac OS X 10.6.x의 C++ 응용 프로그램에서 작업 중입니다. OpenGL 호출 glReadPixels 사용하여 얻은 픽셀 데이터를 포함하는 변수가 있습니다. x86_64 어셈블리 명령어를 사용하여 픽셀 데이터에 직접 작업을 수행하려고합니다. 어셈블리 루틴은 테스트 프로그램에서 잘 작동하지만 픽셀 데이터에서 사용하려고하면 픽셀 데이터 변수가 가리키는 메모리 위치에서만 0이됩니다. 나는 x86_64 어셈블리에서 직접 비디오 메모리에 액세스하려고 시도하고 있기 때문에 이것이 추측입니다. 어셈블리에서 직접 x86_64 비디오 메모리에 액세스하는 방법이 있습니까? 그렇지 않으면이 상황을 어떻게 해결할 수 있습니까?x86_64 어셈블리의 OS X 비디오 메모리

모든 포인터를 이해하십시오. 미리 감사드립니다.

마지막 n 및 첫 번째 n 바이트를 뒤집는 코드 샘플은 아래를 참조하십시오. 동일한 코드가 테스트 프로그램에서 잘 작동합니다.

void Flip(void *b, unsigned int w, unsigned int h) 
    { 
    __asm { 
    mov r8, rdi //rdi b 
    mov r9, rsi //W 
    mov r10,rdx //H 
    mov r11, 0 // h <- 0 
    mov r12, 0 // w<- 0 
    outloop: 
    ------------ 
    ............. 
    ............. 
    } 
+0

비디오 메모리에 직접 액세스하지 않습니다. 'glReadPixels()'가 성공했는지 확인하고 있습니까? – Blrfl

+0

예 - glReadPixels가 정상적으로 작동합니다. –

+1

'glReadError()'를 호출 할 때와 마찬가지로 작동하며'GL_NO_ERROR'를 반환합니까? – Blrfl

답변

5

이것은 실제로 대답이 아니지만 주석 비트가 너무 짧아서 게시 할 수 없습니다.

인라인 어셈블리는 여러면에서 문제가있다 :

는 컴파일러가 인라인 블록에 도달하는 시간으로 가정
  • , 함수 인수는 인수 레지스터 아직. 이것은 보장되지 않습니다.
  • MS-VC++ 스타일 인라인 어셈블리를 사용합니다. 나는 OSX Clang에 대해 확신 할 수 없지만 gcc는 이것을 컴파일하는 것을 거부한다.

완전한 (편집 가능한) 원본 조각을 갖는 것도 좋습니다. (32 비트 코드)와 같은 뭔가 :

나는 일회성 실수를하지 않은 경우
int mogrifyFramebufferContents(unsigned char *fb, int width, int height) 
{ 
    int i, sum; 
    glReadPixels(1, 1, width, height, GL_RGBA, GL_UNSIGNED_BYTE, fb); 
    for (i = 0, sum = 0; i < 4 * width * height; i++) 
     sum += fb[i]; 

    printf("sum over fb via C: %d\n", sum); 

    asm("xorl  %0, %0\n" 
     "xorl  %1, %1\n" 
     "0:\n" 
     "movsbl (%2, %1), %ebx\n" 
     "addl  %ebx, %0\n" 
     "incl  %1\n" 
     "cmpl  %1, %3\n" 
     "jl  0b" 
     : "=r"(sum) 
     : "r"(i), "r"(fb), "r"(4 * width * height) 
     : "cc", "%ebx"); 

    printf("sum over fb via inline asm: %d\n", sum); 

    return (sum); 
} 

이 코드는 C와 어셈블리에 대한 동일한 출력 결과한다. C에서 읽은 데이터에 액세스하는 장소에서 비슷한 것을 시도하고 어셈블리 결과를 비교하거나 심지어 디버거를 사용하여 생성 된 어셈블리를 읽습니다.

"GCC 인라인 어셈블리 구문"에 대한 유래 검색 당신에게 %0 ... %2 자리가 무엇을 의미하는지에 대한 시작점을 제공하고합니다/또는 방법 일 이상 "=r"(sum) 같은 레지스터 할당 제약.