From b534fcc1bcf3ffd719c7ed003ab707aa00a0447c Mon Sep 17 00:00:00 2001 From: "gregory.hainaut" Date: Fri, 8 Jun 2012 18:14:47 +0000 Subject: [PATCH] zzogl: * add a script to run cg compiler on glsl file: + handy to check the syntax + output the asm of the shader - unfortunately don't support latest glsl construct but better than nothing * really delete resources before context destruction * wanted to play with opengl3 timer for profiling but not conclusive, just keeping code around for future use git-svn-id: http://pcsx2.googlecode.com/svn/trunk@5278 96395faa-99c1-11dd-bbfe-3dabce05a288 --- bin/launch_pcsx2_linux.sh | 13 -- linux_various/validate_glsl.sh | 127 ++++++++++++++++++ plugins/zzogl-pg/opengl/GSmain.cpp | 2 +- plugins/zzogl-pg/opengl/Profile_gl3.cpp | 82 +++++++++++ plugins/zzogl-pg/opengl/Profile_gl3.h | 57 ++++++++ plugins/zzogl-pg/opengl/ZZoglShadersGLSL4.cpp | 22 +-- plugins/zzogl-pg/opengl/ps2hw_gl4.glsl | 16 +-- 7 files changed, 281 insertions(+), 38 deletions(-) create mode 100755 linux_various/validate_glsl.sh create mode 100644 plugins/zzogl-pg/opengl/Profile_gl3.cpp create mode 100644 plugins/zzogl-pg/opengl/Profile_gl3.h diff --git a/bin/launch_pcsx2_linux.sh b/bin/launch_pcsx2_linux.sh index afdd7a5160..ac6ae783d7 100755 --- a/bin/launch_pcsx2_linux.sh +++ b/bin/launch_pcsx2_linux.sh @@ -32,19 +32,6 @@ PWD_old=$PWD # Go to the script directory cd `dirname $current_script` -# Setup LD_PRELOAD to work-around issue 1003 -SDL_SO=`pwd`/plugins/libpcsx2_SDL.so -if [ -e "$SDL_SO" ] -then - echo "INFO: LD_PRELOAD $SDL_SO" - if [ -n "$LD_PRELOAD" ] - then - LD_PRELOAD="$SDL_SO:$LD_PRELOAD" - else - LD_PRELOAD="$SDL_SO" - fi -fi - # Launch PCSX2 if [ -x pcsx2 ] then diff --git a/linux_various/validate_glsl.sh b/linux_various/validate_glsl.sh new file mode 100755 index 0000000000..8740159580 --- /dev/null +++ b/linux_various/validate_glsl.sh @@ -0,0 +1,127 @@ +#!/bin/sh +# copyright (c) 2011 Gregory Hainaut +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +INPUT=0 +MACRO="" +ENTRY="-noentry" +TEST=/tmp/test.glsl +GL_VERSION=330 +NOFRAG=0 +NOVERT=0 +# VERT="cgc -oglsl -profile glslv -po version=$GL_VERSION" +# FRAG="cgc -oglsl -profile glslf -po version=$GL_VERSION" +# Uniform buffer not supported on glsl ... +VERT="cgc -oglsl -profile vp40" +FRAG="cgc -oglsl -profile fp40" + +###################################################### +# Options +###################################################### +help() +{ + cat < : input glsl file (mandatory) + --macro : set a macro. Can be repeated + --entry : set an entry point. Note: print the ASM output of the program + --test_ZZ : test of zzogl glsl file + --test_dx : test of gsdx glsl file + --nofrag : disable fragment processing + --novert : disable vertex processing +EOF + exit +} + +while [ -n "$1" ]; do +case $1 in + --help|--h) help;shift 1;; + --input|--i) INPUT=$2; shift 2;; + --macro|--m) MACRO="${MACRO}#define $2 $3\n"; shift 3;; + --entry|--e) ENTRY="-entry $2";shift 2;; + --test_ZZ ) TEST_ZZOGL=1; shift 1;; + --test_dx ) TEST_GSDX=1; shift 1;; + --nofrag) NOFRAG=1; shift 1;; + --novert) NOVERT=1; shift 1;; + + --*) echo "ERROR: $1 option does not exists. Use -h for help";exit 1;; + *) break;; +esac +done + +if [ "$INPUT" = "0" ] ; then + help +fi + +###################################################### +# Functions +###################################################### +head() +{ + \rm -f $TEST + touch $TEST + echo "#version $GL_VERSION\n" >> $TEST +} + +tail() +{ + cat $INPUT >> $TEST + # Some layout syntax (420) are not supported + # so I remove them (a bit overkill) + #sed -i -e 's/layout(.*)//' $TEST + sed -i -e 's/layout(binding.*)//' $TEST + sed -i -e 's/layout(location.*)//' $TEST + sed -i -e 's/, binding.*)/)/' $TEST +} + +vertex_test() +{ + head + echo "#define VERTEX_SHADER 1" >> $TEST + echo $MACRO >> $TEST + tail + + echo "Vertex check with macro : $MACRO" + $VERT $ENTRY $TEST + echo "" +} + +fragment_test() +{ + head + echo "#define FRAGMENT_SHADER 1" >> $TEST + echo "$MACRO" >> $TEST + echo "Fragment check with macro : $MACRO" + + tail + $FRAG $ENTRY $TEST + echo "" +} + +###################################################### +# Main +###################################################### + +if [ "$TEST_ZZOGL" = '1' ] ; then + ./test_shader.sh --input $INPUT --novert --m TEST_AEM 1 + ./test_shader.sh --input $INPUT --novert --m REGION_REPEAT 1 + ./test_shader.sh --input $INPUT --novert --m EXACT_COLOR 1 + ./test_shader.sh --input $INPUT --m WRITE_DEPTH 1 + ./test_shader.sh --input $INPUT +elif [ "$TEST_GSDX" = '1' ] ; then + echo "not yet implemented" +else + if [ "$NOVERT" = '0' ] ; then vertex_test; fi + if [ "$NOFRAG" = '0' ] ; then fragment_test; fi +fi diff --git a/plugins/zzogl-pg/opengl/GSmain.cpp b/plugins/zzogl-pg/opengl/GSmain.cpp index 19f6ab4164..99af8e52cb 100644 --- a/plugins/zzogl-pg/opengl/GSmain.cpp +++ b/plugins/zzogl-pg/opengl/GSmain.cpp @@ -349,9 +349,9 @@ EXPORT_C_(void) GSclose() { FUNCLOG - ZZDestroy(); // Clean shader. Must be done before the context is delete ZZshExitCleaning(); + ZZDestroy(); GLWin.CloseWindow(); diff --git a/plugins/zzogl-pg/opengl/Profile_gl3.cpp b/plugins/zzogl-pg/opengl/Profile_gl3.cpp new file mode 100644 index 0000000000..5aeb6fb00a --- /dev/null +++ b/plugins/zzogl-pg/opengl/Profile_gl3.cpp @@ -0,0 +1,82 @@ +/* ZZ Open GL graphics plugin + * Copyright (c)2009-2012 zeydlitz@gmail.com, arcum42@gmail.com, gregory.hainaut@gmail.com + * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "Profile_gl3.h" +GPU_Profile GPU_Timer; + +void GPU_Profile::dump(bool flush) +{ + u32 high_limit; + if (flush) high_limit = 1; + else high_limit = 1000; + + while (datas.size() > high_limit) { + ProfileInfo data_start = datas.front(); + datas.pop_front(); + ProfileInfo data_stop = datas.front(); + datas.pop_front(); + + u32 gpu_time = read_diff_timers(data_start.timer, data_stop.timer); + +#ifdef ENABLE_MARKER + if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, format("Time %6dus", gpu_time).c_str()); +#else + fprintf(stderr, "Frame %d (%d): %6dus\n", data_start.frame, data_start.draw, gpu_time); +#endif + } +} + +void GPU_Profile::create_timer() +{ + u32 timer = 0; +#ifdef GLSL4_API + glGenQueries(1, &timer); + glQueryCounter(timer, GL_TIMESTAMP); +#endif + datas.push_back(ProfileInfo(timer, frame, draw)); + +#ifdef ENABLE_MARKER + dump(true); +#endif +} + +u32 GPU_Profile::read_diff_timers(u32 start_timer, u32 stop_timer) +{ +#ifdef GLSL4_API + if(!start_timer || !stop_timer) return -1; + + int stopTimerAvailable = 0; + while (!stopTimerAvailable) + glGetQueryObjectiv(stop_timer, GL_QUERY_RESULT_AVAILABLE, &stopTimerAvailable); + + u64 start, stop = 0; + // Note: timers have a precision of the ns, so you need 64 bits value to avoid overflow! + glGetQueryObjectui64v(start_timer, GL_QUERY_RESULT, &start); + glGetQueryObjectui64v(stop_timer, GL_QUERY_RESULT, &stop); + + // delete timer + glDeleteQueries(1, &start_timer); + glDeleteQueries(1, &stop_timer); + + return (stop-start)/1000; +#else + return 0; +#endif +} + diff --git a/plugins/zzogl-pg/opengl/Profile_gl3.h b/plugins/zzogl-pg/opengl/Profile_gl3.h new file mode 100644 index 0000000000..3e4fdc144b --- /dev/null +++ b/plugins/zzogl-pg/opengl/Profile_gl3.h @@ -0,0 +1,57 @@ +/* ZZ Open GL graphics plugin + * Copyright (c)2009-2012 zeydlitz@gmail.com, arcum42@gmail.com, gregory.hainaut@gmail.com + * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "Util.h" + +#ifndef _PROFILE_GL3_H_ +#define _PROFILE_GL3_H_ + +#define ENABLE_MARKER // Fire some marker for opengl Debugger (apitrace, gdebugger) + +class GPU_Profile { + struct ProfileInfo { + u32 timer; + u32 frame; + u32 draw; + + ProfileInfo(u32 timer, u32 frame, u32 draw) : timer(timer), frame(frame), draw(draw) {} + ProfileInfo(u32 timer) : timer(timer), frame(0), draw(0) {} + }; + + std::list datas; + u32 frame; + u32 draw; + + + public: + GPU_Profile() : frame(0), draw(0) { + datas.clear(); + } + + void inc_draw() { draw++;} + void inc_frame() { frame++;} + + void create_timer(); + u32 read_diff_timers(u32 start_timer, u32 stop_timer); + + void dump(bool flush = false); +}; +extern GPU_Profile GPU_Timer; + +#endif diff --git a/plugins/zzogl-pg/opengl/ZZoglShadersGLSL4.cpp b/plugins/zzogl-pg/opengl/ZZoglShadersGLSL4.cpp index d1e3880006..5b9ab9c89d 100644 --- a/plugins/zzogl-pg/opengl/ZZoglShadersGLSL4.cpp +++ b/plugins/zzogl-pg/opengl/ZZoglShadersGLSL4.cpp @@ -243,9 +243,7 @@ void ZZshGLEnableProfile() { // The same function for texture, also to cgGLEnable void ZZshGLSetTextureParameter(ZZshParameter param, GLuint texobj, const char* name) { #ifdef ENABLE_MARKER - char* debug = new char[100]; - sprintf(debug, "CS: texture %d, param %d", texobj, param); - if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, debug); + if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, format("CS: texture %d, param %d", texobj, param).c_str() ); #endif g_cs.set_texture(param, texobj); @@ -254,9 +252,7 @@ void ZZshGLSetTextureParameter(ZZshParameter param, GLuint texobj, const char* n void ZZshGLSetTextureParameter(ZZshShaderLink prog, ZZshParameter param, GLuint texobj, const char* name) { FRAGMENTSHADER* shader = (FRAGMENTSHADER*)prog.link; #ifdef ENABLE_MARKER - char* debug = new char[100]; - sprintf(debug, "FS(%d):texture %d, param %d", shader->program, texobj, param); - if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, debug); + if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, format("FS(%d):texture %d, param %d", shader->program, texobj, param).c_str() ); #endif shader->set_texture(param, texobj); @@ -276,9 +272,7 @@ void ZZshSetParameter4fv(ZZshShaderLink& prog, ZZshParameter param, const float* dirty_vertex_buffer = true; } #ifdef ENABLE_MARKER - char* debug = new char[100]; - sprintf(debug, "prog: uniform (%s) (%f)", name, *v); - if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, debug); + if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, format("prog: uniform (%s) (%f)", name, *v).c_str() ); #endif } @@ -286,9 +280,7 @@ void ZZshSetParameter4fv(ZZshParameter param, const float* v, const char* name) g_cs.ZZshSetParameter4fv(param, v); dirty_common_buffer = true; #ifdef ENABLE_MARKER - char* debug = new char[100]; - sprintf(debug, "CS: uniform (%s) (%f)", name, *v); - if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, debug); + if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, format("CS: uniform (%s) (%f)", name, *v).c_str() ); #endif } @@ -380,7 +372,7 @@ void ZZshSetVertexShader(ZZshShaderLink prog) { if (vs->program != g_current_vs) { glUseProgramStages(s_pipeline, GL_VERTEX_SHADER_BIT, vs->program); - g_current_ps = vs->program; + g_current_vs = vs->program; } } @@ -452,9 +444,7 @@ void PutParametersInProgram(VERTEXSHADER* vs, FRAGMENTSHADER* ps) { } #ifdef ENABLE_MARKER - char* debug = new char[100]; - sprintf(debug, "FS(%d): enable texture", ps->program); - if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, debug); + if (GLEW_GREMEDY_string_marker) glStringMarkerGREMEDY(0, format("FS(%d): enable texture", ps->program).c_str() ); #endif g_cs.enable_texture(); diff --git a/plugins/zzogl-pg/opengl/ps2hw_gl4.glsl b/plugins/zzogl-pg/opengl/ps2hw_gl4.glsl index a98620cf0c..889f482067 100644 --- a/plugins/zzogl-pg/opengl/ps2hw_gl4.glsl +++ b/plugins/zzogl-pg/opengl/ps2hw_gl4.glsl @@ -21,7 +21,7 @@ // divides by z for every pixel, instead of in vertex shader // fixes kh textures -#extension ARB_texture_rectangle: require +#extension GL_ARB_texture_rectangle: require #extension GL_ARB_shading_language_420pack: require #extension GL_ARB_separate_shader_objects : require @@ -565,25 +565,25 @@ half4 ps2FinalColor(half4 col) #ifdef FRAGMENT_SHADER // This is code only for FRAGMENTS (pixel shader) #ifdef WRITE_DEPTH -void write_depth_target(vec4 z) +void write_depth_target() { - FragData1 = z; + FragData1 = PSin.z; } #else -void write_depth_target(vec4 z) { } +void write_depth_target() { } #endif void RegularPS() { // whenever outputting depth, make sure to mult by 255/256 and 1 FragData0 = ps2FinalColor(PSin.color); - write_depth_target(PSin.z); + write_depth_target(); } #define DECL_TEXPS(num, bit) \ void Texture##num##bit##PS() \ { \ FragData0 = ps2FinalColor(ps2CalcShade(ps2shade##num##bit(PSin.tex), PSin.color)); \ - write_depth_target(PSin.z); \ + write_depth_target(); \ } #define DECL_TEXPS_(num) \ @@ -605,7 +605,7 @@ void RegularFogPS() { c.xyz = mix(g_fFogColor.xyz, PSin.color.xyz, vec3(PSin.fog)); c.w = PSin.color.w; FragData0 = ps2FinalColor(c); - write_depth_target(PSin.z); + write_depth_target(); } #define DECL_TEXFOGPS(num, bit) \ @@ -614,7 +614,7 @@ void TextureFog##num##bit##PS() \ half4 c = ps2CalcShade(ps2shade##num##bit(PSin.tex), PSin.color); \ c.xyz = mix(g_fFogColor.xyz, c.xyz, vec3(PSin.fog)); \ FragData0 = ps2FinalColor(c); \ - write_depth_target(PSin.z); \ + write_depth_target(); \ } #define DECL_TEXFOGPS_(num) \