add_library(videocommon
  AbstractFramebuffer.cpp
  AbstractFramebuffer.h
  AbstractShader.h
  AbstractStagingTexture.cpp
  AbstractStagingTexture.h
  AbstractTexture.cpp
  AbstractTexture.h
  AsyncRequests.cpp
  AsyncRequests.h
  AsyncShaderCompiler.cpp
  AsyncShaderCompiler.h
  BoundingBox.cpp
  BoundingBox.h
  BPFunctions.cpp
  BPFunctions.h
  BPMemory.cpp
  BPMemory.h
  BPStructs.cpp
  BPStructs.h
  CommandProcessor.cpp
  CommandProcessor.h
  ConstantManager.h
  CPMemory.cpp
  CPMemory.h
  DriverDetails.cpp
  DriverDetails.h
  Fifo.cpp
  Fifo.h
  FPSCounter.cpp
  FPSCounter.h
  FramebufferManager.cpp
  FramebufferManager.h
  FramebufferShaderGen.cpp
  FramebufferShaderGen.h
  FreeLookCamera.cpp
  FreeLookCamera.h
  GeometryShaderGen.cpp
  GeometryShaderGen.h
  GeometryShaderManager.cpp
  GeometryShaderManager.h
  GraphicsModSystem/Config/GraphicsMod.cpp
  GraphicsModSystem/Config/GraphicsMod.h
  GraphicsModSystem/Config/GraphicsModFeature.cpp
  GraphicsModSystem/Config/GraphicsModFeature.h
  GraphicsModSystem/Config/GraphicsModGroup.cpp
  GraphicsModSystem/Config/GraphicsModGroup.h
  GraphicsModSystem/Config/GraphicsTarget.cpp
  GraphicsModSystem/Config/GraphicsTarget.h
  GraphicsModSystem/Config/GraphicsTargetGroup.cpp
  GraphicsModSystem/Config/GraphicsTargetGroup.h
  GraphicsModSystem/Constants.h
  GraphicsModSystem/Runtime/Actions/MoveAction.cpp
  GraphicsModSystem/Runtime/Actions/MoveAction.h
  GraphicsModSystem/Runtime/Actions/PrintAction.cpp
  GraphicsModSystem/Runtime/Actions/PrintAction.h
  GraphicsModSystem/Runtime/Actions/ScaleAction.cpp
  GraphicsModSystem/Runtime/Actions/ScaleAction.h
  GraphicsModSystem/Runtime/Actions/SkipAction.cpp
  GraphicsModSystem/Runtime/Actions/SkipAction.h
  GraphicsModSystem/Runtime/FBInfo.cpp
  GraphicsModSystem/Runtime/FBInfo.h
  GraphicsModSystem/Runtime/GraphicsModAction.h
  GraphicsModSystem/Runtime/GraphicsModActionData.h
  GraphicsModSystem/Runtime/GraphicsModActionFactory.cpp
  GraphicsModSystem/Runtime/GraphicsModActionFactory.h
  GraphicsModSystem/Runtime/GraphicsModManager.cpp
  GraphicsModSystem/Runtime/GraphicsModManager.h
  HiresTextures.cpp
  HiresTextures.h
  HiresTextures_DDSLoader.cpp
  IndexGenerator.cpp
  IndexGenerator.h
  LightingShaderGen.cpp
  LightingShaderGen.h
  LookUpTables.h
  NativeVertexFormat.h
  NetPlayChatUI.cpp
  NetPlayChatUI.h
  NetPlayGolfUI.cpp
  NetPlayGolfUI.h
  OnScreenDisplay.cpp
  OnScreenDisplay.h
  OpcodeDecoding.cpp
  OpcodeDecoding.h
  PerfQueryBase.cpp
  PerfQueryBase.h
  PixelEngine.cpp
  PixelEngine.h
  PixelShaderGen.cpp
  PixelShaderGen.h
  PixelShaderManager.cpp
  PixelShaderManager.h
  PostProcessing.cpp
  PostProcessing.h
  RenderBase.cpp
  RenderBase.h
  RenderState.cpp
  RenderState.h
  ShaderCache.cpp
  ShaderCache.h
  ShaderGenCommon.cpp
  ShaderGenCommon.h
  Spirv.cpp
  Spirv.h
  Statistics.cpp
  Statistics.h
  TextureCacheBase.cpp
  TextureCacheBase.h
  TextureConfig.cpp
  TextureConfig.h
  TextureConversionShader.cpp
  TextureConversionShader.h
  TextureConverterShaderGen.cpp
  TextureConverterShaderGen.h
  TextureDecoder.h
  TextureDecoder_Common.cpp
  TextureDecoder_Util.h
  TextureInfo.cpp
  TextureInfo.h
  TMEM.cpp
  TMEM.h
  UberShaderCommon.cpp
  UberShaderCommon.h
  UberShaderPixel.cpp
  UberShaderPixel.h
  UberShaderVertex.cpp
  UberShaderVertex.h
  VertexLoader.cpp
  VertexLoader.h
  VertexLoaderBase.cpp
  VertexLoaderBase.h
  VertexLoaderManager.cpp
  VertexLoaderManager.h
  VertexLoaderUtils.h
  VertexLoader_Color.cpp
  VertexLoader_Color.h
  VertexLoader_Normal.cpp
  VertexLoader_Normal.h
  VertexLoader_Position.cpp
  VertexLoader_Position.h
  VertexLoader_TextCoord.cpp
  VertexLoader_TextCoord.h
  VertexManagerBase.cpp
  VertexManagerBase.h
  VertexShaderGen.cpp
  VertexShaderGen.h
  VertexShaderManager.cpp
  VertexShaderManager.h
  VideoBackendBase.cpp
  VideoBackendBase.h
  VideoCommon.h
  VideoConfig.cpp
  VideoConfig.h
  VideoState.cpp
  VideoState.h
  XFMemory.cpp
  XFMemory.h
  XFStructs.cpp
  XFStructs.h
)

