Skip to content

Commit

Permalink
Initial commit.
Browse files Browse the repository at this point in the history
  • Loading branch information
acdemiralp committed May 14, 2017
0 parents commit dd5f7ee
Show file tree
Hide file tree
Showing 58 changed files with 17,236 additions and 0 deletions.
158 changes: 158 additions & 0 deletions CMakeLists.txt
@@ -0,0 +1,158 @@
################################################## Project ##################################################
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
project (gl VERSION 4.5 LANGUAGES CXX)
list (APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
set_property (GLOBAL PROPERTY USE_FOLDERS ON)
set (CMAKE_CXX_VISIBILITY_PRESET hidden)
set (CMAKE_VISIBILITY_INLINES_HIDDEN 1)

################################################## Options ##################################################
option(BUILD_SHARED_LIBS "Build shared (dynamic) libraries." ON)
option(BUILD_TESTS "Build tests." OFF)
option(CUDA_INTEROP_SUPPORT "Include cuda interoperation support for buffers and textures." OFF)

################################################## Sources ##################################################
set(PROJECT_SOURCES
CMakeLists.txt
cmake/assign_source_group.cmake
cmake/import_library.cmake

include/gl/auxiliary/glm_uniforms.hpp
include/gl/all.hpp
include/gl/buffer.hpp
include/gl/command_execution.hpp
include/gl/compute.hpp
include/gl/debug.hpp
include/gl/draw_commands.hpp
include/gl/framebuffer.hpp
include/gl/opengl.hpp
include/gl/per_fragment_ops.hpp
include/gl/pipeline.hpp
include/gl/program.hpp
include/gl/query.hpp
include/gl/rasterization.hpp
include/gl/renderbuffer.hpp
include/gl/sampler.hpp
include/gl/shader.hpp
include/gl/state.hpp
include/gl/sync.hpp
include/gl/tessellation.hpp
include/gl/texture.hpp
include/gl/texture_view.hpp
include/gl/transform_feedback.hpp
include/gl/unmanaged.hpp
include/gl/vertex_array.hpp
include/gl/vertex_post_processing_ops.hpp
include/gl/viewport.hpp

source/buffer.cpp
source/command_execution.cpp
source/compute.cpp
source/debug.cpp
source/draw_commands.cpp
source/framebuffer.cpp
source/opengl.cpp
source/per_fragment_ops.cpp
source/pipeline.cpp
source/program.cpp
source/query.cpp
source/rasterization.cpp
source/renderbuffer.cpp
source/sampler.cpp
source/shader.cpp
source/state.cpp
source/sync.cpp
source/tessellation.cpp
source/texture.cpp
source/texture_view.cpp
source/transform_feedback.cpp
source/vertex_array.cpp
source/vertex_post_processing_ops.cpp
source/viewport.cpp

license.txt
readme.md
)
include(assign_source_group)
assign_source_group(${PROJECT_SOURCES})

set (EXPORT_HEADER "${PROJECT_BINARY_DIR}/export.hpp")
list (APPEND PROJECT_SOURCES ${EXPORT_HEADER})
source_group("include\\${PROJECT_NAME}" FILES ${EXPORT_HEADER})

################################################## Dependencies ##################################################
include(import_library)

find_package (GLEW REQUIRED)
import_library(glew GLEW_INCLUDE_DIR GLEW_LIBRARY)

find_package (OpenGL REQUIRED)
import_library(opengl OPENGL_INCLUDE_DIR OPENGL_LIBRARIES)

if(CUDA_INTEROP_SUPPORT)
find_package(CUDA REQUIRED)
set(CUDA_NVCC_FLAGS
${CUDA_NVCC_FLAGS}
"-gencode=arch=compute_35,code=sm_35" # Kepler
"-gencode=arch=compute_50,code=sm_50" # Maxwell
"-gencode=arch=compute_52,code=sm_52" # Maxwell
"-gencode=arch=compute_61,code=sm_61" # Pascal
"--expt-extended-lambda")
import_library(cuda CUDA_INCLUDE_DIRS CUDA_LIBRARIES)
endif()

################################################## Targets ##################################################
add_library(${PROJECT_NAME} ${PROJECT_SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:include> PRIVATE source)
target_link_libraries(${PROJECT_NAME} PUBLIC ${PROJECT_LIBRARIES})
set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX)

string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER)
if(NOT BUILD_SHARED_LIBS)
set(DEFINITIONS "${DEFINITIONS} -D${PROJECT_NAME_UPPER}_STATIC")
endif()
if(CUDA_INTEROP_SUPPORT)
set(DEFINITIONS "${DEFINITIONS} -D${PROJECT_NAME_UPPER}_CUDA_INTEROP_SUPPORT")
endif()
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${DEFINITIONS}")

################################################## Postbuild ##################################################
include (GenerateExportHeader)
string (TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER)
generate_export_header(${PROJECT_NAME}
EXPORT_FILE_NAME export.hpp
EXPORT_MACRO_NAME ${PROJECT_NAME_UPPER}_EXPORT
STATIC_DEFINE ${PROJECT_NAME_UPPER}_STATIC
)

