glReadPixels調査 (2)

glReadPixels に渡すバッファが足りないのは
使い方を間違えていたからでした。

あらかじめ必要な要素数の array を用意しないと seg.fault
するのは、前回説明した通りですが、

$pixels = array($width * $height);

で実験していて、これは間違いで、

$pixels = array_fill(0, $width * $height, 0);

です。

一応、これで落ちなくはなったけど。。。

値を受け取れない

PHP_FUNCTION(glreadpixels)
{
        <略>
    v_pixels = php_array_to_long_array(pixels);
    glReadPixels((int)Z_LVAL_P(x),(int)Z_LVAL_P(y),(int)Z_LVAL_P(width),(int)Z_LVAL_P(height),(int)Z_LVAL_P(format),(int)Z_LVAL_P(type),v_pixels);
}

なので、何も値が返ってきません。

実験

まず、引数を参照渡しにします。

ZEND_BEGIN_ARG_INFO_EX(force_ref_seventh_arg, 1, 0, 7)
    ZEND_ARG_INFO(0, arg1)
    ZEND_ARG_INFO(0, arg2)
    ZEND_ARG_INFO(0, arg3)
    ZEND_ARG_INFO(0, arg4)
    ZEND_ARG_INFO(0, arg5)
    ZEND_ARG_INFO(0, arg6)
    ZEND_ARG_INFO(1, arg7)
ZEND_END_ARG_INFO()
function_entry opengl_functions[] = {
    <略>
    PHP_FE(glreadpixels,force_ref_seventh_arg)


PHP_FUNCTION(glreadpixels) の 最後に、

        long_array_to_php_array(v_pixels, (int)Z_LVAL_P(width) * Z_LVAL_P(height)* 4 /*U_LONG size*/, pixels);
}

の一行を追加してみたけど、何も変わる様子無いです。

long_array_to_php_array の処理は予想通りだったので、
Zend API の使い方に何か問題があるのかも。

そもそも論

そもそもこういう配列の使い方すると、メモリがすぐ溢れるので、
PHP の array で値を受け取るのは実用的じゃないよね。

結局のところ、PHP カンファレンスで使った glReadPixels_yoya が現実的な気がします。