target_link_libraries(videocommon
PUBLIC
  core
PRIVATE
  fmt::fmt
  spng
  xxhash
  imgui
  glslang
)

if(_M_X86)
  target_sources(videocommon PRIVATE
    TextureDecoder_x64.cpp
    VertexLoaderX64.cpp
    VertexLoaderX64.h
  )
elseif(_M_ARM_64)
  target_sources(videocommon PRIVATE
    VertexLoaderARM64.cpp
    VertexLoaderARM64.h
    TextureDecoder_Generic.cpp
  )
else()
  target_sources(videocommon PRIVATE
    TextureDecoder_Generic.cpp
  )
endif()

if(FFmpeg_FOUND)
  target_sources(videocommon PRIVATE
    FrameDump.cpp
    FrameDump.h
  )
  target_link_libraries(videocommon PRIVATE
    FFmpeg::avcodec
    FFmpeg::avformat
    FFmpeg::avutil
    FFmpeg::swresample
    FFmpeg::swscale
  )
  if(APPLE)
    target_link_libraries(videocommon PRIVATE
      ${COREMEDIA_LIBRARY}
      ${VIDEOTOOLBOX_LIBRARY}
      ${COREVIDEO_LIBRARY}
      ${AUDIOTOOLBOX_LIBRARY}
    )
  endif()
endif()

# Silence warnings on glslang by flagging it as a system include
target_include_directories(videocommon
SYSTEM PUBLIC
  ${CMAKE_SOURCE_DIR}/Externals/glslang/glslang/Public
SYSTEM PRIVATE
  ${CMAKE_SOURCE_DIR}/Externals/glslang/StandAlone
  ${CMAKE_SOURCE_DIR}/Externals/glslang/SPIRV
  ${CMAKE_SOURCE_DIR}/Externals/glslang
)

if(MSVC)
  # Add precompiled header
  target_link_libraries(videocommon PRIVATE use_pch)
endif()
