gsk_private_gl_shaders = [
  'gl/resources/preamble.glsl',
  'gl/resources/preamble.fs.glsl',
  'gl/resources/preamble.vs.glsl',
  'gl/resources/border.glsl',
  'gl/resources/blit.glsl',
  'gl/resources/coloring.glsl',
  'gl/resources/color.glsl',
  'gl/resources/linear_gradient.glsl',
  'gl/resources/radial_gradient.glsl',
  'gl/resources/conic_gradient.glsl',
  'gl/resources/color_matrix.glsl',
  'gl/resources/blur.glsl',
  'gl/resources/inset_shadow.glsl',
  'gl/resources/outset_shadow.glsl',
  'gl/resources/unblurred_outset_shadow.glsl',
  'gl/resources/cross_fade.glsl',
  'gl/resources/blend.glsl',
  'gl/resources/repeat.glsl',
  'gl/resources/custom.glsl',
  'gl/resources/filled_border.glsl',
  'gl/resources/mask.glsl',
  'gl/resources/external.glsl',
  'gl/resources/premultiply.glsl',
]

gsk_public_sources = files([
  'gskcairorenderer.c',
  'gskdiff.c',
  'gskglshader.c',
  'gskoffload.c',
  'gskpath.c',
  'gskpathbuilder.c',
  'gskpathmeasure.c',
  'gskpathparser.c',
  'gskpathpoint.c',
  'gskrenderer.c',
  'gskrendernode.c',
  'gskrendernodeimpl.c',
  'gskrendernodeparser.c',
  'gskroundedrect.c',
  'gskstroke.c',
  'gsktransform.c',
  'gl/gskglrenderer.c',
  'gpu/gsknglrenderer.c',
  'gpu/gskvulkanrenderer.c',
])

gsk_private_sources = files([
  'gskcairoblur.c',
  'gskcontour.c',
  'gskcurve.c',
  'gskdebug.c',
  'gskprivate.c',
  'gskprofiler.c',
  'gl/gskglattachmentstate.c',
  'gl/gskglbuffer.c',
  'gl/gskglcommandqueue.c',
  'gl/gskglcompiler.c',
  'gl/gskgldriver.c',
  'gl/gskglglyphlibrary.c',
  'gl/gskgliconlibrary.c',
  'gl/gskglprogram.c',
  'gl/gskglrenderjob.c',
  'gl/gskglshadowlibrary.c',
  'gl/gskgltexturelibrary.c',
  'gl/gskgluniformstate.c',
  'gl/gskgltexture.c',
  'gl/gskglprofiler.c',
  'gl/stb_rect_pack.c',
  'gl/fp16.c',
  'gpu/gskglbuffer.c',
  'gpu/gskgldevice.c',
  'gpu/gskglframe.c',
  'gpu/gskglimage.c',
  'gpu/gskgpublendop.c',
  'gpu/gskgpublendmodeop.c',
  'gpu/gskgpublitop.c',
  'gpu/gskgpublurop.c',
  'gpu/gskgpuborderop.c',
  'gpu/gskgpuboxshadowop.c',
  'gpu/gskgpubuffer.c',
  'gpu/gskgpucache.c',
  'gpu/gskgpuclearop.c',
  'gpu/gskgpuclip.c',
  'gpu/gskgpucolorizeop.c',
  'gpu/gskgpucolormatrixop.c',
  'gpu/gskgpucolorop.c',
  'gpu/gskgpuconicgradientop.c',
  'gpu/gskgpuconvertop.c',
  'gpu/gskgpuconvertcicpop.c',
  'gpu/gskgpucrossfadeop.c',
  'gpu/gskgpudownloadop.c',
  'gpu/gskgpudevice.c',
  'gpu/gskgpuframe.c',
  'gpu/gskgpuglobalsop.c',
  'gpu/gskgpuimage.c',
  'gpu/gskgpulineargradientop.c',
  'gpu/gskgpumaskop.c',
  'gpu/gskgpumipmapop.c',
  'gpu/gskgpunodeprocessor.c',
  'gpu/gskgpuop.c',
  'gpu/gskgpuprint.c',
  'gpu/gskgpuradialgradientop.c',
  'gpu/gskgpurenderer.c',
  'gpu/gskgpurenderpassop.c',
  'gpu/gskgpuroundedcolorop.c',
  'gpu/gskgpushaderop.c',
  'gpu/gskgpuscissorop.c',
  'gpu/gskgputextureop.c',
  'gpu/gskgpuuploadop.c',
])

gsk_f16c_sources = files([
  'gl/fp16i.c',
])