################################################## Testing ##################################################
if(BUILD_TESTS)
enable_testing()

set(PROJECT_TEST_SOURCES

)

foreach(_SOURCE ${PROJECT_TEST_SOURCES})
get_filename_component(_NAME ${_SOURCE} NAME_WE)
set (_SOURCES tests/catch.hpp tests/main.cpp ${_SOURCE})
add_executable (${_NAME} ${_SOURCES})
target_link_libraries (${_NAME} ${PROJECT_NAME})
add_test (${_NAME} ${_NAME})
set_property (TARGET ${_NAME} PROPERTY FOLDER "Tests")
source_group ("source" FILES ${_SOURCES})
endforeach()
endif()

################################################## Installation ##################################################
install(TARGETS ${PROJECT_NAME} EXPORT "${PROJECT_NAME}-config"
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
install(DIRECTORY include/ DESTINATION include)
install(FILES "${PROJECT_BINARY_DIR}/export.hpp" DESTINATION "include/${PROJECT_NAME}")
install(EXPORT "${PROJECT_NAME}-config" DESTINATION "cmake")
export (TARGETS "${PROJECT_NAME}" FILE "${PROJECT_NAME}-config.cmake")
17 changes: 17 additions & 0 deletions cmake/assign_source_group.cmake
@@ -0,0 +1,17 @@
# Assigns the given files to source groups identical to their location.
function(assign_source_group)
foreach(_SOURCE IN ITEMS ${ARGN})
if (IS_ABSOLUTE "${_SOURCE}")
file(RELATIVE_PATH _SOURCE_REL "${CMAKE_CURRENT_SOURCE_DIR}" "${_SOURCE}")
else()
set(_SOURCE_REL "${_SOURCE}")
endif()
get_filename_component(_SOURCE_PATH "${_SOURCE_REL}" PATH)
if(WIN32)
string(REPLACE "/" "\\" _SOURCE_PATH_MSVC "${_SOURCE_PATH}")
source_group("${_SOURCE_PATH_MSVC}" FILES "${_SOURCE}")
else()
source_group("${_SOURCE_PATH}" FILES "${_SOURCE}")
endif()
endforeach()
endfunction(assign_source_group)
29 changes: 29 additions & 0 deletions cmake/import_library.cmake
@@ -0,0 +1,29 @@
# Imports a library which is not built with cmake.
# The imported library is appended to the PROJECT_LIBRARIES variable.
# Usage:
# Header Only:
# import_library(ALIAS INCLUDE_DIRS)
# Identical Debug and Release:
# import_library(ALIAS INCLUDE_DIRS LIBRARIES)
# Separate Debug and Release:
# import_library(ALIAS INCLUDE_DIRS DEBUG_LIBRARIES RELEASE_LIBRARIES)
function(import_library ALIAS INCLUDE_DIRS)
set(ALIAS ${PROJECT_NAME}::${ALIAS})
add_library(${ALIAS} INTERFACE IMPORTED)
set_property(TARGET ${ALIAS} PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${${INCLUDE_DIRS}})

set (_EXTRA_ARGS ${ARGN})
list(LENGTH _EXTRA_ARGS _EXTRA_ARGS_LENGTH)
if (_EXTRA_ARGS_LENGTH EQUAL 1)
list (GET _EXTRA_ARGS 0 _LIBRARIES)
set_property(TARGET ${ALIAS} PROPERTY INTERFACE_LINK_LIBRARIES ${${_LIBRARIES}})
elseif(_EXTRA_ARGS_LENGTH EQUAL 2)
list (GET _EXTRA_ARGS 0 _DEBUG_LIBRARIES )
list (GET _EXTRA_ARGS 1 _RELEASE_LIBRARIES)
set_property(TARGET ${ALIAS} PROPERTY INTERFACE_LINK_LIBRARIES
$<$<CONFIG:Debug>:${${_DEBUG_LIBRARIES}}>
$<$<NOT:$<CONFIG:Debug>>:${${_RELEASE_LIBRARIES}}>)
endif ()

set(PROJECT_LIBRARIES ${PROJECT_LIBRARIES} ${ALIAS} PARENT_SCOPE)
endfunction(import_library)
56 changes: 56 additions & 0 deletions include/gl/all.hpp
@@ -0,0 +1,56 @@
// Copyright Ali Can Demiralp 2016 - 2017.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#ifndef GL_ALL_HPP_
#define GL_ALL_HPP_

// 2.3 Command execution.
#include <gl/command_execution.hpp>
// 4.1 Sync objects (uncopyable).
#include <gl/sync.hpp>
// 4.2, 4.3 Asynchronous and timer queries (uncopyable).
#include <gl/query.hpp>
// 6.0 Buffer objects.
#include <gl/buffer.hpp>
// 7.1 Shader objects (uncopyable).
#include <gl/shader.hpp>
// 7.3 Program objects (uncopyable).
#include <gl/program.hpp>
// TODO 7.4 Program pipeline objects.
#include <gl/pipeline.hpp>
// 8.1 Texture objects (uncopyable).
#include <gl/texture.hpp>
// 8.2 Sampler objects.
#include <gl/sampler.hpp>
// TODO 8.18 Texture views.
#include <gl/texture_view.hpp>
// 9.0 Framebuffer objects (uncopyable).
#include <gl/framebuffer.hpp>
// 9.2.4 Renderbuffer objects.
#include <gl/renderbuffer.hpp>
// 10.1.15, 11.2.2 Tessellation.
#include <gl/tessellation.hpp>
// 10.3 Vertex array objects (uncopyable).
#include <gl/vertex_array.hpp>
// 10.4 Drawing commands.
#include <gl/draw_commands.hpp>
// 13.0 Vertex post processing.
#include <gl/vertex_post_processing_ops.hpp>
// 13.2 Transform feedback.
#include <gl/transform_feedback.hpp>
// 13.6 Controlling viewport.
#include <gl/viewport.hpp>
// 14.0 Rasterization.
#include <gl/rasterization.hpp>
// 17.0 Per-fragment operations.
#include <gl/per_fragment_ops.hpp>
// 19.0 Compute shaders.
#include <gl/compute.hpp>
// 20.0 Debug.
#include <gl/debug.hpp>
// TODO 22.0 State and state requests.
#include <gl/state.hpp>

#endif
63 changes: 63 additions & 0 deletions include/gl/auxiliary/glm_uniforms.hpp
@@ -0,0 +1,63 @@
// Copyright Ali Can Demiralp 2016 - 2017.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#ifndef GL_AUXILIARY_GLM_UNIFORMS_HPP_
#define GL_AUXILIARY_GLM_UNIFORMS_HPP_

#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>

#include <gl/program.hpp>

namespace gl
{
#define SPECIALIZE_SET_UNIFORM_VECTORS(TYPE, GL_POSTFIX) \
template <> \
inline void program::set_uniform (GLint location, const TYPE& value) \
{ \
glProgramUniform##GL_POSTFIX##v(id_, location, 1, glm::value_ptr(value)); \
} \
template <> \
inline void program::set_uniform_vector (GLint location, const std::vector<TYPE>& values) \
{ \
glProgramUniform##GL_POSTFIX##v(id_, location, (GLsizei) values.size(), glm::value_ptr(values[0])); \
} \

SPECIALIZE_SET_UNIFORM_VECTORS(glm::ivec2, 2i )
SPECIALIZE_SET_UNIFORM_VECTORS(glm::ivec3, 3i )
SPECIALIZE_SET_UNIFORM_VECTORS(glm::ivec4, 4i )
SPECIALIZE_SET_UNIFORM_VECTORS(glm::uvec2, 2ui)
SPECIALIZE_SET_UNIFORM_VECTORS(glm::uvec3, 3ui)
SPECIALIZE_SET_UNIFORM_VECTORS(glm::uvec4, 4ui)
SPECIALIZE_SET_UNIFORM_VECTORS(glm::fvec2, 2f )
SPECIALIZE_SET_UNIFORM_VECTORS(glm::fvec3, 3f )
SPECIALIZE_SET_UNIFORM_VECTORS(glm::fvec4, 4f )
SPECIALIZE_SET_UNIFORM_VECTORS(glm::dvec2, 2d )
SPECIALIZE_SET_UNIFORM_VECTORS(glm::dvec3, 3d )
SPECIALIZE_SET_UNIFORM_VECTORS(glm::dvec4, 4d )
#undef SPECIALIZE_SET_UNIFORM_VECTORS

#define SPECIALIZE_SET_UNIFORM_MATRICES(TYPE, GL_POSTFIX) \
template <> \
inline void program::set_uniform (GLint location, const TYPE& value) \
{ \
glProgramUniformMatrix##GL_POSTFIX##v(id_, location, 1, GL_FALSE, glm::value_ptr(value)); \
} \
template <> \
inline void program::set_uniform_vector(GLint location, const std::vector<TYPE>& values) \
{ \
glProgramUniformMatrix##GL_POSTFIX##v(id_, location, (GLsizei) values.size(), GL_FALSE, glm::value_ptr(values[0])); \
} \

SPECIALIZE_SET_UNIFORM_MATRICES(glm::fmat2, 2f)
SPECIALIZE_SET_UNIFORM_MATRICES(glm::fmat3, 3f)
SPECIALIZE_SET_UNIFORM_MATRICES(glm::fmat4, 4f)
SPECIALIZE_SET_UNIFORM_MATRICES(glm::dmat2, 2d)
SPECIALIZE_SET_UNIFORM_MATRICES(glm::dmat3, 3d)
SPECIALIZE_SET_UNIFORM_MATRICES(glm::dmat4, 4d)
#undef SPECIALIZE_SET_UNIFORM_MATRICES
}

#endif

0 comments on commit dd5f7ee

Please sign in to comment.