コード例 #1
0
ファイル: float_texture.cpp プロジェクト: DoDNet/Halide
int main() {

    // This test must be run with an OpenGL target
    const Target &target = get_jit_target_from_environment();
    if (!target.has_feature(Target::OpenGL))  {
        fprintf(stderr,"ERROR: This test must be run with an OpenGL target, e.g. by setting HL_JIT_TARGET=host-opengl.\n");
        return 1;
    }

    Image<float> input(255, 255, 3);
    for (int y=0; y<input.height(); y++) {
        for (int x=0; x<input.width(); x++) {
            for (int c=0; c<3; c++) {
                // Note: the following values can be >1.0f to test whether
                // OpenGL performs clamping operations as part of the copy
                // operation.  (It may do so if something other than floats
                // are stored in the actual texture.)
                float v = (10 * x + y + c);
                input(x, y, c) = v;
            }
        }
    }

    Var x, y, c;
    Func g;
    g(x, y, c) = input(x, y, c);

    Image<float> out(255, 255, 3);
    g.bound(c, 0, 3);
    g.glsl(x, y, c);
    g.realize(out);
    out.copy_to_host();

    for (int y=0; y<out.height(); y++) {
        for (int x=0; x<out.width(); x++) {
            if (!(out(x, y, 0) == input(x, y, 0) &&
                  out(x, y, 1) == input(x, y, 1) &&
                  out(x, y, 2) == input(x, y, 2))) {
                fprintf(stderr, "Incorrect pixel (%g,%g,%g) != (%g,%g,%g) at x=%d y=%d.\n",
                        out(x, y, 0), out(x, y, 1), out(x, y, 2),
                        input(x, y, 0), input(x, y, 1), input(x, y, 2),
                        x, y);
                return 1;
            }
        }
    }

    printf("Success!\n");
    return 0;
}
コード例 #2
0
ファイル: copy_pixels.cpp プロジェクト: JoeyJAL/Halide
int main() {

    // This test must be run with an OpenGL target
    const Target &target = get_jit_target_from_environment();
    if (!(target.features & Target::OpenGL))  {
        fprintf(stderr,"ERROR: This test must be run with an OpenGL target, e.g. by setting HL_JIT_TARGET=host-opengl.\n");
        return 1;
    }

    Image<uint8_t> input(255, 10, 3);
    for (int y=0; y<input.height(); y++) {
        for (int x=0; x<input.width(); x++) {
            for (int c=0; c<3; c++) {
              input(x, y, c) = 10*x + y + c;
            }
        }
    }

    Var x, y, c;
    Func g;
    g(x, y, c) = input(x, y, c);

    Image<uint8_t> out(255, 10, 3);
    g.bound(c, 0, 3);
    g.glsl(x, y, c);
    g.realize(out);
    out.copy_to_host();

    for (int y=0; y<out.height(); y++) {
        for (int x=0; x<out.width(); x++) {
            if (!(out(x, y, 0) == input(x, y, 0) &&
                  out(x, y, 1) == input(x, y, 1) &&
                  out(x, y, 2) == input(x, y, 2))) {
                fprintf(stderr, "Incorrect pixel (%d,%d,%d) != (%d,%d,%d) at x=%d y=%d.\n",
                        out(x, y, 0), out(x, y, 1), out(x, y, 2),
                        input(x, y, 0), input(x, y, 1), input(x, y, 2),
                        x, y);
                return 1;
            }
        }
    }

    printf("Success!\n");
    return 0;
}
コード例 #3
0
int main(int argc, char **argv) {
    Param<float> time;

    const float pi = 3.1415926536;

    Var x, y, c;
    Func result;

    Expr kx, ky;
    Expr xx, yy;
    kx = x / 150.0f;
    ky = y / 150.0f;

    xx = kx + sin(time/3.0f);
    yy = ky + sin(time/2.0f);

    Expr angle;
    angle = 2 * pi * sin(time/20.0f);
    kx = kx * cos(angle) - ky * sin(angle);
    ky = kx * sin(angle) + ky * cos(angle);

    Expr v = 0.0f;
    v += sin((ky + time) / 2.0f);
    v += sin((kx + ky + time) / 2.0f);
    v += sin(sqrt(xx * xx + yy * yy + 1.0f) + time);

    result(x, y, c) = cast<uint8_t>(
        select(c == 0, 32,
               select(c == 1, cos(pi * v),
                      sin(pi * v)) * 80 + (255 - 80)));

    result.output_buffer().set_stride(0, 4);
    result.bound(c, 0, 4);
    result.glsl(x, y, c);

    result.compile_to_file("halide_gl_filter", {time}, "halide_gl_filter");

    return 0;
}
コード例 #4
0
ファイル: special_funcs.cpp プロジェクト: bnascimento/Halide
int main() {
    Func f;
    Var x, y, c;

    Expr e = 0;

    // Max with integer arguments requires Halide to introduce an implicit
    // cast to float.
    e = select(x == 0, max(y, 5), e);
    // But using float directly should also work.
    e = select(x == 1, cast<int>(min(cast<float>(y), 5.0f)), e);

    e = select(x == 2, y % 3, e);
    e = select(x == 3, cast<int>(127*sin(y) + 128), e);
    e = select(x == 4, y / 2, e);

    f(x, y, c) = cast<uint8_t>(e);

    Image<uint8_t> out(10, 10, 1);
    f.bound(c, 0, 1);
    f.glsl(x, y, c);
    f.realize(out);

    out.copy_to_host();

    for (int y = 0; y < out.height(); y++) {
        CHECK_EQ(out(0, y, 0), std::max(y, 5));
        CHECK_EQ(out(1, y, 0), std::min(y, 5));
        CHECK_EQ(out(2, y, 0), y % 3);
        CHECK_EQ(out(3, y, 0), static_cast<int>(127*std::sin(y) + 128));
        CHECK_EQ(out(4, y, 0), y / 2);
    }

    printf("Success!\n");
    return 0;
}