diff options
| author | gramanas <anastasis.gramm2@gmail.com> | 2024-06-06 13:41:08 +0300 | 
|---|---|---|
| committer | gramanas <anastasis.gramm2@gmail.com> | 2024-06-06 13:41:08 +0300 | 
| commit | eb5d40f92c6d2d1d7491c350cbdcef2e8bf96e06 (patch) | |
| tree | afe523416d2cd5c57f403dd5a36d28a9c513ed30 | |
| parent | a6501b5d7ad204c3b998c843c7ed68ef7be323ba (diff) | |
| download | cgame-eb5d40f92c6d2d1d7491c350cbdcef2e8bf96e06.tar.gz cgame-eb5d40f92c6d2d1d7491c350cbdcef2e8bf96e06.tar.bz2 cgame-eb5d40f92c6d2d1d7491c350cbdcef2e8bf96e06.zip | |
build changes
| -rw-r--r-- | b.c | 148 | ||||
| -rw-r--r-- | src/b.h | 17 | ||||
| -rw-r--r-- | src/render.c | 62 | ||||
| -rw-r--r-- | src/vksetup.h | 6 | 
4 files changed, 155 insertions, 78 deletions
| @@ -1,5 +1,8 @@  #define B_IMPLEMENTATION  #include "src/b.h" +#include <libgen.h> + +#define BUILD_DIR "build/"  int debug_level = 1; @@ -77,11 +80,28 @@ build_c(bool         force,          size_t       input_paths_len,          const char** dep_paths,          size_t       dep_paths_len, +        const char** objects, +        size_t       objects_len,          const char*  output_path)  { +  size_t size = input_paths_len + objects_len; +  const char **new_array = (const char **)malloc((size) * sizeof(const char *)); + +  // Copy existing elements to the new array +  int i = 0; +  for (; i < input_paths_len; ++i) { +    new_array[i] = input_paths[i]; +  } +  for (; i < size; ++i) { +    new_array[i] = objects[i - input_paths_len]; +  } +    int rebuild_is_needed = -    b_needs_rebuild(output_path, input_paths, input_paths_len); -  int dep_rebuild = b_needs_rebuild(output_path, dep_paths, dep_paths_len); +    b_needs_rebuild(output_path, new_array, size); + +  int dep_rebuild = 0; +  if (rebuild_is_needed == 0) +    dep_rebuild = b_needs_rebuild(output_path, dep_paths, dep_paths_len);    if (rebuild_is_needed < 0 || dep_rebuild < 0) return false; @@ -89,7 +109,7 @@ build_c(bool         force,      cmd->count = 0;      cc(cmd);      b_cmd_append(cmd, "-o", output_path); -    b_da_append_many(cmd, input_paths, input_paths_len); +    b_da_append_many(cmd, new_array, size);      libs(cmd);      return b_cmd_run_sync(*cmd);    } @@ -99,30 +119,81 @@ build_c(bool         force,  }  bool -compile_cxx(bool         force, -            B_Cmd*       cmd, -            const char** input_paths, -            size_t       input_paths_len, -            const char** dep_paths, -            size_t       dep_paths_len, -            const char*  output_path) +build_objects(const char* lang, +              const char* object, +              const char* deps[], +              size_t      deps_size, +              const char* out[]) // deps_size + 1  { -  int rebuild_is_needed = b_needs_rebuild(output_path, input_paths, input_paths_len); -  int dep_rebuild = b_needs_rebuild(output_path, dep_paths, dep_paths_len); -   -  if (rebuild_is_needed < 0 || dep_rebuild < 0) return false; +  char *tmpc, *tmpc2;   +  char tmp[deps_size + 1][1000]; +  char* tmp_obj = strdup(object); +  char path[1000] = ""; -  if (force || rebuild_is_needed || dep_rebuild) { -    cmd->count = 0; -    cxx(cmd); -    b_cmd_append(cmd, "-c"); -    //b_cmd_append(cmd, "-o", output_path); -    b_da_append_many(cmd, input_paths, input_paths_len); -    //libs(cmd); -    return b_cmd_run_sync(*cmd); +  strcpy(path, BUILD_DIR); +  //strcat(path, "/"); +  strcat(path, basename(tmp_obj)); +  path[ strlen(path) - 4 ] = '\0'; +  strcat(path, "/"); + +  b_mkdir_if_not_exists(path); + +  int rebuild = 0; + +  for (size_t i = 0; i < deps_size + 1; i++) { +    strcpy(tmp[i], path); +    if (i == deps_size) { +      tmpc = basename(tmp_obj); +      strcat(tmp[i], tmpc); +      free(tmp_obj); +    } else { +      tmpc2 = strdup(deps[i]); +      tmpc = basename(tmpc2); +      strcat(tmp[i], tmpc); +      free(tmpc2); +    } + +    size_t s = strlen(tmp[i]); +    tmp[i][s - 4] = '.'; +    tmp[i][s - 3] = 'o'; +    tmp[i][s - 2] = '\0'; + +    out[i] = strdup(tmp[i]); + +    int c = b_needs_rebuild1(out[i], i == deps_size ? object : deps[i]); +    if (c < 0) return false; +    rebuild += c; + +    if (c != 0) { +      B_Cmd cmd = { 0 }; +       +      if (!strcmp(lang, "C++")) +        cxx(&cmd); +      else +        cc(&cmd); +      b_cmd_append(&cmd, "-c"); +      b_cmd_append(&cmd, i == deps_size ? object : deps[i]); +      b_cmd_append(&cmd, "-o"); +      b_cmd_append(&cmd, out[i]); +      bool rc = b_cmd_run_sync(cmd); +      if (!rc) return false; +    }    } +  if (rebuild == 0) b_log(B_INFO, "%s* is up-to-date", path); -  b_log(B_INFO, "%s is up-to-date", output_path); +  /* if (rebuild != 0) { */ +  /*   if (!strcmp(lang, "C++")) */ +  /*     cxx(&cmd); */ +  /*   else */ +  /*     cc(&cmd); */ +  /*   b_cmd_append(&cmd, "-c"); */ +  /*   b_cmd_append(&cmd, object); */ +  /*   b_da_append_many(&cmd, deps, deps_size); */ + +  /*   return b_cmd_run_sync(cmd); */ +  /* } */ + +  //b_log(B_INFO, "%s is up-to-date", out[deps_size]);    return true;  } @@ -145,11 +216,7 @@ main(int argc, char *argv[])      }    } -  const char *cxx_dep_paths[] = { -    "src/vksetup.h", -  }; -  const char* cxx_input_paths[] = { -    "src/cplusplus.cpp", +  const char* cplusplus_deps[] = {      "lib/imgui-1.90.7/imgui.cpp",      "lib/imgui-1.90.7/imgui_demo.cpp",      "lib/imgui-1.90.7/imgui_draw.cpp", @@ -158,30 +225,27 @@ main(int argc, char *argv[])      "lib/imgui-1.90.7/backends/imgui_impl_sdl2.cpp",      "lib/imgui-1.90.7/backends/imgui_impl_vulkan.cpp",    }; -   -  const char *c_dep_paths[] = { + +  const char *render_deps[] = {      "src/state.h",      "src/vksetup.h", +    "src/cplusplus.h",    }; -  const char* c_input_paths[] = { +  const char* render_paths[] = {      "src/render.c", -    "cplusplus.o", -    "imgui.o", -    "imgui_demo.o", -    "imgui_draw.o", -    "imgui_tables.o", -    "imgui_widgets.o", -    "imgui_impl_sdl2.o", -    "imgui_impl_vulkan.o",    };    B_Cmd cmd = {0}; -  if (!compile_cxx(force, &cmd, cxx_input_paths, B_ARRAY_LEN(cxx_input_paths), cxx_dep_paths, B_ARRAY_LEN(c_dep_paths),"cplusplus.o")) return 1; -  if (!build_c(force, &cmd, c_input_paths, B_ARRAY_LEN(c_input_paths), c_dep_paths, B_ARRAY_LEN(c_dep_paths),"render")) return 1; +  const char* objects[B_ARRAY_LEN(cplusplus_deps) + 1]; +   +  b_mkdir_if_not_exists(BUILD_DIR); + +  // TODO: make build_object func to build one by one, and add headers +  if (!build_objects("C++", "src/cplusplus.cpp", cplusplus_deps, B_ARRAY_LEN(cplusplus_deps), objects)) return 1; +  if (!build_c(force, &cmd, render_paths, B_ARRAY_LEN(render_paths), render_deps, B_ARRAY_LEN(render_deps), objects, B_ARRAY_LEN(objects), BUILD_DIR"render")) return 1;    return 0;  } -  /*    1. Build list of <object>.cpp (with <dep>s) -> into build/cxx/<object>/<dep>.o    2. Build list of <object>.c (with <dep>s)   -> into build/c/<object>/<dep>.o @@ -49,6 +49,8 @@  typedef enum {      B_INFO, +    B_CMD, +    B_BUILDING,      B_CHANGE,      B_WARNING,      B_ERROR, @@ -306,7 +308,7 @@ bool b_mkdir_if_not_exists(const char *path)      int result = mkdir(path, 0755);      if (result < 0) {          if (errno == EEXIST) { -            b_log(B_INFO, "directory `%s` already exists", path); +          //b_log(B_INFO, "directory `%s` already exists", path);              return true;          }          b_log(B_ERROR, "could not create directory `%s`: %s", path, strerror(errno)); @@ -398,7 +400,7 @@ B_Proc b_cmd_run_async(B_Cmd cmd)      B_String_Builder sb = {0};      b_cmd_render(cmd, &sb);      b_sb_append_null(&sb); -    b_log(B_INFO, "CMD: %s", sb.items); +    b_log(B_CMD, "%s", sb.items);      b_sb_free(sb);      memset(&sb, 0, sizeof(sb)); @@ -486,6 +488,12 @@ void b_log(B_Log_Level level, const char *fmt, ...)      case B_INFO:          fprintf(stderr, "[INFO] ");          break; +    case B_CMD: +        fprintf(stderr, "[CMD] "); +        break; +    case B_BUILDING: +        fprintf(stderr, "[BUILDING] "); +        break;      case B_CHANGE:          fprintf(stderr, "[CHANGE] ");          break; @@ -712,7 +720,10 @@ int b_needs_rebuild(const char *output_path, const char **input_paths, size_t in      if (stat(output_path, &statbuf) < 0) {          // NOTE: if output does not exist it 100% must be rebuilt -        if (errno == ENOENT) return 1; +        if (errno == ENOENT) { +          b_log(B_BUILDING, "%s", output_path); +          return 1; +        }          b_log(B_ERROR, "could not stat %s: %s", output_path, strerror(errno));          return -1;      } diff --git a/src/render.c b/src/render.c index 4893d64..2558bd4 100644 --- a/src/render.c +++ b/src/render.c @@ -13,9 +13,9 @@  #include <vulkan/vulkan.h> -#define VMA_STATIC_VULKAN_FUNCTIONS 0 -#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 -#include "vk_mem_alloc.h" +/* #define VMA_STATIC_VULKAN_FUNCTIONS 0 */ +/* #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 */ +/* #include "vk_mem_alloc.h" */  #define STB_IMAGE_IMPLEMENTATION  #include <stb_image.h> @@ -1626,7 +1626,6 @@ draw_frame()    float dt = time - prev_time; -    vkWaitForFences(s.vk.device, 1, &s.frames[currentFrame].in_flight_fence, VK_TRUE, UINT64_MAX);    uint32_t imageIndex; @@ -1696,47 +1695,44 @@ main(int argc, char* argv[])    init_state(&s);    if (!init()) {      vk_log(VK_INFO, "Failed to initialize!\n"); +    abort();    } -  else { -    init_vulkan(); -    bool quit = false; +  init_vulkan(); +  bool quit = false; -    /* VMA POC */ -    VmaVulkanFunctions vulkanFunctions = {0}; -    vulkanFunctions.vkGetInstanceProcAddr = &vkGetInstanceProcAddr; -    vulkanFunctions.vkGetDeviceProcAddr = &vkGetDeviceProcAddr; -    VmaAllocatorCreateInfo allocatorCreateInfo = {0}; -    allocatorCreateInfo.flags = VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT; -    allocatorCreateInfo.vulkanApiVersion = VK_API_VERSION_1_2; -    allocatorCreateInfo.physicalDevice = s.vk.physical_device; -    allocatorCreateInfo.device = s.vk.device; -    allocatorCreateInfo.instance = s.vk.instance; -    allocatorCreateInfo.pVulkanFunctions = &vulkanFunctions; +  /* VMA POC */ +  VmaVulkanFunctions vulkanFunctions = {0}; +  vulkanFunctions.vkGetInstanceProcAddr = &vkGetInstanceProcAddr; +  vulkanFunctions.vkGetDeviceProcAddr = &vkGetDeviceProcAddr; -    VmaAllocator allocator; -    vmaCreateAllocator(&allocatorCreateInfo, &allocator); +  VmaAllocatorCreateInfo allocatorCreateInfo = {0}; +  allocatorCreateInfo.flags = VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT; +  allocatorCreateInfo.vulkanApiVersion = VK_API_VERSION_1_2; +  allocatorCreateInfo.physicalDevice = s.vk.physical_device; +  allocatorCreateInfo.device = s.vk.device; +  allocatorCreateInfo.instance = s.vk.instance; +  allocatorCreateInfo.pVulkanFunctions = &vulkanFunctions; -    // Entire program... +  vmaCreateAllocator(&allocatorCreateInfo, &s.vk.allocator); -    // At the end, don't forget to: -    vmaDestroyAllocator(allocator); +  // At the end, don't forget to: -    // Game loop -    update_camera(0, 0); -    while (!quit) { -      handle_input(&quit); -      imgui_new_frame(s.vk); -      draw_frame(); -      //SDL_Delay(16); -    } +  update_camera(0, 0); -    close_vulkan(); +  // Game loop +  while (!quit) { +    handle_input(&quit); +    imgui_new_frame(s.vk); +    draw_frame(); +    //SDL_Delay(16);    } -  // Free resources and close SDL +  vmaDestroyAllocator(s.vk.allocator); + +  close_vulkan();    closeSDL();    return 0; diff --git a/src/vksetup.h b/src/vksetup.h index 273a785..608975b 100644 --- a/src/vksetup.h +++ b/src/vksetup.h @@ -47,6 +47,10 @@  #include <shaderc/shaderc.h> +#define VMA_STATIC_VULKAN_FUNCTIONS 0 +#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 +#include "vk_mem_alloc.h" +  #include "../lib/cglm/include/cglm/cglm.h"  #define VK_ARRAY_LEN(arr) sizeof((arr))/sizeof((arr)[0]) @@ -192,6 +196,8 @@ typedef struct vks_context {    vks_image color_image;    vks_image depth_image; +  VmaAllocator allocator; +    VkSampleCountFlagBits msaa_samples;  } vks_context; | 
