diff --git a/deps/vitaGL/README.md b/deps/vitaGL/README.md index 5f5c956243..98ab65c04a 100644 --- a/deps/vitaGL/README.md +++ b/deps/vitaGL/README.md @@ -28,9 +28,13 @@ Direct OpenGL Usage:<br> [vitaVoyager](https://vitadb.rinnegatamante.it/#/info/367) - Port of lilium-voyager (Star Trek Voyager: Elite Force)<br> [Daedalus X64](https://github.com/Rinnegatamante/daedalusx64-vitagl) - Port of Daedalus X64 (N64 Emulator)<br> [RetroArch](https://github.com/libretro/RetroArch) - Vita's GL1 video driver of RetroArch<br> -[vitaET](https://github.com/Rinnegatamante/vitaET) - Port of ET:Legacy (Wolfenstein: Enemy Territory)<br> +[vitaET](https://github.com/Rinnegatamante/vitaET) - Port of ET: Legacy (Wolfenstein: Enemy Territory)<br> [flycast](https://github.com/Rinnegatamante/flycast) - Port of flycast (Dreamcast Emulator)<br> [AvP Gold](https://github.com/Rinnegatamante/AvP-Gold-Vita) - Port of Aliens versus Predator: Gold Edition<br> +[re3-vita](https://vitadb.rinnegatamante.it/#/info/589) - Port of Grand Theft Auto III<br> +[prboom-plus](https://vitadb.rinnegatamante.it/#/info/591) - Port of PrBoom Plus (Doom engine sourceport)<br> +[VITAlbum](https://vitadb.rinnegatamante.it/#/info/566) - Filebrowser and image viewer app<br> +[sm64-vita](https://github.com/bythos14/sm64-vita) - Port of Super Mario 64<br> Libraries:<br> [sdl12_gl](https://github.com/Rinnegatamante/SDL-Vita/tree/sdl12_gl/src) - SDL 1.2 Vita port adapted to work with vitaGL as renderer<br> @@ -42,5 +46,5 @@ sdl12_gl Apps:<br> [ZeldaROTH](https://vitadb.rinnegatamante.it/#/info/109) - Port of Zelda: Return of the Hylian<br> [Zelda3T](https://vitadb.rinnegatamante.it/#/info/334) - Port of Zelda: Time to Triumph<br> [ZeldaNSQ](https://vitadb.rinnegatamante.it/#/info/350) - Port of Zelda: Navi's Quest<br> -[vitaWolfen](https://vitadb.rinnegatamante.it/#/info/31) - Port of Wolf4SDL<br> +[vitaWolfen](https://vitadb.rinnegatamante.it/#/info/31) - Port of Wolf4SDL (Wolfenstein 3D)<br> [meritous](https://vitadb.rinnegatamante.it/#/info/411) - Port of meritous<br> diff --git a/deps/vitaGL/source/custom_shaders.c b/deps/vitaGL/source/custom_shaders.c index b86fdbae76..398cb2a8c3 100644 --- a/deps/vitaGL/source/custom_shaders.c +++ b/deps/vitaGL/source/custom_shaders.c @@ -136,19 +136,24 @@ void _vglDrawObjects_CustomShadersIMPL(GLenum mode, GLsizei count, GLboolean imp static char *shark_log = NULL; void shark_log_cb(const char *msg, shark_log_level msg_level, int line) { uint8_t append = shark_log != NULL; - uint32_t size = (append ? strlen(shark_log) : 0) + strlen(msg); - shark_log = append ? realloc(shark_log, size) : malloc(size); + char newline[1024]; switch (msg_level) { case SHARK_LOG_INFO: - sprintf(shark_log, "%s%sI] %s on line %d", append ? shark_log : "", append ? "\n" : "", msg, line); + sprintf(newline, "%sI] %s on line %d", append ? "\n" : "", msg, line); break; case SHARK_LOG_WARNING: - sprintf(shark_log, "%s%sW] %s on line %d", append ? shark_log : "", append ? "\n" : "", msg, line); + sprintf(newline, "%sW] %s on line %d", append ? "\n" : "", msg, line); break; case SHARK_LOG_ERROR: - sprintf(shark_log, "%s%sE] %s on line %d", append ? shark_log : "", append ? "\n" : "", msg, line); + sprintf(newline, "%sE] %s on line %d", append ? "\n" : "", msg, line); break; } + uint32_t size = (append ? strlen(shark_log) : 0) + strlen(newline); + shark_log = realloc(shark_log, size + 1); + if (append) + sprintf(shark_log, "%s%s", shark_log, newline); + else + strcpy(shark_log, newline); } #endif @@ -165,7 +170,7 @@ void vglSetupRuntimeShaderCompiler(shark_opt opt_level, int32_t use_fastmath, in compiler_fastint = use_fastint; #endif } - + void vglEnableRuntimeShaderCompiler(GLboolean usage) { use_shark = usage; } @@ -205,7 +210,7 @@ GLuint glCreateShader(GLenum shaderType) { void glGetShaderiv(GLuint handle, GLenum pname, GLint *params) { // Grabbing passed shader shader *s = &shaders[handle - 1]; - + switch (pname) { case GL_SHADER_TYPE: *params = s->type; @@ -231,26 +236,26 @@ void glGetShaderInfoLog(GLuint handle, GLsizei maxLength, GLsizei *length, GLcha // Grabbing passed shader shader *s = &shaders[handle - 1]; - + if (s->log) { *length = min(strlen(s->log), maxLength); memcpy_neon(infoLog, s->log, *length); } } -void glShaderSource(GLuint handle, GLsizei count, const GLchar * const *string, const GLint *length) { +void glShaderSource(GLuint handle, GLsizei count, const GLchar *const *string, const GLint *length) { #ifndef SKIP_ERROR_HANDLING if (count < 0) { SET_GL_ERROR(GL_INVALID_VALUE) } #endif - if (!is_shark_online) { + if (!is_shark_online) { SET_GL_ERROR(GL_INVALID_OPERATION) } - + // Grabbing passed shader shader *s = &shaders[handle - 1]; - + // Temporarily setting prog to point to the shader source s->prog = (SceGxmProgram *)*string; s->size = length ? *length : strlen(*string); @@ -276,9 +281,9 @@ void glCompileShader(GLuint handle) { #ifdef HAVE_SHARK // Grabbing passed shader shader *s = &shaders[handle - 1]; - + // Compiling shader source - s->prog = shark_compile_shader_extended((const char*)s->prog, &s->size, s->type == GL_FRAGMENT_SHADER ? SHARK_FRAGMENT_SHADER : SHARK_VERTEX_SHADER, compiler_opts, compiler_fastmath, compiler_fastprecision, compiler_fastint); + s->prog = shark_compile_shader_extended((const char *)s->prog, &s->size, s->type == GL_FRAGMENT_SHADER ? SHARK_FRAGMENT_SHADER : SHARK_VERTEX_SHADER, compiler_opts, compiler_fastmath, compiler_fastprecision, compiler_fastint); if (s->prog) { SceGxmProgram *res = (SceGxmProgram *)malloc(s->size); memcpy_neon((void *)res, (void *)s->prog, s->size); @@ -302,7 +307,8 @@ void glDeleteShader(GLuint shad) { if (s->valid) { sceGxmShaderPatcherForceUnregisterProgram(gxm_shader_patcher, s->id); free((void *)s->prog); - if (s->log) free(s->log); + if (s->log) + free(s->log); } s->log = NULL; s->valid = GL_FALSE; @@ -386,7 +392,7 @@ void glLinkProgram(GLuint progr) { void glUseProgram(GLuint prog) { // Setting current custom program to passed program cur_program = prog; - + // Setting in-use vertex and fragment program in sceGxm reloadCustomShader(); } @@ -405,12 +411,12 @@ GLint glGetUniformLocation(GLuint prog, const GLchar *name) { res->ptr = sceGxmProgramFindParameterByName(p->fshader->prog, name); res->isVertex = GL_FALSE; } - + if (res->ptr == NULL) { free(res); return -1; } - + if (p->last_uniform != NULL) p->last_uniform->chain = (void *)res; p->last_uniform = res; @@ -422,7 +428,7 @@ void glUniform1i(GLint location, GLint v0) { // Checking if the uniform does exist if (location == -1) return; - + // Grabbing passed uniform uniform *u = (uniform *)location; if (u->ptr == NULL) @@ -446,7 +452,7 @@ void glUniform2i(GLint location, GLint v0, GLint v1) { // Checking if the uniform does exist if (location == -1) return; - + // Grabbing passed uniform uniform *u = (uniform *)location; if (u->ptr == NULL) @@ -474,7 +480,7 @@ void glUniform1f(GLint location, GLfloat v0) { // Checking if the uniform does exist if (location == -1) return; - + // Grabbing passed uniform uniform *u = (uniform *)location; if (u->ptr == NULL) @@ -496,7 +502,7 @@ void glUniform2f(GLint location, GLfloat v0, GLfloat v1) { // Checking if the uniform does exist if (location == -1) return; - + // Grabbing passed uniform uniform *u = (uniform *)location; if (u->ptr == NULL) @@ -524,7 +530,7 @@ void glUniform2fv(GLint location, GLsizei count, const GLfloat *value) { // Checking if the uniform does exist if (location == -1) return; - + // Grabbing passed uniform uniform *u = (uniform *)location; if (u->ptr == NULL) @@ -546,7 +552,7 @@ void glUniform3fv(GLint location, GLsizei count, const GLfloat *value) { // Checking if the uniform does exist if (location == -1) return; - + // Grabbing passed uniform uniform *u = (uniform *)location; if (u->ptr == NULL) @@ -568,14 +574,14 @@ void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) // Checking if the uniform does exist if (location == -1) return; - + // Grabbing passed uniform uniform *u = (uniform *)location; if (u->ptr == NULL) return; // Setting passed value to desired uniform - float v[4] = {v0, v1, v2, v3}; + float v[4] = { v0, v1, v2, v3 }; if (u->isVertex) { if (vert_uniforms == NULL) sceGxmReserveVertexDefaultUniformBuffer(gxm_context, &vert_uniforms); @@ -591,7 +597,7 @@ void glUniform4fv(GLint location, GLsizei count, const GLfloat *value) { // Checking if the uniform does exist if (location == -1) return; - + // Grabbing passed uniform uniform *u = (uniform *)location; if (u->ptr == NULL) @@ -613,7 +619,7 @@ void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, cons // Checking if the uniform does exist if (location == -1) return; - + // Grabbing passed uniform uniform *u = (uniform *)location; if (u->ptr == NULL) @@ -646,7 +652,8 @@ void vglBindAttribLocation(GLuint prog, GLuint index, const GLchar *name, const // Looking for desired parameter in requested program const SceGxmProgramParameter *param = sceGxmProgramFindParameterByName(p->vshader->prog, name); - if (param == NULL) return; + if (param == NULL) + return; // Setting stream index and offset values attributes->streamIndex = index; @@ -684,7 +691,7 @@ void vglBindAttribLocation(GLuint prog, GLuint index, const GLchar *name, const } // Equivalent of glBindAttribLocation but for sceGxm architecture when packed attributes are used -void vglBindPackedAttribLocation(GLuint prog, const GLchar *name, const GLuint num, const GLenum type, GLuint offset, GLint stride) { +GLint vglBindPackedAttribLocation(GLuint prog, const GLchar *name, const GLuint num, const GLenum type, GLuint offset, GLint stride) { // Grabbing passed program program *p = &progs[prog - 1]; SceGxmVertexAttribute *attributes = &p->attr[p->attr_num]; @@ -692,7 +699,8 @@ void vglBindPackedAttribLocation(GLuint prog, const GLchar *name, const GLuint n // Looking for desired parameter in requested program const SceGxmProgramParameter *param = sceGxmProgramFindParameterByName(p->vshader->prog, name); - if (param == NULL) return; + if (param == NULL) + return GL_FALSE; // Setting stream index and offset values attributes->streamIndex = 0; @@ -714,7 +722,8 @@ void vglBindPackedAttribLocation(GLuint prog, const GLchar *name, const GLuint n bpe = sizeof(uint8_t); break; default: - SET_GL_ERROR(GL_INVALID_ENUM) + vgl_error = GL_INVALID_ENUM; + return GL_FALSE; break; } @@ -725,6 +734,8 @@ void vglBindPackedAttribLocation(GLuint prog, const GLchar *name, const GLuint n streams->indexSource = SCE_GXM_INDEX_SOURCE_INDEX_16BIT; p->stream_num = 1; p->attr_num++; + + return GL_TRUE; } // Equivalent of glVertexAttribPointer but for sceGxm architecture diff --git a/deps/vitaGL/source/framebuffers.c b/deps/vitaGL/source/framebuffers.c index 5429ada3e3..0f96cc6fa0 100644 --- a/deps/vitaGL/source/framebuffers.c +++ b/deps/vitaGL/source/framebuffers.c @@ -89,16 +89,18 @@ void glDeleteFramebuffers(GLsizei n, GLuint *framebuffers) { #endif while (n > 0) { framebuffer *fb = (framebuffer *)framebuffers[n--]; - fb->active = 0; - if (fb->target) { - sceGxmDestroyRenderTarget(fb->target); - fb->target = NULL; - } - if (fb->depth_buffer_addr) { - vgl_mem_free(fb->depth_buffer_addr, fb->depth_buffer_mem_type); - vgl_mem_free(fb->stencil_buffer_addr, fb->stencil_buffer_mem_type); - fb->depth_buffer_addr = NULL; - fb->stencil_buffer_addr = NULL; + if (fb) { + fb->active = 0; + if (fb->target) { + sceGxmDestroyRenderTarget(fb->target); + fb->target = NULL; + } + if (fb->depth_buffer_addr) { + vgl_mempool_free(fb->depth_buffer_addr, fb->depth_buffer_mem_type); + vgl_mempool_free(fb->stencil_buffer_addr, fb->stencil_buffer_mem_type); + fb->depth_buffer_addr = NULL; + fb->stencil_buffer_addr = NULL; + } } } } @@ -187,7 +189,7 @@ void vglTexImageDepthBuffer(GLenum target) { texture_unit *tex_unit = &texture_units[server_texture_unit]; int texture2d_idx = tex_unit->tex_id; texture *tex = &vgl_textures[texture2d_idx]; - + switch (target) { case GL_TEXTURE_2D: { diff --git a/deps/vitaGL/source/gxm.c b/deps/vitaGL/source/gxm.c index d232931999..3851c9e27d 100644 --- a/deps/vitaGL/source/gxm.c +++ b/deps/vitaGL/source/gxm.c @@ -32,10 +32,10 @@ static void *fragment_usse_ring_buffer_addr; // fragment USSE ring buffer memblo static SceGxmRenderTarget *gxm_render_target; // Display render target static SceGxmColorSurface gxm_color_surfaces[DISPLAY_BUFFER_COUNT]; // Display color surfaces -static void *gxm_color_surfaces_addr[DISPLAY_BUFFER_COUNT]; // Display color surfaces memblock starting addresses +void *gxm_color_surfaces_addr[DISPLAY_BUFFER_COUNT]; // Display color surfaces memblock starting addresses static SceGxmSyncObject *gxm_sync_objects[DISPLAY_BUFFER_COUNT]; // Display sync objects -static unsigned int gxm_front_buffer_index; // Display front buffer id -static unsigned int gxm_back_buffer_index; // Display back buffer id +unsigned int gxm_front_buffer_index; // Display front buffer id +unsigned int gxm_back_buffer_index; // Display back buffer id static unsigned int gxm_scene_flags = 0; // Current gxm scene flags static void *gxm_shader_patcher_buffer_addr; // Shader PAtcher buffer memblock starting address @@ -105,7 +105,7 @@ static void display_queue_callback(const void *callbackData) { void initGxm(void) { if (gxm_initialized) return; - + // Initializing runtime shader compiler if (use_shark) { #ifdef HAVE_SHARK @@ -119,7 +119,7 @@ void initGxm(void) { #endif is_shark_online = 0; } - + // Checking if the running application is a system one SceAppMgrBudgetInfo info; info.size = sizeof(SceAppMgrBudgetInfo); @@ -197,7 +197,8 @@ void termGxmContext(void) { } #ifdef HAVE_SHARK // Shutting down runtime shader compiler - if (is_shark_online) shark_end(); + if (is_shark_online) + shark_end(); #endif } diff --git a/deps/vitaGL/source/misc.c b/deps/vitaGL/source/misc.c index b5e71277c2..3c1d41d50b 100644 --- a/deps/vitaGL/source/misc.c +++ b/deps/vitaGL/source/misc.c @@ -22,6 +22,7 @@ */ #include "shared.h" +GLboolean fast_texture_compression = GL_FALSE; // Hints for texture compression static void update_fogging_state() { if (fogging) { @@ -547,3 +548,21 @@ void glClipPlane(GLenum plane, const GLdouble *equation) { break; } } + +void glHint(GLenum target, GLenum mode) { + switch (target) { + case GL_TEXTURE_COMPRESSION_HINT: + switch (mode) { + case GL_FASTEST: + fast_texture_compression = GL_TRUE; + break; + default: + fast_texture_compression = GL_FALSE; + break; + } + break; + default: + SET_GL_ERROR(GL_INVALID_ENUM) + break; + } +} diff --git a/deps/vitaGL/source/shared.h b/deps/vitaGL/source/shared.h index f3ade4792b..5a1f41f11e 100644 --- a/deps/vitaGL/source/shared.h +++ b/deps/vitaGL/source/shared.h @@ -57,7 +57,9 @@ extern float DISPLAY_HEIGHT_FLOAT; // Display height in pixels (float) #include "state.h" #include "texture_callbacks.h" -#define SET_GL_ERROR(x) vgl_error = x; return; +#define SET_GL_ERROR(x) \ + vgl_error = x; \ + return; // Texture environment mode typedef enum texEnvMode { @@ -164,6 +166,8 @@ extern uint16_t *depth_clear_indices; // Memblock starting address for clear scr extern SceGxmVertexProgram *clear_vertex_program_patched; // Patched vertex program for clearing screen extern vector4f *clear_vertices; // Memblock starting address for clear screen vertices +extern GLboolean fast_texture_compression; // Hints for texture compression + /* gxm.c */ void initGxm(void); // Inits sceGxm void initGxmContext(void); // Inits sceGxm context diff --git a/deps/vitaGL/source/state.h b/deps/vitaGL/source/state.h index c6e4df1187..2ff6e91e05 100644 --- a/deps/vitaGL/source/state.h +++ b/deps/vitaGL/source/state.h @@ -91,12 +91,6 @@ typedef struct texture_unit { void *index_object; int env_mode; int tex_id; - SceGxmTextureFilter min_filter; - SceGxmTextureFilter mag_filter; - SceGxmTextureAddrMode u_mode; - SceGxmTextureAddrMode v_mode; - SceGxmTextureMipFilter mip_filter; - uint32_t lod_bias; } texture_unit; // Framebuffer struct diff --git a/deps/vitaGL/source/textures.c b/deps/vitaGL/source/textures.c index 8451c67669..9f6b3c350a 100644 --- a/deps/vitaGL/source/textures.c +++ b/deps/vitaGL/source/textures.c @@ -47,10 +47,18 @@ void glGenTextures(GLsizei n, GLuint *res) { // Reserving a texture and returning its id if available int i, j = 0; - for (i = 0; i < TEXTURES_NUM; i++) { + for (i = 1; i < TEXTURES_NUM; i++) { if (!(vgl_textures[i].used)) { res[j++] = i; vgl_textures[i].used = 1; + + // Resetting texture parameters to their default values + vgl_textures[i].min_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; + vgl_textures[i].mag_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; + vgl_textures[i].mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; + vgl_textures[i].u_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; + vgl_textures[i].v_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; + vgl_textures[i].lod_bias = GL_MAX_TEXTURE_LOD_BIAS; // sceGxm range is 0 - (GL_MAX_TEXTURE_LOD_BIAS*2 + 1) } if (j >= n) break; @@ -87,8 +95,21 @@ void glDeleteTextures(GLsizei n, const GLuint *gl_textures) { int j; for (j = 0; j < n; j++) { GLuint i = gl_textures[j]; - vgl_textures[i].used = 0; - gpu_free_texture(&vgl_textures[i]); + if (i > 0) { + vgl_textures[i].used = 0; + + // Resetting texture parameters to their default values + vgl_textures[i].min_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; + vgl_textures[i].mag_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; + vgl_textures[i].mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; + vgl_textures[i].u_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; + vgl_textures[i].v_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; + vgl_textures[i].lod_bias = GL_MAX_TEXTURE_LOD_BIAS; // sceGxm range is 0 - (GL_MAX_TEXTURE_LOD_BIAS*2 + 1) + + gpu_free_texture(&vgl_textures[i]); + if (i == tex_unit->tex_id) + tex_unit->tex_id = 0; + } } } @@ -293,12 +314,12 @@ void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei widt gpu_alloc_mipmaps(level, tex); // Setting texture parameters - sceGxmTextureSetUAddrMode(&tex->gxm_tex, tex_unit->u_mode); - sceGxmTextureSetVAddrMode(&tex->gxm_tex, tex_unit->v_mode); - sceGxmTextureSetMinFilter(&tex->gxm_tex, tex_unit->min_filter); - sceGxmTextureSetMagFilter(&tex->gxm_tex, tex_unit->mag_filter); - sceGxmTextureSetMipFilter(&tex->gxm_tex, tex_unit->mip_filter); - sceGxmTextureSetLodBias(&tex->gxm_tex, tex_unit->lod_bias); + sceGxmTextureSetUAddrMode(&tex->gxm_tex, tex->u_mode); + sceGxmTextureSetVAddrMode(&tex->gxm_tex, tex->v_mode); + sceGxmTextureSetMinFilter(&tex->gxm_tex, tex->min_filter); + sceGxmTextureSetMagFilter(&tex->gxm_tex, tex->mag_filter); + sceGxmTextureSetMipFilter(&tex->gxm_tex, tex->mip_filter); + sceGxmTextureSetLodBias(&tex->gxm_tex, tex->lod_bias); // Setting palette if the format requests one if (tex->valid && tex->palette_UID) @@ -557,12 +578,12 @@ void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalFormat, G gpu_alloc_compressed_texture(width, height, tex_format, imageSize, data, tex, 0, NULL); // Setting texture parameters - sceGxmTextureSetUAddrMode(&tex->gxm_tex, tex_unit->u_mode); - sceGxmTextureSetVAddrMode(&tex->gxm_tex, tex_unit->v_mode); - sceGxmTextureSetMinFilter(&tex->gxm_tex, tex_unit->min_filter); - sceGxmTextureSetMagFilter(&tex->gxm_tex, tex_unit->mag_filter); - sceGxmTextureSetMipFilter(&tex->gxm_tex, tex_unit->mip_filter); - sceGxmTextureSetLodBias(&tex->gxm_tex, tex_unit->lod_bias); + sceGxmTextureSetUAddrMode(&tex->gxm_tex, tex->u_mode); + sceGxmTextureSetVAddrMode(&tex->gxm_tex, tex->v_mode); + sceGxmTextureSetMinFilter(&tex->gxm_tex, tex->min_filter); + sceGxmTextureSetMagFilter(&tex->gxm_tex, tex->mag_filter); + sceGxmTextureSetMipFilter(&tex->gxm_tex, tex->mip_filter); + sceGxmTextureSetLodBias(&tex->gxm_tex, tex->lod_bias); break; default: @@ -612,92 +633,92 @@ void glTexParameteri(GLenum target, GLenum pname, GLint param) { case GL_TEXTURE_MIN_FILTER: // Min filter switch (param) { case GL_NEAREST: // Point - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_POINT; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_POINT; break; case GL_LINEAR: // Linear - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; break; case GL_NEAREST_MIPMAP_NEAREST: - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_POINT; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_POINT; break; case GL_LINEAR_MIPMAP_NEAREST: - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_ENABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_POINT; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_ENABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_POINT; break; case GL_NEAREST_MIPMAP_LINEAR: - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_LINEAR; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_LINEAR; break; case GL_LINEAR_MIPMAP_LINEAR: - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_ENABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_LINEAR; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_ENABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_LINEAR; break; default: SET_GL_ERROR(GL_INVALID_ENUM) break; } - sceGxmTextureSetMinFilter(&tex->gxm_tex, tex_unit->min_filter); + sceGxmTextureSetMinFilter(&tex->gxm_tex, tex->min_filter); break; case GL_TEXTURE_MAG_FILTER: // Mag Filter switch (param) { case GL_NEAREST: - tex_unit->mag_filter = SCE_GXM_TEXTURE_FILTER_POINT; + tex->mag_filter = SCE_GXM_TEXTURE_FILTER_POINT; break; case GL_LINEAR: - tex_unit->mag_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; + tex->mag_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; break; default: SET_GL_ERROR(GL_INVALID_ENUM) break; } - sceGxmTextureSetMagFilter(&tex->gxm_tex, tex_unit->mag_filter); + sceGxmTextureSetMagFilter(&tex->gxm_tex, tex->mag_filter); break; case GL_TEXTURE_WRAP_S: // U Mode switch (param) { case GL_CLAMP_TO_EDGE: // Clamp - tex_unit->u_mode = SCE_GXM_TEXTURE_ADDR_CLAMP; + tex->u_mode = SCE_GXM_TEXTURE_ADDR_CLAMP; break; case GL_REPEAT: // Repeat - tex_unit->u_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; + tex->u_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; break; case GL_MIRRORED_REPEAT: // Mirror - tex_unit->u_mode = SCE_GXM_TEXTURE_ADDR_MIRROR; + tex->u_mode = SCE_GXM_TEXTURE_ADDR_MIRROR; break; case GL_MIRROR_CLAMP_EXT: // Mirror Clamp - tex_unit->u_mode = SCE_GXM_TEXTURE_ADDR_MIRROR_CLAMP; + tex->u_mode = SCE_GXM_TEXTURE_ADDR_MIRROR_CLAMP; break; default: SET_GL_ERROR(GL_INVALID_ENUM) break; } - sceGxmTextureSetUAddrMode(&tex->gxm_tex, tex_unit->u_mode); + sceGxmTextureSetUAddrMode(&tex->gxm_tex, tex->u_mode); break; case GL_TEXTURE_WRAP_T: // V Mode switch (param) { case GL_CLAMP_TO_EDGE: // Clamp - tex_unit->v_mode = SCE_GXM_TEXTURE_ADDR_CLAMP; + tex->v_mode = SCE_GXM_TEXTURE_ADDR_CLAMP; break; case GL_REPEAT: // Repeat - tex_unit->v_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; + tex->v_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; break; case GL_MIRRORED_REPEAT: // Mirror - tex_unit->v_mode = SCE_GXM_TEXTURE_ADDR_MIRROR; + tex->v_mode = SCE_GXM_TEXTURE_ADDR_MIRROR; break; case GL_MIRROR_CLAMP_EXT: // Mirror Clamp - tex_unit->v_mode = SCE_GXM_TEXTURE_ADDR_MIRROR_CLAMP; + tex->v_mode = SCE_GXM_TEXTURE_ADDR_MIRROR_CLAMP; break; default: SET_GL_ERROR(GL_INVALID_ENUM) break; } - sceGxmTextureSetVAddrMode(&tex->gxm_tex, tex_unit->v_mode); + sceGxmTextureSetVAddrMode(&tex->gxm_tex, tex->v_mode); break; case GL_TEXTURE_LOD_BIAS: // Distant LOD bias - tex_unit->lod_bias = (uint32_t)(param + GL_MAX_TEXTURE_LOD_BIAS); - sceGxmTextureSetLodBias(&tex->gxm_tex, tex_unit->lod_bias); + tex->lod_bias = (uint32_t)(param + GL_MAX_TEXTURE_LOD_BIAS); + sceGxmTextureSetLodBias(&tex->gxm_tex, tex->lod_bias); break; default: SET_GL_ERROR(GL_INVALID_ENUM) @@ -721,64 +742,64 @@ void glTexParameterf(GLenum target, GLenum pname, GLfloat param) { switch (pname) { case GL_TEXTURE_MIN_FILTER: // Min Filter if (param == GL_NEAREST) { - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_POINT; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_POINT; } if (param == GL_LINEAR) { - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; } if (param == GL_NEAREST_MIPMAP_NEAREST) { - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_POINT; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_POINT; } if (param == GL_LINEAR_MIPMAP_NEAREST) { - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_ENABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_POINT; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_ENABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_POINT; } if (param == GL_NEAREST_MIPMAP_LINEAR) { - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_LINEAR; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_LINEAR; } if (param == GL_LINEAR_MIPMAP_LINEAR) { - tex_unit->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_ENABLED; - tex_unit->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_LINEAR; + tex->mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_ENABLED; + tex->min_filter = SCE_GXM_TEXTURE_FILTER_MIPMAP_LINEAR; } - sceGxmTextureSetMinFilter(&tex->gxm_tex, tex_unit->min_filter); - sceGxmTextureSetMipFilter(&tex->gxm_tex, tex_unit->mip_filter); + sceGxmTextureSetMinFilter(&tex->gxm_tex, tex->min_filter); + sceGxmTextureSetMipFilter(&tex->gxm_tex, tex->mip_filter); break; case GL_TEXTURE_MAG_FILTER: // Mag filter if (param == GL_NEAREST) - tex_unit->mag_filter = SCE_GXM_TEXTURE_FILTER_POINT; + tex->mag_filter = SCE_GXM_TEXTURE_FILTER_POINT; else if (param == GL_LINEAR) - tex_unit->mag_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; - sceGxmTextureSetMagFilter(&tex->gxm_tex, tex_unit->mag_filter); + tex->mag_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; + sceGxmTextureSetMagFilter(&tex->gxm_tex, tex->mag_filter); break; case GL_TEXTURE_WRAP_S: // U Mode if (param == GL_CLAMP_TO_EDGE) - tex_unit->u_mode = SCE_GXM_TEXTURE_ADDR_CLAMP; // Clamp + tex->u_mode = SCE_GXM_TEXTURE_ADDR_CLAMP; // Clamp else if (param == GL_REPEAT) - tex_unit->u_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; // Repeat + tex->u_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; // Repeat else if (param == GL_MIRRORED_REPEAT) - tex_unit->u_mode = SCE_GXM_TEXTURE_ADDR_MIRROR; // Mirror + tex->u_mode = SCE_GXM_TEXTURE_ADDR_MIRROR; // Mirror else if (param == GL_MIRROR_CLAMP_EXT) - tex_unit->u_mode = SCE_GXM_TEXTURE_ADDR_MIRROR_CLAMP; // Mirror Clamp - sceGxmTextureSetUAddrMode(&tex->gxm_tex, tex_unit->u_mode); + tex->u_mode = SCE_GXM_TEXTURE_ADDR_MIRROR_CLAMP; // Mirror Clamp + sceGxmTextureSetUAddrMode(&tex->gxm_tex, tex->u_mode); break; case GL_TEXTURE_WRAP_T: // V Mode if (param == GL_CLAMP_TO_EDGE) - tex_unit->v_mode = SCE_GXM_TEXTURE_ADDR_CLAMP; // Clamp + tex->v_mode = SCE_GXM_TEXTURE_ADDR_CLAMP; // Clamp else if (param == GL_REPEAT) - tex_unit->v_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; // Repeat + tex->v_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; // Repeat else if (param == GL_MIRRORED_REPEAT) - tex_unit->v_mode = SCE_GXM_TEXTURE_ADDR_MIRROR; // Mirror + tex->v_mode = SCE_GXM_TEXTURE_ADDR_MIRROR; // Mirror else if (param == GL_MIRROR_CLAMP_EXT) - tex_unit->v_mode = SCE_GXM_TEXTURE_ADDR_MIRROR_CLAMP; // Mirror Clamp - sceGxmTextureSetVAddrMode(&tex->gxm_tex, tex_unit->v_mode); + tex->v_mode = SCE_GXM_TEXTURE_ADDR_MIRROR_CLAMP; // Mirror Clamp + sceGxmTextureSetVAddrMode(&tex->gxm_tex, tex->v_mode); break; case GL_TEXTURE_LOD_BIAS: // Distant LOD bias - tex_unit->lod_bias = (uint32_t)(param + GL_MAX_TEXTURE_LOD_BIAS); - sceGxmTextureSetLodBias(&tex->gxm_tex, tex_unit->lod_bias); + tex->lod_bias = (uint32_t)(param + GL_MAX_TEXTURE_LOD_BIAS); + sceGxmTextureSetLodBias(&tex->gxm_tex, tex->lod_bias); break; default: SET_GL_ERROR(GL_INVALID_ENUM) @@ -820,12 +841,12 @@ void glGenerateMipmap(GLenum target) { gpu_alloc_mipmaps(-1, tex); // Setting texture parameters - sceGxmTextureSetUAddrMode(&tex->gxm_tex, tex_unit->u_mode); - sceGxmTextureSetVAddrMode(&tex->gxm_tex, tex_unit->v_mode); - sceGxmTextureSetMinFilter(&tex->gxm_tex, tex_unit->min_filter); - sceGxmTextureSetMagFilter(&tex->gxm_tex, tex_unit->mag_filter); - sceGxmTextureSetMipFilter(&tex->gxm_tex, tex_unit->mip_filter); - sceGxmTextureSetLodBias(&tex->gxm_tex, tex_unit->lod_bias); + sceGxmTextureSetUAddrMode(&tex->gxm_tex, tex->u_mode); + sceGxmTextureSetVAddrMode(&tex->gxm_tex, tex->v_mode); + sceGxmTextureSetMinFilter(&tex->gxm_tex, tex->min_filter); + sceGxmTextureSetMagFilter(&tex->gxm_tex, tex->mag_filter); + sceGxmTextureSetMipFilter(&tex->gxm_tex, tex->mip_filter); + sceGxmTextureSetLodBias(&tex->gxm_tex, tex->lod_bias); break; default: diff --git a/deps/vitaGL/source/utils/gpu_utils.c b/deps/vitaGL/source/utils/gpu_utils.c index 67d7e436b0..a8159849f2 100644 --- a/deps/vitaGL/source/utils/gpu_utils.c +++ b/deps/vitaGL/source/utils/gpu_utils.c @@ -81,7 +81,7 @@ void dxt_compress(uint8_t *dst, uint8_t *src, int w, int h, int isdxt5) { if (offs_y * 4 >= w) continue; extract_block(src + offs_y * 16 + offs_x * w * 16, w, block); - stb_compress_dxt_block(dst, block, isdxt5, STB_DXT_HIGHQUAL); + stb_compress_dxt_block(dst, block, isdxt5, fast_texture_compression ? STB_DXT_NORMAL : STB_DXT_HIGHQUAL); dst += isdxt5 ? 16 : 8; } } @@ -369,30 +369,31 @@ void gpu_alloc_compressed_texture(uint32_t w, uint32_t h, SceGxmTextureFormat fo // Allocating texture data buffer void *texture_data = gpu_alloc_mapped(tex_size, &tex->mtype); - // NOTE: Supports only GL_RGBA source format for now - // Initializing texture data buffer if (texture_data != NULL) { - // Initializing texture data buffer if (data != NULL) { if (read_cb != NULL) { - //void *tmp = malloc(w * h * 4); - //void *tmp2 = malloc(tex_size); - /*int i, j; - uint8_t *src = (uint8_t *)data; - uint32_t *dst = (uint32_t*)tmp; - for (i = 0; i < h * w; i++) { - uint32_t clr = read_cb(src); - writeRGBA(dst++, src); - src += src_bpp; - }*/ + void *temp = (void *)data; + + // stb_dxt expects input as RGBA8888, so we convert input texture if necessary + if (read_cb != readRGBA) { + temp = malloc(w * h * 4); + uint8_t *src = (uint8_t *)data; + uint32_t *dst = (uint32_t *)temp; + int i; + for (i = 0; i < w * h; i++) { + uint32_t clr = read_cb(src); + writeRGBA(dst++, clr); + src += src_bpp; + } + } // Performing swizzling and DXT compression - dxt_compress(texture_data, (void *)data, w, h, alignment == 16); + dxt_compress(texture_data, temp, w, h, alignment == 16); - //swizzle(texture_data, tmp2, w, h, alignment << 3); - //free(tmp); - //free(tmp2); + // Freeing temporary data if necessary + if (read_cb != readRGBA) + free(temp); } else { // Perform swizzling if necessary. switch (format) { diff --git a/deps/vitaGL/source/utils/gpu_utils.h b/deps/vitaGL/source/utils/gpu_utils.h index 51d59a0b8d..33d9a965ed 100644 --- a/deps/vitaGL/source/utils/gpu_utils.h +++ b/deps/vitaGL/source/utils/gpu_utils.h @@ -40,6 +40,12 @@ typedef struct texture { uint8_t valid; uint32_t type; void (*write_cb)(void *, uint32_t); + SceGxmTextureFilter min_filter; + SceGxmTextureFilter mag_filter; + SceGxmTextureAddrMode u_mode; + SceGxmTextureAddrMode v_mode; + SceGxmTextureMipFilter mip_filter; + uint32_t lod_bias; } texture; // Palette object struct diff --git a/deps/vitaGL/source/vitaGL.c b/deps/vitaGL/source/vitaGL.c index bd9bd8a370..68575e671c 100644 --- a/deps/vitaGL/source/vitaGL.c +++ b/deps/vitaGL/source/vitaGL.c @@ -679,12 +679,6 @@ void vglInitWithCustomSizes(uint32_t gpu_pool_size, int width, int height, int r texture_units[i].env_mode = MODULATE; texture_units[i].tex_id = 0; texture_units[i].enabled = GL_FALSE; - texture_units[i].min_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; - texture_units[i].mag_filter = SCE_GXM_TEXTURE_FILTER_LINEAR; - texture_units[i].mip_filter = SCE_GXM_TEXTURE_MIP_FILTER_DISABLED; - texture_units[i].u_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; - texture_units[i].v_mode = SCE_GXM_TEXTURE_ADDR_REPEAT; - texture_units[i].lod_bias = GL_MAX_TEXTURE_LOD_BIAS; // sceGxm range is 0 - (GL_MAX_TEXTURE_LOD_BIAS*2 + 1) } // Init texture slots @@ -711,6 +705,9 @@ void vglInitWithCustomSizes(uint32_t gpu_pool_size, int width, int height, int r // Mapping newlib heap into sceGxm sceGxmMapMemory(addr, _newlib_heap_size, SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE); + + // Allocating default texture object + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); } void vglInitExtended(uint32_t gpu_pool_size, int width, int height, int ram_threshold, SceGxmMultisampleMode msaa) { diff --git a/deps/vitaGL/source/vitaGL.h b/deps/vitaGL/source/vitaGL.h index 1cb602d10b..b739267308 100644 --- a/deps/vitaGL/source/vitaGL.h +++ b/deps/vitaGL/source/vitaGL.h @@ -127,6 +127,9 @@ extern "C" { #define GL_DEPTH_BITS 0x0D56 #define GL_STENCIL_BITS 0x0D57 #define GL_TEXTURE_2D 0x0DE1 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 #define GL_BYTE 0x1400 #define GL_UNSIGNED_BYTE 0x1401 #define GL_SHORT 0x1402 @@ -238,6 +241,7 @@ extern "C" { #define GL_TEXTURE30 0x84DE #define GL_TEXTURE31 0x84DF #define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_INCR_WRAP 0x8507 #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 @@ -356,6 +360,7 @@ void glGetShaderInfoLog(GLuint handle, GLsizei maxLength, GLsizei *length, GLcha void glGetShaderiv(GLuint handle, GLenum pname, GLint *params); const GLubyte *glGetString(GLenum name); GLint glGetUniformLocation(GLuint prog, const GLchar *name); +void glHint(GLenum target, GLenum mode); GLboolean glIsEnabled(GLenum cap); void glLineWidth(GLfloat width); void glLinkProgram(GLuint progr); @@ -425,7 +430,7 @@ void vglVertexPointerMapped(const GLvoid *pointer); // VGL_EXT_gxp_shaders extension implementation void vglBindAttribLocation(GLuint prog, GLuint index, const GLchar *name, const GLuint num, const GLenum type); -void vglBindPackedAttribLocation(GLuint prog, const GLchar *name, const GLuint num, const GLenum type, GLuint offset, GLint stride); +GLint vglBindPackedAttribLocation(GLuint prog, const GLchar *name, const GLuint num, const GLenum type, GLuint offset, GLint stride); void vglVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint count, const GLvoid *pointer); void vglVertexAttribPointerMapped(GLuint index, const GLvoid *pointer);