2011-12-14 2 views
1

rgb를 그레이 스케일로 효율적으로 변환하려고 했으므로, here에서 rgba를 그레이 스케일로 변환하는 방법을 설명하는 함수가 있습니다. 이제는 똑같이하려고하지만, 단지 rgb로하려고합니다. 나는 몇 가지를 바꿨지 만 잘 작동하지 않는 것 같습니다. 왜 그런지 모르겠지만, 내 실수를 본 사람이 있습니까?암 네온으로 그레이 스케일 변환하는 Rgb

void neon_asm_convert(uint8_t * __restrict dest, uint8_t * __restrict src, int numPixels) 
{ 
    __asm__ volatile(
    "lsr %2, %2, #3 \n" 
    "# build the three constants: \n" 
    "mov r4, #28     \n" // Blue channel multiplier 
    "mov r5, #151     \n" // Green channel multiplier 
    "mov r6, #77     \n" // Red channel multiplier 
    "vdup.8 d4, r4     \n" 
    "vdup.8 d5, r5     \n" 
    "vdup.8 d6, r6     \n" 
    "0: \n" 
    "# load 8 pixels: \n" //RGBR 
    "vld4.8 {d0-d3}, [%1]! \n" 
    "# do the weight average: \n" 
    "vmull.u8 q7, d0, d4 \n" 
    "vmlal.u8 q7, d1, d5 \n" 
    "vmlal.u8 q7, d2, d6 \n" 
    "# shift and store: \n" 
    "vshrn.u16 d7, q7, #8 \n" // Divide q3 by 256 and store in the d7 
    "vst1.8 {d7}, [%0]! \n" 
    "subs %2, %2, #1 \n" // Decrement iteration count 

    "# load 8 pixels: \n" 
    "vld4.8 {d8-d11}, [%1]! \n" //Other GBRG 
    "# do the weight average: \n" 
    "vmull.u8 q7, d3, d4 \n" 
    "vmlal.u8 q7, d8, d5 \n" 
    "vmlal.u8 q7, d9, d6 \n" 
    "# shift and store: \n" 
    "vshrn.u16 d7, q7, #8 \n" // Divide q3 by 256 and store in the d7 
    "vst1.8 {d7}, [%0]! \n" 
    "subs %2, %2, #1 \n" // Decrement iteration count 

    "# load 8 pixels: \n" 
    "vld4.8 {d0-d3}, [%1]! \n" 
    "# do the weight average: \n" 
    "vmull.u8 q7, d10, d4 \n" 
    "vmlal.u8 q7, d11, d5 \n" 
    "vmlal.u8 q7, d0, d6 \n" 
    "# shift and store: \n" 
    "vshrn.u16 d7, q7, #8 \n" // Divide q3 by 256 and store in the d7 
    "vst1.8 {d7}, [%0]! \n" 
    "subs %2, %2, #1 \n" // Decrement iteration count 


    "# do the weight average: \n" 
    "vmull.u8 q7, d1, d4 \n" 
    "vmlal.u8 q7, d2, d5 \n" 
    "vmlal.u8 q7, d3, d6 \n" 
    "# shift and store: \n" 
    "vshrn.u16 d7, q7, #8 \n" // Divide q3 by 256 and store in the d7 
    "vst1.8 {d7}, [%0]! \n" 

    "subs %2, %2, #1 \n" // Decrement iteration count 



    "bne 0b \n" // Repeat unil iteration count is not zero 
    : 
    : "r"(dest), "r"(src), "r"(numPixels) 
    : "r4", "r5", "r6" 
    ); 
} 
+0

을 참조 사용해야합니까? 무슨 일이야? –

+0

이미지가 잘 변형되지 않았습니다. – Gustavo

+0

스크린 샷이나 뭐? –

답변

1

3 (RGB) 대신 4 개의 값 (RGBA)을로드합니다.

이미지에 RGB RGB RGB이 있지만 연속적으로 RGBR GBRG B... 등을로드합니다.

"vld4.8 {d0-d3}, [%1]! \n" 

대신해야 내 asm이 정확하지만 여기에 실수하면 나는 아무 생각이

"vld3.8 {d0-d2}, [%1]! \n" 

참고. 픽셀을 다시 메모리로 이동할 때도 동일한 실수가 있는지 확인하십시오.

+1

나는 이미 소스 코드에서 4 배의 벡터를 얻었으므로 여러 번 변환 할 수 있다고 생각합니다. 나는 RGBR/GBRG/BRGB를 매번 변형 시키려고한다. – Gustavo

+2

RGBR을로드하고 RGB를 그레이 스케일로 변환 한 다음 두 번째 R을 무시한 다음 GBRB를로드하고 GBR을 RGB (잘못된!)로 처리하고 마지막 B를 무시한 다음 다시 ... 그래서 일부 픽셀을 무시하고 각 단계마다 잘못된 채널을로드합니다. – Sam

1

Vasile이 맞습니다. VLD3을 사용하여 24 비트 픽셀을로드하십시오.

당신은 또한 당신의 코드가 아주 이상한 사실 4 3 VLDx VSTx ... 당신은 코드를 복제 할 필요가 없습니다

있습니다. 설명 하기엔 꽤 복잡하지만 코드 네 번 반복하는 NEON에 관심이 없습니다.

void neon_asm_convert(uint8_t * __restrict dest, uint8_t * __restrict src, int numPixels) 
{ 
    __asm__ volatile(
    "# build the three constants: \n" 
    "mov r4, #28     \n" // Blue channel multiplier 
    "mov r5, #151     \n" // Green channel multiplier 
    "mov r6, #77     \n" // Red channel multiplier 
    "vdup.8 d4, r4     \n" 
    "vdup.8 d5, r5     \n" 
    "vdup.8 d6, r6     \n" 

    "0: \n" 
    "# load 8 pixels: \n" //RGBR 
    "vld3.8 {d0-d2}, [%1]! \n" 
    "# do the weight average: \n" 
    "vmull.u8 q7, d0, d4 \n" 
    "vmlal.u8 q7, d1, d5 \n" 
    "vmlal.u8 q7, d2, d6 \n" 
    "# shift and store: \n" 
    "vshrn.u16 d7, q7, #8 \n" // Divide q3 by 256 and store in the d7 
    "vst1.8 {d7}, [%0]! \n" 
    "subs %2, %2, #1 \n" // Decrement iteration count 
    "bne 0b \n" // Repeat unil iteration count is not zero 
    : 
    : "r"(dest), "r"(src), "r"(numPixels) 
    : "r4", "r5", "r6" 
); 
} 

작동해야합니다.

+0

괜찮아 보이지만 그것은 나에게 메모리 액세스 오류를주고 또한 당신이 함수의 시작 부분에이 줄을 잊어 버린 것 같아요 : "lsr % 2, % 2, # 3 \ n" – Gustavo

+0

네, 맞습니다 또는 서브를 교체하십시오 % 2, % 2, # 1 (하위 % 2, % 2, # 8) – webshaker

2

당신은 "vld3.8 {d0-d2}, [%1]! \n"

하지 아니라도 http://hilbert-space.de/?p=22

+0

스택 오버플로에 오신 것을 환영합니다! 이것은 이론적으로 질문에 대답 할 수 있지만 여기에 답의 핵심 부분을 포함하고 참조 용 링크를 제공하는 것이 바람직합니다 (http://meta.stackexchange.com/q/8259). –

관련 문제