Skip to content

Instantly share code, notes, and snippets.

@screeny05
Created October 17, 2017 21:35
Show Gist options
  • Save screeny05/15047b95eec039b75831436c1f1c6545 to your computer and use it in GitHub Desktop.
Save screeny05/15047b95eec039b75831436c1f1c6545 to your computer and use it in GitHub Desktop.
napi_value napi_glGetShaderiv(napi_env env, napi_callback_info info) {
GET_NAPI_PARAMS_INFO(3, "getShaderiv(shader: number, pname: number, length: number): Int32Array");
GET_NAPI_PARAM_UINT32(shader, 0);
GET_NAPI_PARAM_UINT32(pname, 1);
GET_NAPI_PARAM_UINT32(length, 2);
// declare & alloc
napi_value output_buffer;
void* paramsPointer = NULL;
NAPI_CALL(env, napi_create_arraybuffer(env, length * sizeof(GLint), &paramsPointer, &output_buffer));
GLint* params = (GLint*)(paramsPointer);
// call
glGetShaderiv(shader, pname, params);
// return
napi_value output_array;
NAPI_CALL(env, napi_create_typedarray(env, napi_int32_array, length, output_buffer, 0, &output_array));
return output_array;
}
@screeny05
Copy link
Author

check napi_create_external_arraybuffer

@screeny05
Copy link
Author

void finalizerFree(napi_env env, void* finalize_data, void* arr){
    free(arr);
}

napi_value napi_glGetShaderiv(napi_env env, napi_callback_info info) {
    GET_NAPI_PARAMS_INFO(3, "getShaderiv(shader: number, pname: number, length: number): Int32Array");
    GET_NAPI_PARAM_UINT32(shader, 0);
    GET_NAPI_PARAM_UINT32(pname, 1);
    GET_NAPI_PARAM_UINT32(length, 2);

    GLint* params = (GLint *)malloc(length * sizeof(GLint));
    NAPI_ASSERT(env, params != NULL, "couldn't allocate memory");

    glGetShaderiv(shader, pname, params);

    napi_value output_buffer;
    NAPI_CALL(env, napi_create_external_arraybuffer(env, params, length * sizeof(GLint), finalizerFree, params, &output_buffer));


    napi_value output_array;
    NAPI_CALL(env, napi_create_typedarray(env, napi_int32_array, length, output_buffer, 0, &output_array));

    return output_array;
}

@screeny05
Copy link
Author

void finalizerFree(napi_env env, void* finalize_data, void* arr){
    printf("free %p\n", arr);
    free(arr);
}

napi_value napi_glGetShaderiv(napi_env env, napi_callback_info info) {
    GET_NAPI_PARAMS_INFO(3, "getShaderiv(shader: number, pname: number, length: number): Int32Array");
    GET_NAPI_PARAM_UINT32(shader, 0);
    GET_NAPI_PARAM_UINT32(pname, 1);
    GET_NAPI_PARAM_UINT32(length, 2);

    GLint* params = (GLint *)calloc(length, sizeof(*params));
    NAPI_ASSERT(env, params != NULL, "couldn't allocate memory");

    printf("alloc %p\n", params);

    glGetShaderiv(shader, pname, params);

    napi_value output_buffer;
    NAPI_CALL(env, napi_create_external_arraybuffer(env, params, length * sizeof(GLint), finalizerFree, params, &output_buffer));


    napi_value output_array;
    NAPI_CALL(env, napi_create_typedarray(env, napi_int32_array, length, output_buffer, 0, &output_array));

    return output_array;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment