Skip to content

[WIP] Add vulkan renderer #710

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 135 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ endif
ifndef BUILD_RENDERER_OPENGL2
BUILD_RENDERER_OPENGL2=
endif
ifndef BUILD_RENDERER_VULKAN
BUILD_RENDERER_VULKAN=
endif
ifndef BUILD_AUTOUPDATER # DON'T build unless you mean to!
BUILD_AUTOUPDATER=0
endif
Expand Down Expand Up @@ -264,6 +267,7 @@ SDIR=$(MOUNT_DIR)/server
RCOMMONDIR=$(MOUNT_DIR)/renderercommon
RGL1DIR=$(MOUNT_DIR)/renderergl1
RGL2DIR=$(MOUNT_DIR)/renderergl2
RVULKANDIR=$(MOUNT_DIR)/renderervk
CMDIR=$(MOUNT_DIR)/qcommon
SDLDIR=$(MOUNT_DIR)/sdl
ASMDIR=$(MOUNT_DIR)/asm
Expand Down Expand Up @@ -1168,13 +1172,19 @@ ifneq ($(BUILD_CLIENT),0)
ifneq ($(BUILD_RENDERER_OPENGL2),0)
TARGETS += $(B)/renderer_opengl2_$(SHLIBNAME)
endif
ifneq ($(BUILD_RENDERER_VULKAN),0)
TARGETS += $(B)/renderer_vulkan_$(SHLIBNAME)
endif
else
ifneq ($(BUILD_RENDERER_OPENGL1),0)
TARGETS += $(B)/$(CLIENTBIN)$(FULLBINEXT)
endif
ifneq ($(BUILD_RENDERER_OPENGL2),0)
TARGETS += $(B)/$(CLIENTBIN)_opengl2$(FULLBINEXT)
endif
ifneq ($(BUILD_RENDERER_VULKAN),0)
TARGETS += $(B)/$(CLIENTBIN)_vulkan$(FULLBINEXT)
endif
endif
endif

Expand Down Expand Up @@ -1642,6 +1652,7 @@ makedirs:
@$(MKDIR) $(B)/renderergl1
@$(MKDIR) $(B)/renderergl2
@$(MKDIR) $(B)/renderergl2/glsl
@$(MKDIR) $(B)/renderervk
@$(MKDIR) $(B)/ded
@$(MKDIR) $(B)/$(BASEGAME)/cgame
@$(MKDIR) $(B)/$(BASEGAME)/game
Expand Down Expand Up @@ -1997,6 +2008,88 @@ else
endif
endif

