diff --git a/Makefile b/Makefile index 3be779df9..5cdf427aa 100644 --- a/Makefile +++ b/Makefile @@ -104,8 +104,8 @@ ifeq ($(platform), unix) fpic := -fPIC SHARED := -shared -Wl,--version-script=$(SRC_DIR)/citra_libretro/link.T -Wl,--no-undefined LIBS +=-lpthread -lGL -ldl - HAVE_FFMPEG = 1 - HAVE_FFMPEG_STATIC = 1 + #HAVE_FFMPEG = 1 + #HAVE_FFMPEG_STATIC = 1 ifeq ($(HAVE_FFMPEG_STATIC), 1) LIBS += $(EXTERNALS_DIR)/ffmpeg/libavcodec/libavcodec.a $(EXTERNALS_DIR)/ffmpeg/libavutil/libavutil.a else @@ -356,7 +356,7 @@ DYNARMICFLAGS += -D__LIBRETRO__ $(fpic) $(DEFINES) $(DYNARMICINCFLAGS) $(INCFLAG CXXFLAGS += -D__LIBRETRO__ $(fpic) $(DEFINES) $(INCFLAGS) $(INCFLAGS_PLATFORM) OBJOUT = -o -LINKOUT = -o +LINKOUT = -o ifneq (,$(findstring msvc,$(platform))) OBJOUT = -Fo @@ -418,20 +418,39 @@ $(foreach p,$(OBJECTS),$(if $(findstring $(EXTERNALS_DIR)/dynarmic/src,$p),$p,)) clean: rm -f $(OBJECTS) $(TARGET) + rm -rf $(SRC_DIR)/video_core/shaders ifeq ($(HAVE_FFMPEG_STATIC), 1) cd $(EXTERNALS_DIR)/ffmpeg && $(MAKE) clean endif +GLSLANG := glslang +ifeq (, $(shell which $(GLSLANG))) +GLSLANG := glslangValidator +ifeq (, $(shell which $(GLSLANG))) +$(error Required program `glslang` (or `glslangValidator`) not found.) +endif +endif + shaders: $(SHADER_FILES) - mkdir -p $(SRC_DIR)/video_core/shaders for SHADER_FILE in $^; do \ + OUT_DIR=$$(dirname "$(SRC_DIR)/video_core/shaders/$$SHADER_FILE"); \ FILENAME=$$(basename "$$SHADER_FILE"); \ - SHADER_NAME=$$(echo "$$FILENAME" | sed -e "s/\./_/g"); \ - rm -f $(SRC_DIR)/video_core/shaders/$$FILENAME; \ - echo "#pragma once" >> $(SRC_DIR)/video_core/shaders/$$FILENAME; \ - echo "constexpr std::string_view $$SHADER_NAME = R\"(" >> $(SRC_DIR)/video_core/shaders/$$FILENAME; \ - cat $$SHADER_FILE >> $(SRC_DIR)/video_core/shaders/$$FILENAME; \ - echo ")\";" >> $(SRC_DIR)/video_core/shaders/$$FILENAME; \ + SHADER_NAME=$$(echo "$$FILENAME" | sed -e 's/\./_/g'); \ + OUT_FILE="$$OUT_DIR/$$SHADER_NAME"; \ + if [ "$$FILENAME" = "$${FILENAME#vulkan}" ]; then \ + SHADER_CONTENT=$$(cat $$SHADER_FILE | sed -e 's/"/'\''/g'); \ + SHADER_CONTENT=$$(echo "$$SHADER_CONTENT" | sed -e 's/.*/"&'\\\\\\\\'n"/'); \ + mkdir -p "$$OUT_DIR"; \ + echo "$$SHADER_CONTENT" > $$OUT_FILE; \ + cat $(SRC_DIR)/video_core/host_shaders/source_shader.h.in | sed -e "s/@CONTENTS_NAME@/$$(echo $$SHADER_NAME | tr '[a-z]' '[A-Z]')/" > $$OUT_FILE.h; \ + sed -i -e "/@CONTENTS@/ { r $$OUT_FILE" -e "d }" $$OUT_FILE.h; \ + rm -f $$OUT_FILE; \ + fi; \ + if [ "$$FILENAME" = "$${FILENAME#opengl}" ]; then \ + SHADER_NAME=$${SHADER_NAME}_spv; \ + $(GLSLANG) --target-env vulkan1.1 --glsl-version 450 -Dgl_VertexID=gl_VertexIndex \ + --variable-name $$(echo $$SHADER_NAME | tr '[a-z]' '[A-Z]') -o $${OUT_FILE}_spv.h $$SHADER_FILE; \ + fi; \ done diff --git a/Makefile.common b/Makefile.common index 0cc5cf6c4..9f39324cb 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1,5 +1,6 @@ INCFLAGS := -I$(SRC_DIR) \ -I$(SRC_DIR)/video_core \ + -I$(SRC_DIR)/video_core/shaders/src \ -I$(EXTERNALS_DIR) \ -I$(EXTERNALS_DIR)/dynarmic/include \ -I$(EXTERNALS_DIR)/enet/include \ @@ -733,14 +734,24 @@ SOURCES_CXX += $(SRC_DIR)/citra_libretro/emu_window/libretro_window.cpp \ $(SRC_DIR)/citra_libretro/core_settings.cpp \ $(SRC_DIR)/citra_libretro/libretro_logger.cpp -SHADER_FILES += $(SRC_DIR)/video_core/renderer_opengl/depth_to_color.vert \ - $(SRC_DIR)/video_core/renderer_opengl/depth_to_color.frag \ - $(SRC_DIR)/video_core/renderer_opengl/ds_to_color.frag \ - $(SRC_DIR)/video_core/renderer_opengl/texture_filters/anime4k/refine.frag \ - $(SRC_DIR)/video_core/renderer_opengl/texture_filters/anime4k/x_gradient.frag \ - $(SRC_DIR)/video_core/renderer_opengl/texture_filters/anime4k/y_gradient.frag \ - $(SRC_DIR)/video_core/renderer_opengl/texture_filters/bicubic/bicubic.frag \ - $(SRC_DIR)/video_core/renderer_opengl/texture_filters/scale_force/scale_force.frag \ - $(SRC_DIR)/video_core/renderer_opengl/texture_filters/tex_coord.vert \ - $(SRC_DIR)/video_core/renderer_opengl/texture_filters/xbrz/xbrz_freescale.frag \ - $(SRC_DIR)/video_core/renderer_opengl/texture_filters/xbrz/xbrz_freescale.vert +SHADER_FILES += $(SRC_DIR)/video_core/host_shaders/format_reinterpreter/d24s8_to_rgba8.frag \ + $(SRC_DIR)/video_core/host_shaders/format_reinterpreter/rgba4_to_rgb5a1.frag \ + $(SRC_DIR)/video_core/host_shaders/format_reinterpreter/vulkan_d24s8_to_rgba8.comp \ + $(SRC_DIR)/video_core/host_shaders/texture_filtering/bicubic.frag \ + $(SRC_DIR)/video_core/host_shaders/texture_filtering/refine.frag \ + $(SRC_DIR)/video_core/host_shaders/texture_filtering/scale_force.frag \ + $(SRC_DIR)/video_core/host_shaders/texture_filtering/xbrz_freescale.frag \ + $(SRC_DIR)/video_core/host_shaders/texture_filtering/mmpx.frag \ + $(SRC_DIR)/video_core/host_shaders/texture_filtering/x_gradient.frag \ + $(SRC_DIR)/video_core/host_shaders/texture_filtering/y_gradient.frag \ + $(SRC_DIR)/video_core/host_shaders/full_screen_triangle.vert \ + $(SRC_DIR)/video_core/host_shaders/opengl_present.frag \ + $(SRC_DIR)/video_core/host_shaders/opengl_present.vert \ + $(SRC_DIR)/video_core/host_shaders/opengl_present_anaglyph.frag \ + $(SRC_DIR)/video_core/host_shaders/opengl_present_interlaced.frag \ + $(SRC_DIR)/video_core/host_shaders/vulkan_depth_to_buffer.comp \ + $(SRC_DIR)/video_core/host_shaders/vulkan_present.frag \ + $(SRC_DIR)/video_core/host_shaders/vulkan_present.vert \ + $(SRC_DIR)/video_core/host_shaders/vulkan_present_anaglyph.frag \ + $(SRC_DIR)/video_core/host_shaders/vulkan_present_interlaced.frag \ + $(SRC_DIR)/video_core/host_shaders/vulkan_blit_depth_stencil.frag