hardcoded and only the fractal demo uses it, but everything will eventually switch.legacy
@@ -50,6 +50,7 @@ liblol_a_SOURCES = \ | |||
gpu/indexbuffer.cpp gpu/indexbuffer.h \ | |||
gpu/vertexbuffer.cpp gpu/vertexbuffer.h \ | |||
gpu/framebuffer.cpp gpu/framebuffer.h \ | |||
gpu/texture.cpp gpu/texture.h \ | |||
\ | |||
gpu/defaultmaterial.lolfx \ | |||
gpu/tile.lolfx \ | |||
@@ -115,6 +115,7 @@ static inline int isnan(float f) | |||
#include "layer.h" | |||
#include "gpu/lolfx.h" | |||
#include "gpu/shader.h" | |||
#include "gpu/texture.h" | |||
#include "gpu/indexbuffer.h" | |||
#include "gpu/vertexbuffer.h" | |||
#include "gpu/framebuffer.h" | |||
@@ -0,0 +1,176 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||
// | |||
#if defined HAVE_CONFIG_H | |||
# include "config.h" | |||
#endif | |||
#include "core.h" | |||
#include "lolgl.h" | |||
#if defined _WIN32 && defined USE_D3D9 | |||
# define FAR | |||
# define NEAR | |||
# include <d3d9.h> | |||
#endif | |||
using namespace std; | |||
#if defined USE_D3D9 | |||
extern IDirect3DDevice9 *g_d3ddevice; | |||
#elif defined _XBOX | |||
extern D3DDevice *g_d3ddevice; | |||
#endif | |||
namespace lol | |||
{ | |||
// | |||
// The TextureData class | |||
// --------------------- | |||
// | |||
class TextureData | |||
{ | |||
friend class Texture; | |||
ivec2 m_size; | |||
#if defined USE_D3D9 | |||
IDirect3DTexture9 *m_tex; | |||
#elif defined _XBOX | |||
D3DTexture *m_tex; | |||
#else | |||
GLuint m_texid; | |||
#endif | |||
}; | |||
// | |||
// The Texture class | |||
// ----------------- | |||
// | |||
/* FIXME: this is all hardcoded over the place */ | |||
#if __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; | |||
#elif defined __native_client__ || defined HAVE_GLES_2X | |||
static GLint const INTERNAL_FORMAT = GL_RGBA; | |||
static GLenum const TEXTURE_FORMAT = GL_RGBA; | |||
static GLenum const TEXTURE_TYPE = GL_UNSIGNED_BYTE; | |||
#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 | |||
Texture::Texture(ivec2 size) | |||
: m_data(new TextureData) | |||
{ | |||
m_data->m_size = size; | |||
#if defined USE_D3D9 | |||
g_d3ddevice->CreateTexture(m_data->m_size.x, m_data->m_size.y, 1, | |||
D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, | |||
D3DPOOL_SYSTEMMEM, &m_tex, NULL); | |||
#elif defined _XBOX | |||
/* By default the X360 will swizzle the texture. Ask for linear. */ | |||
g_d3ddevice->CreateTexture(m_data->m_size.x, m_data->m_size.y, 1, | |||
D3DUSAGE_WRITEONLY, D3DFMT_LIN_A8R8G8B8, | |||
D3DPOOL_DEFAULT, &m_tex, NULL); | |||
#else | |||
glGenTextures(1, &m_data->m_texid); | |||
glBindTexture(GL_TEXTURE_2D, m_data->m_texid); | |||
# if defined __CELLOS_LV2__ | |||
/* We need this hint because by default the storage type is | |||
* GL_TEXTURE_SWIZZLED_GPU_SCE. */ | |||
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); | |||
#endif | |||
} | |||
void Texture::Bind() | |||
{ | |||
#if defined _XBOX || defined USE_D3D9 | |||
g_d3ddevice->SetTexture(0, m_data->m_tex); | |||
#else | |||
# if !defined HAVE_GLES_2X | |||
glEnable(GL_TEXTURE_2D); | |||
# endif | |||
glBindTexture(GL_TEXTURE_2D, m_data->m_texid); | |||
#endif | |||
} | |||
void Texture::SetData(void *data) | |||
{ | |||
#if defined _XBOX || defined USE_D3D9 | |||
D3DLOCKED_RECT rect; | |||
# if defined _XBOX | |||
m_data->m_tex->LockRect(0, &rect, NULL, D3DLOCK_NOOVERWRITE); | |||
# else | |||
m_data->m_tex->LockRect(0, &rect, NULL, | |||
D3DLOCK_DISCARD | D3DLOCK_NOOVERWRITE); | |||
# endif | |||
memcpy(rect.pBits, data, rect.Pitch * rect.Height); | |||
m_data->m_tex->UnlockRect(0); | |||
#else | |||
glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT, | |||
m_data->m_size.x, m_data->m_size.y, 0, | |||
TEXTURE_FORMAT, TEXTURE_TYPE, data); | |||
#endif | |||
} | |||
void Texture::SetSubData(ivec2 origin, ivec2 size, void *data) | |||
{ | |||
#if defined _XBOX || defined USE_D3D9 | |||
D3DLOCKED_RECT rect; | |||
# if defined _XBOX | |||
m_data->m_tex->LockRect(0, &rect, NULL, D3DLOCK_NOOVERWRITE); | |||
# else | |||
m_data->m_tex->LockRect(0, &rect, NULL, | |||
D3DLOCK_DISCARD | D3DLOCK_NOOVERWRITE); | |||
# endif | |||
for (int j = 0; j < size.y; j++) | |||
{ | |||
uint8_t *dst = (uint8_t *)rect.pBits + (origin.y + j) * rect.Pitch; | |||
/* FIXME: the source or destination pitch isn't necessarily 4! */ | |||
uint8_t *src = (uint8_t *)data + j * size.y * 4; | |||
memcpy(dst, src, size.y * 4); | |||
} | |||
m_data->m_tex->UnlockRect(0); | |||
#else | |||
glTexSubImage2D(GL_TEXTURE_2D, 0, origin.x, origin.y, size.x, size.y, | |||
TEXTURE_FORMAT, TEXTURE_TYPE, data); | |||
#endif | |||
} | |||
Texture::~Texture() | |||
{ | |||
#if defined USE_D3D9 || defined _XBOX | |||
m_data->m_tex->Release(); | |||
#else | |||
glDeleteTextures(1, &m_data->m_texid); | |||
#endif | |||
delete m_data; | |||
} | |||
} /* namespace lol */ | |||
@@ -0,0 +1,39 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://sam.zoy.org/projects/COPYING.WTFPL for more details. | |||
// | |||
// | |||
// The Texture class | |||
// ----------------- | |||
// | |||
#if !defined __LOL_TEXTURE_H__ | |||
#define __LOL_TEXTURE_H__ | |||
namespace lol | |||
{ | |||
class Texture | |||
{ | |||
public: | |||
Texture(ivec2 size); | |||
~Texture(); | |||
void Bind(); | |||
void SetData(void *data); | |||
void SetSubData(ivec2 origin, ivec2 size, void *data); | |||
private: | |||
class TextureData *m_data; | |||
}; | |||
} /* namespace lol */ | |||
#endif // __LOL_TEXTURE_H__ | |||
@@ -254,6 +254,7 @@ | |||
<ClCompile Include="gpu\lolfx-compiler.cpp" /> | |||
<ClCompile Include="gpu\lolfx.cpp" /> | |||
<ClCompile Include="gpu\shader.cpp" /> | |||
<ClCompile Include="gpu\texture.cpp" /> | |||
<ClCompile Include="gpu\vertexbuffer.cpp" /> | |||
<ClCompile Include="gradient.cpp" /> | |||
<ClCompile Include="hash.cpp" /> | |||
@@ -567,6 +568,7 @@ | |||
<ClInclude Include="gpu\lolfx-compiler.h" /> | |||
<ClInclude Include="gpu\lolfx.h" /> | |||
<ClInclude Include="gpu\shader.h" /> | |||
<ClInclude Include="gpu\texture.h" /> | |||
<ClInclude Include="gpu\vertexbuffer.h" /> | |||
<ClInclude Include="gradient.h" /> | |||
<ClInclude Include="hash.h" /> | |||
@@ -97,6 +97,9 @@ | |||
<ClCompile Include="gpu\shader.cpp"> | |||
<Filter>src\gpu</Filter> | |||
</ClCompile> | |||
<ClCompile Include="gpu\texture.cpp"> | |||
<Filter>src\gpu</Filter> | |||
</ClCompile> | |||
<ClCompile Include="gpu\vertexbuffer.cpp"> | |||
<Filter>src\gpu</Filter> | |||
</ClCompile> | |||
@@ -669,6 +672,9 @@ | |||
<ClInclude Include="gpu\shader.h"> | |||
<Filter>src\gpu</Filter> | |||
</ClInclude> | |||
<ClInclude Include="gpu\texture.h"> | |||
<Filter>src\gpu</Filter> | |||
</ClInclude> | |||
<ClInclude Include="gpu\vertexbuffer.h"> | |||
<Filter>src\gpu</Filter> | |||
</ClInclude> | |||
@@ -15,41 +15,12 @@ | |||
#include <cstring> | |||
#include "core.h" | |||
#include "lolgl.h" | |||
#include "loldebug.h" | |||
using namespace lol; | |||
#if defined _WIN32 | |||
# include <direct.h> | |||
# if defined USE_D3D9 | |||
# define FAR | |||
# define NEAR | |||
# include <d3d9.h> | |||
# endif | |||
#endif | |||
extern char const *lolfx_11_fractal; | |||
#if defined USE_D3D9 | |||
extern IDirect3DDevice9 *g_d3ddevice; | |||
#elif defined _XBOX | |||
extern D3DDevice *g_d3ddevice; | |||
#elif __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; | |||
#elif defined __native_client__ || defined HAVE_GLES_2X | |||
static GLint const INTERNAL_FORMAT = GL_RGBA; | |||
static GLenum const TEXTURE_FORMAT = GL_RGBA; | |||
static GLenum const TEXTURE_TYPE = GL_UNSIGNED_BYTE; | |||
#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: | |||
@@ -467,32 +438,13 @@ public: | |||
if (!m_ready) | |||
{ | |||
#if !defined _XBOX && !defined USE_D3D9 | |||
/* Create a texture of half the width and twice the height | |||
* 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, INTERNAL_FORMAT, | |||
m_size.x / 2, m_size.y * 2, 0, | |||
TEXTURE_FORMAT, TEXTURE_TYPE, &m_pixels[0]); | |||
# if defined __CELLOS_LV2__ | |||
/* We need this hint because by default the storage type is | |||
* GL_TEXTURE_SWIZZLED_GPU_SCE. */ | |||
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); | |||
#elif defined _XBOX | |||
/* By default the X360 will swizzle the texture. Ask for linear. */ | |||
g_d3ddevice->CreateTexture(m_size.x / 2, m_size.y * 2, 1, | |||
D3DUSAGE_WRITEONLY, D3DFMT_LIN_A8R8G8B8, | |||
D3DPOOL_DEFAULT, &m_tex, NULL); | |||
#else | |||
g_d3ddevice->CreateTexture(m_size.x / 2, m_size.y * 2, 1, | |||
D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, | |||
D3DPOOL_SYSTEMMEM, &m_tex, NULL); | |||
#endif | |||
m_texture = new Texture(ivec2(m_size.x / 2, m_size.y * 2)); | |||
/* Ensure the texture data is complete at least once, otherwise | |||
* uploading subimages will not work. */ | |||
m_texture->SetData(&m_pixels[0]); | |||
m_shader = Shader::Create(lolfx_11_fractal); | |||
@@ -520,14 +472,7 @@ public: | |||
m_ready = true; | |||
} | |||
#if defined _XBOX || defined USE_D3D9 | |||
#else | |||
# if !defined HAVE_GLES_2X | |||
glEnable(GL_TEXTURE_2D); | |||
# endif | |||
glBindTexture(GL_TEXTURE_2D, m_texid); | |||
#endif | |||
m_texture->Bind(); | |||
if (m_dirty[m_frame]) | |||
{ | |||
@@ -536,32 +481,14 @@ public: | |||
m_dirty[m_frame]--; | |||
#if defined _XBOX || defined USE_D3D9 | |||
D3DLOCKED_RECT rect; | |||
# if defined _XBOX | |||
m_tex->LockRect(0, &rect, NULL, D3DLOCK_NOOVERWRITE); | |||
# else | |||
m_tex->LockRect(0, &rect, NULL, | |||
D3DLOCK_DISCARD | D3DLOCK_NOOVERWRITE); | |||
# endif | |||
for (int j = 0; j < m_size.y * 2; j++) | |||
{ | |||
u8vec4 *line = (u8vec4 *)rect.pBits + j * rect.Pitch / 4; | |||
for (int i = 0; i < m_size.x / 2; i++) | |||
line[i] = m_pixels[m_size.x / 2 * j + i]; | |||
} | |||
m_tex->UnlockRect(0); | |||
#elif defined __CELLOS_LV2__ | |||
#if defined __CELLOS_LV2__ | |||
/* glTexSubImage2D is extremely slow on the PS3, to the point | |||
* that uploading the whole texture is 40 times faster. */ | |||
glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT, | |||
m_size.x / 2, m_size.y * 2, 0, | |||
TEXTURE_FORMAT, TEXTURE_TYPE, &m_pixels[0]); | |||
m_texture->SetData(&m_pixels[0]); | |||
#else | |||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, m_frame * m_size.y / 2, | |||
m_size.x / 2, m_size.y / 2, | |||
TEXTURE_FORMAT, TEXTURE_TYPE, | |||
&m_pixels[m_size.x * m_size.y / 4 * m_frame]); | |||
m_texture->SetSubData(ivec2(0, m_frame * m_size.y / 2), | |||
m_size / 2, | |||
&m_pixels[m_size.x * m_size.y / 4 * m_frame]); | |||
#endif | |||
} | |||
@@ -572,12 +499,7 @@ public: | |||
m_vdecl->Bind(); | |||
m_vdecl->SetStream(m_vbo, m_vertexattrib); | |||
m_vdecl->SetStream(m_tbo, m_texattrib); | |||
#if defined _XBOX || defined USE_D3D9 | |||
g_d3ddevice->SetTexture(0, m_tex); | |||
g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | |||
#elif !defined __CELLOS_LV2__ && !defined __ANDROID__ | |||
#else | |||
#endif | |||
m_texture->Bind(); | |||
m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 6); | |||
m_vdecl->Unbind(); | |||
} | |||
@@ -599,13 +521,8 @@ private: | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo, *m_tbo; | |||
#if defined USE_D3D9 | |||
IDirect3DTexture9 *m_tex; | |||
#elif defined _XBOX | |||
D3DTexture *m_tex; | |||
#else | |||
GLuint m_texid; | |||
#endif | |||
Texture *m_texture; | |||
int m_frame, m_slices, m_dirty[4]; | |||
bool m_ready, m_drag; | |||