Q3VKOBJ = \
$(B)/renderervk/matrix_multiplication.o \
$(B)/renderervk/tr_globals.o \
$(B)/renderervk/tr_cvar.o \
$(B)/renderervk/tr_animation.o \
$(B)/renderervk/tr_bsp.o \
$(B)/renderervk/tr_cmds.o \
$(B)/renderervk/tr_curve.o \
$(B)/renderervk/tr_fonts.o \
$(B)/renderervk/tr_image.o \
$(B)/renderervk/R_FindShader.o \
$(B)/renderervk/R_ListShader.o \
$(B)/renderervk/R_ImageProcess.o \
$(B)/renderervk/tr_init.o \
$(B)/renderervk/tr_light.o \
$(B)/renderervk/tr_main.o \
$(B)/renderervk/tr_marks.o \
$(B)/renderervk/tr_mesh.o \
$(B)/renderervk/tr_model.o \
$(B)/renderervk/tr_model_iqm.o \
$(B)/renderervk/RE_RegisterModel.o \
$(B)/renderervk/R_ModelBounds.o \
$(B)/renderervk/R_LoadMD3.o \
$(B)/renderervk/R_LoadMDR.o \
$(B)/renderervk/R_LerpTag.o \
$(B)/renderervk/tr_noise.o \
$(B)/renderervk/tr_scene.o \
$(B)/renderervk/tr_shade.o \
$(B)/renderervk/tr_shade_calc.o \
$(B)/renderervk/tr_shader.o \
$(B)/renderervk/tr_shadows.o \
$(B)/renderervk/tr_sky.o \
$(B)/renderervk/tr_surface.o \
$(B)/renderervk/tr_flares.o \
$(B)/renderervk/tr_fog.o \
$(B)/renderervk/tr_world.o \
$(B)/renderervk/vk_instance.o \
$(B)/renderervk/vk_init.o \
$(B)/renderervk/vk_cmd.o \
$(B)/renderervk/vk_image.o \
$(B)/renderervk/vk_image_sampler2.o \
$(B)/renderervk/vk_pipelines.o \
$(B)/renderervk/vk_frame.o \
$(B)/renderervk/vk_swapchain.o \
$(B)/renderervk/vk_screenshot.o \
$(B)/renderervk/vk_shade_geometry.o \
$(B)/renderervk/vk_depth_attachment.o \
\
$(B)/renderervk/vk_shaders.o \
$(B)/renderervk/multi_texture_clipping_plane_vert.o \
$(B)/renderervk/multi_texture_frag.o \
$(B)/renderervk/multi_texture_vert.o \
$(B)/renderervk/single_texture_clipping_plane_vert.o \
$(B)/renderervk/single_texture_frag.o \
$(B)/renderervk/single_texture_vert.o \
\
$(B)/renderervk/R_StretchRaw.o \
$(B)/renderervk/R_DebugGraphics.o \
$(B)/renderervk/RB_ShowImages.o \
$(B)/renderervk/RB_DrawNormals.o \
$(B)/renderervk/RB_DrawTris.o \
$(B)/renderervk/RB_SurfaceAnim.o \
$(B)/renderervk/tr_backend.o \
$(B)/renderervk/tr_Cull.o \
$(B)/renderervk/glConfig.o \
$(B)/renderervk/R_Parser.o \
$(B)/renderervk/R_PortalPlane.o \
$(B)/renderervk/R_PrintMat.o \
\
$(B)/renderervk/R_LoadImage2.o \
$(B)/renderervk/R_LoadImage.o \
$(B)/renderervk/R_ImageJPG.o \
$(B)/renderervk/R_ImageTGA.o \
$(B)/renderervk/R_ImagePNG.o \
$(B)/renderervk/R_ImageBMP.o \
$(B)/renderervk/R_ImagePCX.o \
\
$(B)/renderervk/ref_import.o \
$(B)/renderervk/render_export.o \
\
$(B)/renderervk/vk_create_window_SDL.o

Q3R2OBJ = \
$(B)/renderergl2/tr_animation.o \
$(B)/renderergl2/tr_backend.o \
Expand Down Expand Up @@ -2116,6 +2209,11 @@ ifneq ($(USE_RENDERER_DLOPEN), 0)
$(B)/renderergl1/puff.o \
$(B)/renderergl1/q_math.o \
$(B)/renderergl1/tr_subs.o

Q3VKOBJ += \
$(B)/renderergl1/q_shared.o \
$(B)/renderergl1/puff.o \
$(B)/renderergl1/q_math.o
endif

ifneq ($(USE_INTERNAL_JPEG),0)
Expand Down Expand Up @@ -2426,6 +2524,11 @@ $(B)/renderer_opengl2_$(SHLIBNAME): $(Q3R2OBJ) $(Q3R2STRINGOBJ) $(JPGOBJ)
$(echo_cmd) "LD $@"
$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3R2OBJ) $(Q3R2STRINGOBJ) $(JPGOBJ) \
$(THREAD_LIBS) $(LIBSDLMAIN) $(RENDERER_LIBS) $(LIBS)

$(B)/renderer_vulkan_$(SHLIBNAME): $(Q3VKOBJ) $(JPGOBJ)
$(echo_cmd) "LD $@"
$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3VKOBJ) $(JPGOBJ) \
$(THREAD_LIBS) $(LIBSDLMAIN) $(RENDERER_LIBS) $(LIBS)
else
$(B)/$(CLIENTBIN)$(FULLBINEXT): $(Q3OBJ) $(Q3ROBJ) $(JPGOBJ) $(LIBSDLMAIN)
$(echo_cmd) "LD $@"
Expand All @@ -2438,6 +2541,12 @@ $(B)/$(CLIENTBIN)_opengl2$(FULLBINEXT): $(Q3OBJ) $(Q3R2OBJ) $(Q3R2STRINGOBJ) $(J
$(Q)$(CC) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) $(NOTSHLIBLDFLAGS) \
-o $@ $(Q3OBJ) $(Q3R2OBJ) $(Q3R2STRINGOBJ) $(JPGOBJ) \
$(LIBSDLMAIN) $(CLIENT_LIBS) $(RENDERER_LIBS) $(LIBS)