gsk_public_headers = files([
  'gskcairorenderer.h',
  'gskenums.h',
  'gskglshader.h',
  'gskpath.h',
  'gskpathbuilder.h',
  'gskpathmeasure.h',
  'gskpathpoint.h',
  'gskrenderer.h',
  'gskrendernode.h',
  'gskroundedrect.h',
  'gskstroke.h',
  'gsktransform.h',
  'gsktypes.h',
])
install_headers(gsk_public_headers, 'gsk.h', subdir: 'gtk-4.0/gsk')

gsk_public_gl_headers = files([
  'gl/gskglrenderer.h',
])
install_headers(gsk_public_gl_headers, subdir: 'gtk-4.0/gsk/gl')
gsk_public_headers += gsk_public_gl_headers

gsk_public_gpu_headers = files([
  'gpu/gskvulkanrenderer.h'
])
install_headers(gsk_public_gpu_headers, subdir: 'gtk-4.0/gsk/gpu')
gsk_public_headers += gsk_public_gpu_headers

if get_variable('broadway_enabled')
  gsk_public_broadway_headers = files([
    'broadway/gskbroadwayrenderer.h'
  ])
  install_headers(gsk_public_broadway_headers, subdir: 'gtk-4.0/gsk/broadway')
  gsk_public_headers += gsk_public_broadway_headers
endif

gsk_private_vulkan_shaders = []
gsk_private_vulkan_compiled_shaders = []
gsk_private_vulkan_compiled_shaders_deps = []
gsk_private_vulkan_shader_headers = []

if have_vulkan
  gsk_private_sources += files([
    'gpu/gskvulkanbuffer.c',
    'gpu/gskvulkandevice.c',
    'gpu/gskvulkanframe.c',
    'gpu/gskvulkanimage.c',
    'gpu/gskvulkanmemory.c',
    'gpu/gskvulkanycbcr.c',
  ])
endif # have_vulkan

subdir('gpu/shaders')

if get_variable('broadway_enabled')
  gsk_public_sources += files([
    'broadway/gskbroadwayrenderer.c',
  ])
endif

gsk_resources_xml = custom_target(output: 'gsk.resources.xml',
  input: 'gen-gsk-gresources-xml.py',
  command: [
    find_program('gen-gsk-gresources-xml.py'),
    '@OUTPUT@',
    gsk_private_gl_shaders,
    gsk_private_vulkan_compiled_shaders,
    gsk_private_vulkan_shaders,
    gsk_private_gpu_gl_shaders,
    gsk_private_gpu_vulkan_shaders,
  ],
)

gsk_enums = gnome.mkenums('gskenumtypes',
  sources: gsk_public_headers,
  c_template: 'gskenumtypes.c.template',
  h_template: 'gskenumtypes.h.template',
  install_dir: gtk_includedir / 'gtk-4.0/gsk',
  install_header: true,
)

gskenum_h = gsk_enums[1]

gskresources = gnome.compile_resources('gskresources',
  gsk_resources_xml,
  dependencies: [
                  gsk_private_vulkan_compiled_shaders_deps,
                  gsk_private_gpu_vulkan_shaders,
                ],
  source_dir: [meson.current_build_dir(), meson.current_source_dir()],
  c_name: '_gsk',
  extra_args: [ '--manual-register', ],
)

gsk_gen_headers = [ gskenum_h, ]

gsk_deps = [
  graphene_dep,
  pango_dep,
  cairo_dep,
  cairo_csi_dep,
  libgdk_dep,
]

libgsk_f16c = static_library('gsk_f16c',
  sources: gsk_f16c_sources,
  dependencies: gsk_deps,
  include_directories: [ confinc, ],
  c_args: [
    '-DGTK_COMPILATION',
    '-DG_LOG_DOMAIN="Gsk"',
    '-DG_LOG_STRUCTURED=1',
  ] + common_cflags + f16c_cflags,
)

libgsk = static_library('gsk',
  sources: [
    gsk_public_sources,
    gsk_private_sources,
    gsk_enums,
    gskresources,
    gsk_private_vulkan_shader_headers,
    gsk_private_gpu_shader_headers,
  ],
  dependencies: gsk_deps,
  include_directories: [ confinc, ],
  c_args: [
    '-DGTK_COMPILATION',
    '-DG_LOG_DOMAIN="Gsk"',
    '-DG_LOG_STRUCTURED=1',
  ] + common_cflags,
  link_with: [ libgdk, libgsk_f16c]
)

# We don't have link_with: to internal static libs here on purpose, just
# list the dependencies and generated headers and such, for use in the
# "public" libgtk_dep used by internal executables.
libgsk_dep = declare_dependency(include_directories: [ confinc, ],
  sources: [ gskenum_h, ],
  dependencies: [libgdk_dep, cairo_csi_dep],
)
