diff --git a/test/tutorial/tut03.cpp b/test/tutorial/tut03.cpp index c3512533..99c7f2b0 100644 --- a/test/tutorial/tut03.cpp +++ b/test/tutorial/tut03.cpp @@ -30,6 +30,17 @@ using namespace lol; # include #endif +#ifdef __CELLOS_LV2__ +static GLint const INTERNAL_FORMAT = GL_ARGB_SCE; +static GLenum const TEXTURE_FORMAT = GL_BGRA; +static GLenum const TEXTURE_TYPE = GL_UNSIGNED_INT_8_8_8_8_REV; +#else +/* Seems efficient for little endian textures */ +static GLint const INTERNAL_FORMAT = GL_RGBA; +static GLenum const TEXTURE_FORMAT = GL_BGRA; +static GLenum const TEXTURE_TYPE = GL_UNSIGNED_INT_8_8_8_8_REV; +#endif + class Fractal : public WorldEntity { public: @@ -135,7 +146,7 @@ public: f64cmplx oldcenter = m_center; double oldradius = m_radius; #ifdef __CELLOS_LV2__ - m_radius *= pow(2.0, -deltams * 0.0005); + m_radius *= pow(2.0, -deltams * 0.00005); m_center = f64cmplx(0.001643721971153, 0.822467633298876); #else double zoom = pow(2.0, (buttons[0] ? -deltams : deltams) * 0.0025); @@ -177,12 +188,14 @@ public: if (m_dirty[m_frame]) { + double const maxsqlen = 1024; + double const k1 = 1.0 / (1 << 10) / log2(maxsqlen); + m_dirty[m_frame]--; for (int j = ((m_frame + 1) % 4) / 2; j < m_size.y; j += 2) for (int i = m_frame % 2; i < m_size.x; i += 2) { - double const maxsqlen = 1024; f64cmplx z0 = m_center + TexelToWorldOffset(ivec2(i, j)); f64cmplx r0 = z0; @@ -206,7 +219,7 @@ public: /* Approximate log(sqrt(n))/log(sqrt(maxsqlen)) */ union { double n; uint64_t x; } u = { n }; double k = (u.x >> 42) - (((1 << 10) - 1) << 10); - k *= 1.0 / (1 << 10) / log2(maxsqlen); + k *= k1; /* Approximate log2(k) in [1,2]. */ f += (- 0.344847817623168308695977510213252644185 * k @@ -253,8 +266,13 @@ public: * so that we can upload four different subimages each frame. */ glGenTextures(1, &m_texid); glBindTexture(GL_TEXTURE_2D, m_texid); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_size.x / 2, m_size.y * 2, - 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, m_pixels); + glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT, + m_size.x / 2, m_size.y * 2, 0, + TEXTURE_FORMAT, TEXTURE_TYPE, m_pixels); +#if !defined __CELLOS_LV2__ + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_ALLOCATION_HINT_SCE, + GL_TEXTURE_TILED_GPU_SCE); +#endif glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -411,7 +429,7 @@ public: glTexSubImage2D(GL_TEXTURE_2D, 0, 0, m_frame * m_size.y / 2, m_size.x / 2, m_size.y / 2, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, + TEXTURE_FORMAT, TEXTURE_TYPE, m_pixels + m_size.x * m_size.y / 4 * m_frame); } @@ -422,7 +440,7 @@ if (0) for (int i = 0; i < 4; i++) { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, i * m_size.y / 2, m_size.x / 2, m_size.y / 2, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, + TEXTURE_FORMAT, TEXTURE_TYPE, m_pixels + m_size.x * m_size.y / 4 * m_frame); } }