$(B)/$(CLIENTBIN)_vulkan$(FULLBINEXT): $(Q3OBJ) $(Q3VKOBJ) $(JPGOBJ) $(LIBSDLMAIN)
$(echo_cmd) "LD $@"
$(Q)$(CC) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) $(NOTSHLIBLDFLAGS) \
-o $@ $(Q3OBJ) $(Q3VKOBJ) $(JPGOBJ) \
$(LIBSDLMAIN) $(CLIENT_LIBS) $(RENDERER_LIBS) $(LIBS)
endif

ifneq ($(strip $(LIBSDLMAIN)),)
Expand Down Expand Up @@ -2967,6 +3076,24 @@ $(B)/renderergl2/%.o: $(RCOMMONDIR)/%.c
$(B)/renderergl2/%.o: $(RGL2DIR)/%.c
$(DO_REF_CC)

$(B)/renderervk/%.o: $(CMDIR)/%.c
$(DO_REF_CC)

$(B)/renderervk/%.o: $(SDLDIR)/%.c
$(DO_REF_CC)

$(B)/renderervk/%.o: $(JPDIR)/%.c
$(DO_REF_CC)

$(B)/renderervk/%.o: $(RCOMMONDIR)/%.c
$(DO_REF_CC)

$(B)/renderervk/%.o: $(RVULKANDIR)/%.c
$(DO_REF_CC)

$(B)/renderervk/%.o: $(MOUNT_DIR)/renderervk/shaders/Compiled/%.c
$(DO_REF_CC)


$(B)/ded/%.o: $(ASMDIR)/%.s
$(DO_AS)
Expand Down Expand Up @@ -3104,7 +3231,7 @@ $(B)/$(CLIENTBIN)-config.json: $(WEBDIR)/client-config.json
# MISC
#############################################################################

OBJ = $(Q3OBJ) $(Q3ROBJ) $(Q3R2OBJ) $(Q3DOBJ) $(JPGOBJ) \
OBJ = $(Q3OBJ) $(Q3ROBJ) $(Q3R2OBJ) $(Q3VKOBJ) $(Q3DOBJ) $(JPGOBJ) \
$(MPGOBJ) $(Q3GOBJ) $(Q3CGOBJ) $(MPCGOBJ) $(Q3UIOBJ) $(MPUIOBJ) \
$(MPGVMOBJ) $(Q3GVMOBJ) $(Q3CGVMOBJ) $(MPCGVMOBJ) $(Q3UIVMOBJ) $(MPUIVMOBJ)
TOOLSOBJ = $(LBURGOBJ) $(Q3CPPOBJ) $(Q3RCCOBJ) $(Q3LCCOBJ) $(Q3ASMOBJ)
Expand All @@ -3131,13 +3258,19 @@ ifneq ($(BUILD_CLIENT),0)
ifneq ($(BUILD_RENDERER_OPENGL2),0)
$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/renderer_opengl2_$(SHLIBNAME) $(COPYBINDIR)/renderer_opengl2_$(SHLIBNAME)
endif
ifneq ($(BUILD_RENDERER_VULKAN),0)
$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/renderer_vulkan_$(SHLIBNAME) $(COPYBINDIR)/renderer_vulkan_$(SHLIBNAME)
endif
else
ifneq ($(BUILD_RENDERER_OPENGL1),0)
$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(CLIENTBIN)$(FULLBINEXT) $(COPYBINDIR)/$(CLIENTBIN)$(FULLBINEXT)
endif
ifneq ($(BUILD_RENDERER_OPENGL2),0)
$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(CLIENTBIN)_opengl2$(FULLBINEXT) $(COPYBINDIR)/$(CLIENTBIN)_opengl2$(FULLBINEXT)
endif
ifneq ($(BUILD_RENDERER_VULKAN),0)
$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(CLIENTBIN)_vulkan$(FULLBINEXT) $(COPYBINDIR)/$(CLIENTBIN)_vulkan$(FULLBINEXT)
endif
endif
endif

Expand Down Expand Up @@ -3185,6 +3318,7 @@ clean2:
@rm -f $(OBJ_D_FILES)
@rm -f $(STRINGOBJ)
@rm -f $(TARGETS)
@rm -rf $(Q3VKOBJ)
@rm -f $(GENERATEDTARGETS)

toolsclean: toolsclean-debug toolsclean-release
Expand Down
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ Makefile.local:
USE_RENDERER_DLOPEN - build and use the renderer in a library
BUILD_RENDERER_OPENGL1 build the opengl1 client / renderer library
BUILD_RENDERER_OPENGL2 build the opengl2 client / renderer library
BUILD_RENDERER_VULKAN build the vulkan client / renderer library
USE_YACC - use yacc to update code/tools/lcc/lburg/gram.c
BASEGAME - rename 'baseq3'
BASEGAME_CFLAGS - custom CFLAGS for basegame
Expand Down Expand Up @@ -199,6 +200,12 @@ set using command line arguments:
ioquake3 +set cl_renderer opengl2 +set r_preferOpenGLES 1


# Vulkan support

The vulkan rendender can be enabled by:

ioquake3 +set cl_renderer vulkan

# Console

## New cvars
Expand Down
43 changes: 43 additions & 0 deletions code/renderervk/RB_DrawNormals.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#include "tr_backend.h"
#include "vk_shade_geometry.h"
#include "tr_globals.h"
#include "vk_pipelines.h"

/*
================
Draws vertex normals for debugging
================
*/
void RB_DrawNormals (shaderCommands_t* pTess, int numVertexes )
{
// VULKAN
// int numVertexes = tess.numVertexes;
vec4_t xyz[SHADER_MAX_VERTEXES];
memcpy(xyz, pTess->xyz, numVertexes * sizeof(vec4_t));

memset(pTess->svars.colors, tr.identityLightByte, SHADER_MAX_VERTEXES * sizeof(color4ub_t));

int i = 0;
while (i < numVertexes)
{
int count = numVertexes - i;
if (count >= SHADER_MAX_VERTEXES/2 - 1)
count = SHADER_MAX_VERTEXES/2 - 1;

int k;
for (k = 0; k < count; k++)
{
VectorCopy(xyz[i + k], pTess->xyz[2*k]);
VectorMA(xyz[i + k], 2, pTess->normal[i + k], pTess->xyz[2*k + 1]);
}
pTess->numVertexes = 2 * count;
pTess->numIndexes = 0;

vk_UploadXYZI(pTess->xyz, pTess->numVertexes, NULL, 0);

updateMVP(backEnd.viewParms.isPortal, backEnd.projection2D, getptr_modelview_matrix());
vk_shade_geometry(g_stdPipelines.normals_debug_pipeline, VK_FALSE, DEPTH_RANGE_ZERO, VK_FALSE);

i += count;
}
}
8 changes: 8 additions & 0 deletions code/renderervk/RB_DrawNormals.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef RB_SHOW_NORMALS_H_
#define RB_SHOW_NORMALS_H_

struct shaderCommands_s;

void RB_DrawNormals (struct shaderCommands_s* input , int numVertexes );

#endif
30 changes: 30 additions & 0 deletions code/renderervk/RB_DrawTris.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#include "RB_DrawTris.h"
#include "tr_globals.h"
#include "vk_shade_geometry.h"
#include "vk_pipelines.h"
#include "tr_backend.h"
/*
================
Draws triangle outlines for debugging
================
*/
void RB_DrawTris (shaderCommands_t * pInput)
{
if (vk.features.fillModeNonSolid == VK_FALSE) {
static qboolean printed = qfalse;
if (!printed) {
ri.Printf(PRINT_WARNING, "RB_ShowTris: fillModeNonSolid not supported.\n");
printed = qtrue;
}
return;
}


updateCurDescriptor( tr.whiteImage->descriptor_set, 0);

// VULKAN

memset(pInput->svars.colors, 255, pInput->numVertexes * 4 );
VkPipeline pipeline = backEnd.viewParms.isMirror ? g_stdPipelines.tris_mirror_debug_pipeline : g_stdPipelines.tris_debug_pipeline;
vk_shade_geometry(pipeline, VK_FALSE, DEPTH_RANGE_ZERO, VK_TRUE);
}
7 changes: 7 additions & 0 deletions code/renderervk/RB_DrawTris.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#ifndef RB_DRAWTRIS_H_
#define RB_DRAWTRIS_H_
struct shaderCommands_s;

void RB_DrawTris (struct shaderCommands_s *input);

#endif
Loading