From 2b64f003622ee7871fd7aec041622427dd2fc88f Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Fri, 19 Aug 2016 23:35:47 -0700 Subject: Updated to Diligent Engine 2.0 --- .../build/UWP/GraphicsEngine.vcxproj | 200 +++++++++ .../build/UWP/GraphicsEngine.vcxproj.filters | 2 + .../GraphicsEngine/build/Win32/Android/gcc_Debug.h | 249 +++++++++++ .../build/Win32/Android/gcc_Release.h | 249 +++++++++++ .../build/Win32/GraphicsEngine-Debug.vgdbsettings | 76 ++++ .../Win32/GraphicsEngine-Release.vgdbsettings | 76 ++++ .../build/Win32/GraphicsEngine.vcxproj | 192 +++++++++ .../build/Win32/GraphicsEngine.vcxproj.filters | 30 ++ Graphics/GraphicsEngine/build/Win32/jni/Android.mk | 24 ++ .../GraphicsEngine/build/Win32/jni/Application.mk | 7 + .../Windows.Shared/GraphicsEngine.Shared.vcxitems | 74 ++++ .../GraphicsEngine.Shared.vcxitems.filters | 153 +++++++ .../build/Windows.Shared/GraphicsEngine.props | 20 + .../build/Windows/Android/gcc_Debug.h | 249 ----------- .../build/Windows/Android/gcc_Release.h | 249 ----------- .../GraphicsEngine/build/Windows/EngineRoot.props | 18 - .../Windows/GraphicsEngine-Debug.vgdbsettings | 76 ---- .../Windows/GraphicsEngine-Release.vgdbsettings | 76 ---- .../build/Windows/GraphicsEngine.props | 10 - .../build/Windows/GraphicsEngine.vcxproj | 194 --------- .../build/Windows/GraphicsEngine.vcxproj.filters | 27 -- .../GraphicsEngine/build/Windows/jni/Android.mk | 24 -- .../build/Windows/jni/Application.mk | 7 - .../build/WindowsStore/EngineRoot.props | 18 - .../GraphicsEngine.Shared.vcxitems | 65 --- .../GraphicsEngine.Shared.vcxitems.filters | 138 ------ .../GraphicsEngine.Windows.vcxproj | 209 --------- .../GraphicsEngine.Windows.vcxproj.filters | 5 - .../GraphicsEngine.WindowsPhone.vcxproj | 144 ------- .../GraphicsEngine.WindowsPhone.vcxproj.filters | 5 - Graphics/GraphicsEngine/include/BlendStateBase.h | 76 ---- Graphics/GraphicsEngine/include/BufferBase.h | 178 +++++--- Graphics/GraphicsEngine/include/BufferViewBase.h | 24 +- Graphics/GraphicsEngine/include/CommandListBase.h | 66 +++ Graphics/GraphicsEngine/include/Defines.h | 2 +- .../GraphicsEngine/include/DepthStencilStateBase.h | 69 --- .../GraphicsEngine/include/DeviceContextBase.h | 473 +++++++++------------ Graphics/GraphicsEngine/include/DeviceObjectBase.h | 25 +- Graphics/GraphicsEngine/include/EngineMemory.h | 73 ++++ .../GraphicsEngine/include/PipelineStateBase.h | 194 +++++++++ .../GraphicsEngine/include/RasterizerStateBase.h | 69 --- Graphics/GraphicsEngine/include/RenderDeviceBase.h | 195 +++++---- .../GraphicsEngine/include/ResourceMappingImpl.h | 92 +++- Graphics/GraphicsEngine/include/SamplerBase.h | 21 +- Graphics/GraphicsEngine/include/ShaderBase.h | 191 ++++++++- .../include/ShaderResourceBindingBase.h | 75 ++++ .../GraphicsEngine/include/StateObjectsRegistry.h | 11 +- Graphics/GraphicsEngine/include/SwapChainBase.h | 27 +- Graphics/GraphicsEngine/include/TextureBase.h | 260 ++++++++--- Graphics/GraphicsEngine/include/TextureViewBase.h | 39 +- .../GraphicsEngine/include/VertexDescriptionBase.h | 96 ----- Graphics/GraphicsEngine/include/pch.h | 2 +- Graphics/GraphicsEngine/interface/BlendState.h | 201 ++++++--- Graphics/GraphicsEngine/interface/Buffer.h | 12 +- Graphics/GraphicsEngine/interface/BufferView.h | 4 +- Graphics/GraphicsEngine/interface/CommandList.h | 49 +++ Graphics/GraphicsEngine/interface/Constants.h | 2 +- .../GraphicsEngine/interface/DepthStencilState.h | 76 ++-- Graphics/GraphicsEngine/interface/DeviceCaps.h | 17 +- Graphics/GraphicsEngine/interface/DeviceContext.h | 140 +++--- Graphics/GraphicsEngine/interface/DeviceObject.h | 2 +- Graphics/GraphicsEngine/interface/GraphicsTypes.h | 126 ++++-- Graphics/GraphicsEngine/interface/InputLayout.h | 119 ++++++ Graphics/GraphicsEngine/interface/MapHelper.h | 58 ++- Graphics/GraphicsEngine/interface/PipelineState.h | 233 ++++++++++ .../GraphicsEngine/interface/RasterizerState.h | 58 +-- Graphics/GraphicsEngine/interface/RenderDevice.h | 70 +-- .../GraphicsEngine/interface/ResourceMapping.h | 38 +- Graphics/GraphicsEngine/interface/Sampler.h | 2 +- Graphics/GraphicsEngine/interface/Shader.h | 93 +++- .../interface/ShaderResourceBinding.h | 68 +++ Graphics/GraphicsEngine/interface/SwapChain.h | 2 +- Graphics/GraphicsEngine/interface/Texture.h | 54 ++- Graphics/GraphicsEngine/interface/TextureView.h | 14 +- .../GraphicsEngine/interface/VertexDescription.h | 140 ------ Graphics/GraphicsEngine/src/EngineMemory.cpp | 73 ++++ Graphics/GraphicsEngine/src/ResourceMapping.cpp | 69 ++- Graphics/GraphicsEngine/src/Texture.cpp | 45 +- Graphics/GraphicsEngine/src/pch.cpp | 2 +- 79 files changed, 3920 insertions(+), 2971 deletions(-) create mode 100644 Graphics/GraphicsEngine/build/UWP/GraphicsEngine.vcxproj create mode 100644 Graphics/GraphicsEngine/build/UWP/GraphicsEngine.vcxproj.filters create mode 100644 Graphics/GraphicsEngine/build/Win32/Android/gcc_Debug.h create mode 100644 Graphics/GraphicsEngine/build/Win32/Android/gcc_Release.h create mode 100644 Graphics/GraphicsEngine/build/Win32/GraphicsEngine-Debug.vgdbsettings create mode 100644 Graphics/GraphicsEngine/build/Win32/GraphicsEngine-Release.vgdbsettings create mode 100644 Graphics/GraphicsEngine/build/Win32/GraphicsEngine.vcxproj create mode 100644 Graphics/GraphicsEngine/build/Win32/GraphicsEngine.vcxproj.filters create mode 100644 Graphics/GraphicsEngine/build/Win32/jni/Android.mk create mode 100644 Graphics/GraphicsEngine/build/Win32/jni/Application.mk create mode 100644 Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.Shared.vcxitems create mode 100644 Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.Shared.vcxitems.filters create mode 100644 Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.props delete mode 100644 Graphics/GraphicsEngine/build/Windows/Android/gcc_Debug.h delete mode 100644 Graphics/GraphicsEngine/build/Windows/Android/gcc_Release.h delete mode 100644 Graphics/GraphicsEngine/build/Windows/EngineRoot.props delete mode 100644 Graphics/GraphicsEngine/build/Windows/GraphicsEngine-Debug.vgdbsettings delete mode 100644 Graphics/GraphicsEngine/build/Windows/GraphicsEngine-Release.vgdbsettings delete mode 100644 Graphics/GraphicsEngine/build/Windows/GraphicsEngine.props delete mode 100644 Graphics/GraphicsEngine/build/Windows/GraphicsEngine.vcxproj delete mode 100644 Graphics/GraphicsEngine/build/Windows/GraphicsEngine.vcxproj.filters delete mode 100644 Graphics/GraphicsEngine/build/Windows/jni/Android.mk delete mode 100644 Graphics/GraphicsEngine/build/Windows/jni/Application.mk delete mode 100644 Graphics/GraphicsEngine/build/WindowsStore/EngineRoot.props delete mode 100644 Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Shared/GraphicsEngine.Shared.vcxitems delete mode 100644 Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Shared/GraphicsEngine.Shared.vcxitems.filters delete mode 100644 Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Windows/GraphicsEngine.Windows.vcxproj delete mode 100644 Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Windows/GraphicsEngine.Windows.vcxproj.filters delete mode 100644 Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.WindowsPhone/GraphicsEngine.WindowsPhone.vcxproj delete mode 100644 Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.WindowsPhone/GraphicsEngine.WindowsPhone.vcxproj.filters delete mode 100644 Graphics/GraphicsEngine/include/BlendStateBase.h create mode 100644 Graphics/GraphicsEngine/include/CommandListBase.h delete mode 100644 Graphics/GraphicsEngine/include/DepthStencilStateBase.h create mode 100644 Graphics/GraphicsEngine/include/EngineMemory.h create mode 100644 Graphics/GraphicsEngine/include/PipelineStateBase.h delete mode 100644 Graphics/GraphicsEngine/include/RasterizerStateBase.h create mode 100644 Graphics/GraphicsEngine/include/ShaderResourceBindingBase.h delete mode 100644 Graphics/GraphicsEngine/include/VertexDescriptionBase.h create mode 100644 Graphics/GraphicsEngine/interface/CommandList.h create mode 100644 Graphics/GraphicsEngine/interface/InputLayout.h create mode 100644 Graphics/GraphicsEngine/interface/PipelineState.h create mode 100644 Graphics/GraphicsEngine/interface/ShaderResourceBinding.h delete mode 100644 Graphics/GraphicsEngine/interface/VertexDescription.h create mode 100644 Graphics/GraphicsEngine/src/EngineMemory.cpp (limited to 'Graphics/GraphicsEngine') diff --git a/Graphics/GraphicsEngine/build/UWP/GraphicsEngine.vcxproj b/Graphics/GraphicsEngine/build/UWP/GraphicsEngine.vcxproj new file mode 100644 index 00000000..883c9e2f --- /dev/null +++ b/Graphics/GraphicsEngine/build/UWP/GraphicsEngine.vcxproj @@ -0,0 +1,200 @@ + + + + + Debug + ARM + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + Win32 + + + Release + x64 + + + + {dfe6435d-cc9d-4ca1-bf4e-5640c522d815} + StaticLibrary + GraphicsEngine + en-US + 14.0 + true + Windows Store + 10.0.10586.0 + 10.0.10240.0 + 10.0 + + + + StaticLibrary + true + v140 + + + StaticLibrary + true + v140 + + + StaticLibrary + true + v140 + + + StaticLibrary + false + true + v140 + + + StaticLibrary + false + true + v140 + + + StaticLibrary + false + true + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + false + + + false + + + false + + + false + + + + false + true + + + Console + false + false + + + + + false + true + + + Console + false + false + + + + + false + true + + + Console + false + false + + + + + false + true + + + Console + false + false + + + + + false + true + + + Console + false + false + + + + + false + true + + + Console + false + false + + + + + + \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/UWP/GraphicsEngine.vcxproj.filters b/Graphics/GraphicsEngine/build/UWP/GraphicsEngine.vcxproj.filters new file mode 100644 index 00000000..c31757ec --- /dev/null +++ b/Graphics/GraphicsEngine/build/UWP/GraphicsEngine.vcxproj.filters @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Win32/Android/gcc_Debug.h b/Graphics/GraphicsEngine/build/Win32/Android/gcc_Debug.h new file mode 100644 index 00000000..da574716 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Win32/Android/gcc_Debug.h @@ -0,0 +1,249 @@ +/* + This file is only used by IntelliSense (VisualStudio code suggestion system) + DO NOT INCLUDE THIS FILE FROM YOUR ACTUAL SOURCE FILES. + This file lists the preprocessor macros extracted from your GCC. + It is needed for IntelliSense to parse other header files correctly. +*/ +#ifdef _MSC_VER +#define __DBL_MIN_EXP__ (-1021) +#define __UINT_LEAST16_MAX__ 65535 +#define __FLT_MIN__ 1.1754943508222875e-38F +#define __UINT_LEAST8_TYPE__ unsigned char +#define __CHAR_BIT__ 8 +#define __UINT8_MAX__ 255 +#define __ANDROID__ 1 +#define __WINT_MAX__ 4294967295U +#define R3000 1 +#define __ORDER_LITTLE_ENDIAN__ 1234 +#define __SIZE_MAX__ 4294967295U +#define __WCHAR_MAX__ 2147483647 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 +#define __DBL_DENORM_MIN__ double(4.9406564584124654e-324L) +#define __FLT_EVAL_METHOD__ 0 +#define __unix__ 1 +#define _MIPS_ISA _MIPS_ISA_MIPS32 +#define __UINT_FAST64_MAX__ 18446744073709551615ULL +#define __SIG_ATOMIC_TYPE__ int +#define __DBL_MIN_10_EXP__ (-307) +#define __FINITE_MATH_ONLY__ 0 +#define _MIPS_TUNE "mips32" +#define _ABIO32 1 +#define __GNUC_PATCHLEVEL__ 0 +#define __UINT_FAST8_MAX__ 255 +#define __DEC64_MAX_EXP__ 385 +#define __UINT_LEAST64_MAX__ 18446744073709551615ULL +#define __SHRT_MAX__ 32767 +#define __LDBL_MAX__ 1.7976931348623157e+308L +#define __UINT_LEAST8_MAX__ 255 +#define __mips_abicalls 1 +#define __UINTMAX_TYPE__ long long unsigned int +#define __linux 1 +#define __DEC32_EPSILON__ 1E-6DF +#define __unix 1 +#define __UINT32_MAX__ 4294967295U +#define __LDBL_MAX_EXP__ 1024 +#define __LANGUAGE_C_PLUS_PLUS 1 +#define __WINT_MIN__ 0U +#define __MIPSEL__ 1 +#define __linux__ 1 +#define __SCHAR_MAX__ 127 +#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) +#define __DBL_DIG__ 15 +#define __SIZEOF_INT__ 4 +#define __SIZEOF_POINTER__ 4 +#define __USER_LABEL_PREFIX__ +#define __STDC_HOSTED__ 1 +#define __LDBL_HAS_INFINITY__ 1 +#define __mips_fpr 32 +#define __FLT_EPSILON__ 1.1920928955078125e-7F +#define __GXX_WEAK__ 1 +#define __mips__ 1 +#define __LDBL_MIN__ 2.2250738585072014e-308L +#define __DEC32_MAX__ 9.999999E96DF +#define MIPSEL 1 +#define __INT32_MAX__ 2147483647 +#define __SIZEOF_LONG__ 4 +#define __DECIMAL_DIG__ 17 +#define __LDBL_HAS_QUIET_NAN__ 1 +#define __GNUC__ 4 +#define __GXX_RTTI 1 +#define __FLT_HAS_DENORM__ 1 +#define __SIZEOF_LONG_DOUBLE__ 8 +#define _R3000 1 +#define __BIGGEST_ALIGNMENT__ 8 +#define __DBL_MAX__ double(1.7976931348623157e+308L) +#define __INT_FAST32_MAX__ 2147483647 +#define __DBL_HAS_INFINITY__ 1 +#define __INT64_MAX__ 9223372036854775807LL +#define __DEC32_MIN_EXP__ (-94) +#define __INT_FAST16_TYPE__ int +#define __LDBL_HAS_DENORM__ 1 +#define __cplusplus 1 +#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL +#define __INT_LEAST32_MAX__ 2147483647 +#define __DEC32_MIN__ 1E-95DF +#define __DEPRECATED 1 +#define __DBL_MAX_EXP__ 1024 +#define __R3000__ 1 +#define __DEC128_EPSILON__ 1E-33DL +#define __PTRDIFF_MAX__ 2147483647 +#define mips 1 +#define __GNUG__ 4 +#define __LANGUAGE_C_PLUS_PLUS__ 1 +#define __LONG_LONG_MAX__ 9223372036854775807LL +#define __SIZEOF_SIZE_T__ 4 +#define __SIZEOF_WINT_T__ 4 +#define __GCC_HAVE_DWARF2_CFI_ASM 1 +#define __GXX_ABI_VERSION 1002 +#define __FLT_MIN_EXP__ (-125) +#define __INT_FAST64_TYPE__ long long int +#define _MIPSEL 1 +#define __DBL_MIN__ double(2.2250738585072014e-308L) +#define _MIPS_ARCH "mips32" +#define __FLT_MIN_10_EXP__ (-37) +#define __DEC128_MIN__ 1E-6143DL +#define __REGISTER_PREFIX__ +#define __UINT16_MAX__ 65535 +#define __DBL_HAS_DENORM__ 1 +#define __UINT8_TYPE__ unsigned char +#define __NO_INLINE__ 1 +#define __R3000 1 +#define __FLT_MANT_DIG__ 24 +#define __VERSION__ "4.6 20120106 (prerelease)" +#define _LANGUAGE_C_PLUS_PLUS 1 +#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __DEC64_EPSILON__ 1E-15DD +#define __ORDER_PDP_ENDIAN__ 3412 +#define __DEC128_MIN_EXP__ (-6142) +#define __INT_FAST32_TYPE__ int +#define __UINT_LEAST16_TYPE__ short unsigned int +#define unix 1 +#define _MIPS_ARCH_MIPS32 1 +#define __INT16_MAX__ 32767 +#define __SIZE_TYPE__ unsigned int +#define __UINT64_MAX__ 18446744073709551615ULL +#define __INT8_TYPE__ signed char +#define __ELF__ 1 +#define __mips_isa_rev 1 +#define _MIPS_TUNE_MIPS32 1 +#define __FLT_RADIX__ 2 +#define __INT_LEAST16_TYPE__ short int +#define __LDBL_EPSILON__ 2.2204460492503131e-16L +#define __SIG_ATOMIC_MAX__ 2147483647 +#define __SIZEOF_PTRDIFF_T__ 4 +#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF +#define __INT_FAST16_MAX__ 2147483647 +#define _MIPS_SZPTR 32 +#define __UINT_FAST32_MAX__ 4294967295U +#define __UINT_LEAST64_TYPE__ long long unsigned int +#define __FLT_HAS_QUIET_NAN__ 1 +#define __FLT_MAX_10_EXP__ 38 +#define __LONG_MAX__ 2147483647L +#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL +#define __FLT_HAS_INFINITY__ 1 +#define __UINT_FAST16_TYPE__ unsigned int +#define __DEC64_MAX__ 9.999999999999999E384DD +#define __CHAR16_TYPE__ short unsigned int +#define __PRAGMA_REDEFINE_EXTNAME 1 +#define __INT_LEAST16_MAX__ 32767 +#define __DEC64_MANT_DIG__ 16 +#define __UINT_LEAST32_MAX__ 4294967295U +#define __INT_LEAST64_TYPE__ long long int +#define __INT16_TYPE__ short int +#define __INT_LEAST8_TYPE__ signed char +#define _mips 1 +#define __DEC32_MAX_EXP__ 97 +#define __INT_FAST8_MAX__ 127 +#define __INTPTR_MAX__ 2147483647 +#define linux 1 +#define _MIPS_SZINT 32 +#define __EXCEPTIONS 1 +#define __LDBL_MANT_DIG__ 53 +#define __DBL_HAS_QUIET_NAN__ 1 +#define __MIPSEL 1 +#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) +#define __GCC_HAVE_BUILTIN_MIPS_CACHE 1 +#define __INTPTR_TYPE__ int +#define __UINT16_TYPE__ short unsigned int +#define __WCHAR_TYPE__ int +#define __SIZEOF_FLOAT__ 4 +#define __pic__ 1 +#define __UINTPTR_MAX__ 4294967295U +#define __DEC64_MIN_EXP__ (-382) +#define __INT_FAST64_MAX__ 9223372036854775807LL +#define __FLT_DIG__ 6 +#define __UINT_FAST64_TYPE__ long long unsigned int +#define __INT_MAX__ 2147483647 +#define __INT64_TYPE__ long long int +#define __FLT_MAX_EXP__ 128 +#define _MIPS_SIM _ABIO32 +#define __DBL_MANT_DIG__ 53 +#define __INT_LEAST64_MAX__ 9223372036854775807LL +#define __DEC64_MIN__ 1E-383DD +#define __WINT_TYPE__ unsigned int +#define __UINT_LEAST32_TYPE__ unsigned int +#define __SIZEOF_SHORT__ 2 +#define __LDBL_MIN_EXP__ (-1021) +#define _MIPS_FPSET 16 +#define __INT_LEAST8_MAX__ 127 +#define __LDBL_MAX_10_EXP__ 308 +#define __DBL_EPSILON__ double(2.2204460492503131e-16L) +#define __INT_LEAST32_TYPE__ int +#define __SIZEOF_WCHAR_T__ 4 +#define __UINT64_TYPE__ long long unsigned int +#define __INT_FAST8_TYPE__ signed char +#define __DBL_DECIMAL_DIG__ 17 +#define __DEC_EVAL_METHOD__ 2 +#define __ORDER_BIG_ENDIAN__ 4321 +#define __INTMAX_MAX__ 9223372036854775807LL +#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __FLT_DENORM_MIN__ 1.4012984643248171e-45F +#define __INT8_MAX__ 127 +#define __PIC__ 1 +#define __UINT_FAST32_TYPE__ unsigned int +#define __CHAR32_TYPE__ unsigned int +#define __FLT_MAX__ 3.4028234663852886e+38F +#define __INT32_TYPE__ int +#define __SIZEOF_DOUBLE__ 8 +#define __INTMAX_TYPE__ long long int +#define __DEC128_MAX_EXP__ 6145 +#define __GNUC_MINOR__ 6 +#define __UINTMAX_MAX__ 18446744073709551615ULL +#define __DEC32_MANT_DIG__ 7 +#define __DBL_MAX_10_EXP__ 308 +#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L +#define __STDC__ 1 +#define __mips_hard_float 1 +#define __PTRDIFF_TYPE__ int +#define __mips 32 +#define __UINT32_TYPE__ unsigned int +#define _MIPS_SZLONG 32 +#define __UINTPTR_TYPE__ unsigned int +#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD +#define __DEC128_MANT_DIG__ 34 +#define __LDBL_MIN_10_EXP__ (-307) +#define __SIZEOF_LONG_LONG__ 8 +#define __LDBL_DIG__ 15 +#define __FLT_DECIMAL_DIG__ 9 +#define __UINT_FAST16_MAX__ 4294967295U +#define __GNUC_GNU_INLINE__ 1 +#define __UINT_FAST8_TYPE__ unsigned char +#define _GNU_SOURCE 1 +#define ANDROID +#endif + +// --- Include directories begin --- // +//C:/Android/ndk/platforms/android-9/arch-mips/usr/include +//C:\Android\ndk\toolchains\mipsel-linux-android-4.6\prebuilt\windows\bin\../lib/gcc/mipsel-linux-android/4.6/include +//C:\Android\ndk\toolchains\mipsel-linux-android-4.6\prebuilt\windows\bin\../lib/gcc/mipsel-linux-android/4.6/include-fixed +// --- Library directories end --- // + + +// --- Library directories begin --- // +//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/mipsel-linux-android/4.6/ +//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/ +//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/mipsel-linux-android/4.6/../../../../mipsel-linux-android/lib/ +// --- Library directories begin --- // + diff --git a/Graphics/GraphicsEngine/build/Win32/Android/gcc_Release.h b/Graphics/GraphicsEngine/build/Win32/Android/gcc_Release.h new file mode 100644 index 00000000..da574716 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Win32/Android/gcc_Release.h @@ -0,0 +1,249 @@ +/* + This file is only used by IntelliSense (VisualStudio code suggestion system) + DO NOT INCLUDE THIS FILE FROM YOUR ACTUAL SOURCE FILES. + This file lists the preprocessor macros extracted from your GCC. + It is needed for IntelliSense to parse other header files correctly. +*/ +#ifdef _MSC_VER +#define __DBL_MIN_EXP__ (-1021) +#define __UINT_LEAST16_MAX__ 65535 +#define __FLT_MIN__ 1.1754943508222875e-38F +#define __UINT_LEAST8_TYPE__ unsigned char +#define __CHAR_BIT__ 8 +#define __UINT8_MAX__ 255 +#define __ANDROID__ 1 +#define __WINT_MAX__ 4294967295U +#define R3000 1 +#define __ORDER_LITTLE_ENDIAN__ 1234 +#define __SIZE_MAX__ 4294967295U +#define __WCHAR_MAX__ 2147483647 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 +#define __DBL_DENORM_MIN__ double(4.9406564584124654e-324L) +#define __FLT_EVAL_METHOD__ 0 +#define __unix__ 1 +#define _MIPS_ISA _MIPS_ISA_MIPS32 +#define __UINT_FAST64_MAX__ 18446744073709551615ULL +#define __SIG_ATOMIC_TYPE__ int +#define __DBL_MIN_10_EXP__ (-307) +#define __FINITE_MATH_ONLY__ 0 +#define _MIPS_TUNE "mips32" +#define _ABIO32 1 +#define __GNUC_PATCHLEVEL__ 0 +#define __UINT_FAST8_MAX__ 255 +#define __DEC64_MAX_EXP__ 385 +#define __UINT_LEAST64_MAX__ 18446744073709551615ULL +#define __SHRT_MAX__ 32767 +#define __LDBL_MAX__ 1.7976931348623157e+308L +#define __UINT_LEAST8_MAX__ 255 +#define __mips_abicalls 1 +#define __UINTMAX_TYPE__ long long unsigned int +#define __linux 1 +#define __DEC32_EPSILON__ 1E-6DF +#define __unix 1 +#define __UINT32_MAX__ 4294967295U +#define __LDBL_MAX_EXP__ 1024 +#define __LANGUAGE_C_PLUS_PLUS 1 +#define __WINT_MIN__ 0U +#define __MIPSEL__ 1 +#define __linux__ 1 +#define __SCHAR_MAX__ 127 +#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) +#define __DBL_DIG__ 15 +#define __SIZEOF_INT__ 4 +#define __SIZEOF_POINTER__ 4 +#define __USER_LABEL_PREFIX__ +#define __STDC_HOSTED__ 1 +#define __LDBL_HAS_INFINITY__ 1 +#define __mips_fpr 32 +#define __FLT_EPSILON__ 1.1920928955078125e-7F +#define __GXX_WEAK__ 1 +#define __mips__ 1 +#define __LDBL_MIN__ 2.2250738585072014e-308L +#define __DEC32_MAX__ 9.999999E96DF +#define MIPSEL 1 +#define __INT32_MAX__ 2147483647 +#define __SIZEOF_LONG__ 4 +#define __DECIMAL_DIG__ 17 +#define __LDBL_HAS_QUIET_NAN__ 1 +#define __GNUC__ 4 +#define __GXX_RTTI 1 +#define __FLT_HAS_DENORM__ 1 +#define __SIZEOF_LONG_DOUBLE__ 8 +#define _R3000 1 +#define __BIGGEST_ALIGNMENT__ 8 +#define __DBL_MAX__ double(1.7976931348623157e+308L) +#define __INT_FAST32_MAX__ 2147483647 +#define __DBL_HAS_INFINITY__ 1 +#define __INT64_MAX__ 9223372036854775807LL +#define __DEC32_MIN_EXP__ (-94) +#define __INT_FAST16_TYPE__ int +#define __LDBL_HAS_DENORM__ 1 +#define __cplusplus 1 +#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL +#define __INT_LEAST32_MAX__ 2147483647 +#define __DEC32_MIN__ 1E-95DF +#define __DEPRECATED 1 +#define __DBL_MAX_EXP__ 1024 +#define __R3000__ 1 +#define __DEC128_EPSILON__ 1E-33DL +#define __PTRDIFF_MAX__ 2147483647 +#define mips 1 +#define __GNUG__ 4 +#define __LANGUAGE_C_PLUS_PLUS__ 1 +#define __LONG_LONG_MAX__ 9223372036854775807LL +#define __SIZEOF_SIZE_T__ 4 +#define __SIZEOF_WINT_T__ 4 +#define __GCC_HAVE_DWARF2_CFI_ASM 1 +#define __GXX_ABI_VERSION 1002 +#define __FLT_MIN_EXP__ (-125) +#define __INT_FAST64_TYPE__ long long int +#define _MIPSEL 1 +#define __DBL_MIN__ double(2.2250738585072014e-308L) +#define _MIPS_ARCH "mips32" +#define __FLT_MIN_10_EXP__ (-37) +#define __DEC128_MIN__ 1E-6143DL +#define __REGISTER_PREFIX__ +#define __UINT16_MAX__ 65535 +#define __DBL_HAS_DENORM__ 1 +#define __UINT8_TYPE__ unsigned char +#define __NO_INLINE__ 1 +#define __R3000 1 +#define __FLT_MANT_DIG__ 24 +#define __VERSION__ "4.6 20120106 (prerelease)" +#define _LANGUAGE_C_PLUS_PLUS 1 +#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __DEC64_EPSILON__ 1E-15DD +#define __ORDER_PDP_ENDIAN__ 3412 +#define __DEC128_MIN_EXP__ (-6142) +#define __INT_FAST32_TYPE__ int +#define __UINT_LEAST16_TYPE__ short unsigned int +#define unix 1 +#define _MIPS_ARCH_MIPS32 1 +#define __INT16_MAX__ 32767 +#define __SIZE_TYPE__ unsigned int +#define __UINT64_MAX__ 18446744073709551615ULL +#define __INT8_TYPE__ signed char +#define __ELF__ 1 +#define __mips_isa_rev 1 +#define _MIPS_TUNE_MIPS32 1 +#define __FLT_RADIX__ 2 +#define __INT_LEAST16_TYPE__ short int +#define __LDBL_EPSILON__ 2.2204460492503131e-16L +#define __SIG_ATOMIC_MAX__ 2147483647 +#define __SIZEOF_PTRDIFF_T__ 4 +#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF +#define __INT_FAST16_MAX__ 2147483647 +#define _MIPS_SZPTR 32 +#define __UINT_FAST32_MAX__ 4294967295U +#define __UINT_LEAST64_TYPE__ long long unsigned int +#define __FLT_HAS_QUIET_NAN__ 1 +#define __FLT_MAX_10_EXP__ 38 +#define __LONG_MAX__ 2147483647L +#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL +#define __FLT_HAS_INFINITY__ 1 +#define __UINT_FAST16_TYPE__ unsigned int +#define __DEC64_MAX__ 9.999999999999999E384DD +#define __CHAR16_TYPE__ short unsigned int +#define __PRAGMA_REDEFINE_EXTNAME 1 +#define __INT_LEAST16_MAX__ 32767 +#define __DEC64_MANT_DIG__ 16 +#define __UINT_LEAST32_MAX__ 4294967295U +#define __INT_LEAST64_TYPE__ long long int +#define __INT16_TYPE__ short int +#define __INT_LEAST8_TYPE__ signed char +#define _mips 1 +#define __DEC32_MAX_EXP__ 97 +#define __INT_FAST8_MAX__ 127 +#define __INTPTR_MAX__ 2147483647 +#define linux 1 +#define _MIPS_SZINT 32 +#define __EXCEPTIONS 1 +#define __LDBL_MANT_DIG__ 53 +#define __DBL_HAS_QUIET_NAN__ 1 +#define __MIPSEL 1 +#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) +#define __GCC_HAVE_BUILTIN_MIPS_CACHE 1 +#define __INTPTR_TYPE__ int +#define __UINT16_TYPE__ short unsigned int +#define __WCHAR_TYPE__ int +#define __SIZEOF_FLOAT__ 4 +#define __pic__ 1 +#define __UINTPTR_MAX__ 4294967295U +#define __DEC64_MIN_EXP__ (-382) +#define __INT_FAST64_MAX__ 9223372036854775807LL +#define __FLT_DIG__ 6 +#define __UINT_FAST64_TYPE__ long long unsigned int +#define __INT_MAX__ 2147483647 +#define __INT64_TYPE__ long long int +#define __FLT_MAX_EXP__ 128 +#define _MIPS_SIM _ABIO32 +#define __DBL_MANT_DIG__ 53 +#define __INT_LEAST64_MAX__ 9223372036854775807LL +#define __DEC64_MIN__ 1E-383DD +#define __WINT_TYPE__ unsigned int +#define __UINT_LEAST32_TYPE__ unsigned int +#define __SIZEOF_SHORT__ 2 +#define __LDBL_MIN_EXP__ (-1021) +#define _MIPS_FPSET 16 +#define __INT_LEAST8_MAX__ 127 +#define __LDBL_MAX_10_EXP__ 308 +#define __DBL_EPSILON__ double(2.2204460492503131e-16L) +#define __INT_LEAST32_TYPE__ int +#define __SIZEOF_WCHAR_T__ 4 +#define __UINT64_TYPE__ long long unsigned int +#define __INT_FAST8_TYPE__ signed char +#define __DBL_DECIMAL_DIG__ 17 +#define __DEC_EVAL_METHOD__ 2 +#define __ORDER_BIG_ENDIAN__ 4321 +#define __INTMAX_MAX__ 9223372036854775807LL +#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __FLT_DENORM_MIN__ 1.4012984643248171e-45F +#define __INT8_MAX__ 127 +#define __PIC__ 1 +#define __UINT_FAST32_TYPE__ unsigned int +#define __CHAR32_TYPE__ unsigned int +#define __FLT_MAX__ 3.4028234663852886e+38F +#define __INT32_TYPE__ int +#define __SIZEOF_DOUBLE__ 8 +#define __INTMAX_TYPE__ long long int +#define __DEC128_MAX_EXP__ 6145 +#define __GNUC_MINOR__ 6 +#define __UINTMAX_MAX__ 18446744073709551615ULL +#define __DEC32_MANT_DIG__ 7 +#define __DBL_MAX_10_EXP__ 308 +#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L +#define __STDC__ 1 +#define __mips_hard_float 1 +#define __PTRDIFF_TYPE__ int +#define __mips 32 +#define __UINT32_TYPE__ unsigned int +#define _MIPS_SZLONG 32 +#define __UINTPTR_TYPE__ unsigned int +#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD +#define __DEC128_MANT_DIG__ 34 +#define __LDBL_MIN_10_EXP__ (-307) +#define __SIZEOF_LONG_LONG__ 8 +#define __LDBL_DIG__ 15 +#define __FLT_DECIMAL_DIG__ 9 +#define __UINT_FAST16_MAX__ 4294967295U +#define __GNUC_GNU_INLINE__ 1 +#define __UINT_FAST8_TYPE__ unsigned char +#define _GNU_SOURCE 1 +#define ANDROID +#endif + +// --- Include directories begin --- // +//C:/Android/ndk/platforms/android-9/arch-mips/usr/include +//C:\Android\ndk\toolchains\mipsel-linux-android-4.6\prebuilt\windows\bin\../lib/gcc/mipsel-linux-android/4.6/include +//C:\Android\ndk\toolchains\mipsel-linux-android-4.6\prebuilt\windows\bin\../lib/gcc/mipsel-linux-android/4.6/include-fixed +// --- Library directories end --- // + + +// --- Library directories begin --- // +//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/mipsel-linux-android/4.6/ +//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/ +//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/mipsel-linux-android/4.6/../../../../mipsel-linux-android/lib/ +// --- Library directories begin --- // + diff --git a/Graphics/GraphicsEngine/build/Win32/GraphicsEngine-Debug.vgdbsettings b/Graphics/GraphicsEngine/build/Win32/GraphicsEngine-Debug.vgdbsettings new file mode 100644 index 00000000..3f5b24b1 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Win32/GraphicsEngine-Debug.vgdbsettings @@ -0,0 +1,76 @@ + + + Debug + + + + MinGWWindowsSlash + + $(ProjectDir) + + + android-19 + true + true + bin;obj + false + false + + + + + + false + false + true + false + false + false + false + true + false + KillApp + + false + false + false + false + false + false + false + false + + false + false + main + true + + + false + false + 5039 + 5039 + 10000 + 0 + false + Ask + true + true + + + + + + + + + + + Default + + + + true + + + \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Win32/GraphicsEngine-Release.vgdbsettings b/Graphics/GraphicsEngine/build/Win32/GraphicsEngine-Release.vgdbsettings new file mode 100644 index 00000000..669691f2 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Win32/GraphicsEngine-Release.vgdbsettings @@ -0,0 +1,76 @@ + + + Release + + + + MinGWWindowsSlash + + $(ProjectDir) + + + android-19 + false + true + bin;obj + false + false + + + + + + false + false + true + false + false + false + false + true + false + KillApp + + false + false + false + false + false + false + false + false + + false + false + main + true + + + false + false + 5039 + 5039 + 10000 + 0 + false + Ask + true + true + + + + + + + + + + + Default + + + + true + + + \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Win32/GraphicsEngine.vcxproj b/Graphics/GraphicsEngine/build/Win32/GraphicsEngine.vcxproj new file mode 100644 index 00000000..f2e38dc4 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Win32/GraphicsEngine.vcxproj @@ -0,0 +1,192 @@ + + + + + Debug + ARM + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + Win32 + + + Release + x64 + + + + {052DD700-477C-4512-A7F4-B05EBEF5C80E} + Win32Proj + RenderEngine + GraphicsEngine + + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + false + true + Unicode + v140 + + + StaticLibrary + false + true + Unicode + v140 + + + v120 + Makefile + + + v120 + Makefile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(ProjectDir)\Android\gcc_Debug.h;$(NMakeForcedIncludes) + + + $(ProjectDir)\Android\gcc_Release.h;$(NMakeForcedIncludes) + + + + Disabled + _LIB;%(PreprocessorDefinitions) + + + Windows + true + + + + + Disabled + _LIB;%(PreprocessorDefinitions) + + + Windows + true + + + MachineX64 + + + + + MaxSpeed + true + true + _LIB;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + + + MaxSpeed + true + true + _LIB;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + MachineX64 + + + + + + + + + true + true + true + true + + + true + true + true + true + + + true + true + true + true + + + + + + \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Win32/GraphicsEngine.vcxproj.filters b/Graphics/GraphicsEngine/build/Win32/GraphicsEngine.vcxproj.filters new file mode 100644 index 00000000..6bcb0a74 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Win32/GraphicsEngine.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {8939e7b7-453a-4762-9f92-ad0a2915609f} + + + {551d0b50-542f-47e1-8e7b-6b382176f2b1} + + + + + jni + + + jni + + + + + android_src + + + android_src + + + android_src + + + \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Win32/jni/Android.mk b/Graphics/GraphicsEngine/build/Win32/jni/Android.mk new file mode 100644 index 00000000..a2975140 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Win32/jni/Android.mk @@ -0,0 +1,24 @@ +# Android NDK project makefile autogenerated by Premake + +# Preamble +DEPENDENCY_PATH := $(call my-dir) +LOCAL_PATH := $(abspath $(DEPENDENCY_PATH)) +include $(CLEAR_VARS) + + +# Project configuration +LOCAL_MODULE := GraphicsEngine +LOCAL_CFLAGS := -std=c++11 +LOCAL_CPP_FEATURES := exceptions +LOCAL_STATIC_LIBRARIES += + +# Include paths +PROJECT_ROOT := $(LOCAL_PATH)/../../.. +SOLUTION_ROOT := $(PROJECT_ROOT)/../.. +LOCAL_C_INCLUDES := $(PROJECT_ROOT)/include $(PROJECT_ROOT)/interface $(SOLUTION_ROOT)/Common/include $(SOLUTION_ROOT)/Common/interface $(SOLUTION_ROOT)/Platforms/interface $(SOLUTION_ROOT)/Graphics/GraphicsTools/include + +# Source files +#VisualGDBAndroid: AutoUpdateSourcesInNextLine +LOCAL_SRC_FILES := ../../../src/EngineMemory.cpp ../../../src/ResourceMapping.cpp ../../../src/Texture.cpp + +include $(BUILD_STATIC_LIBRARY) diff --git a/Graphics/GraphicsEngine/build/Win32/jni/Application.mk b/Graphics/GraphicsEngine/build/Win32/jni/Application.mk new file mode 100644 index 00000000..45f02b20 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Win32/jni/Application.mk @@ -0,0 +1,7 @@ +# Generated by VisualGDB + +DEPENDENCY_PATH := $(call my-dir) +LOCAL_PATH := $(abspath $(DEPENDENCY_PATH)) +include $(LOCAL_PATH)/../../../../../Common/make/AppCommon.mk + +APP_MODULES := GraphicsEngine \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.Shared.vcxitems b/Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.Shared.vcxitems new file mode 100644 index 00000000..b388caf2 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.Shared.vcxitems @@ -0,0 +1,74 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {0cdd843c-089d-4fee-be9f-c08fa2b51acb} + GraphicsEngine + GraphicsEngine.Shared + 248F659F-DAC5-46E8-AC09-60EC9FC95053 + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.Shared.vcxitems.filters b/Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.Shared.vcxitems.filters new file mode 100644 index 00000000..4a458938 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.Shared.vcxitems.filters @@ -0,0 +1,153 @@ + + + + + {32eded03-121f-406a-8a23-6721ca9116ee} + + + {d881c412-cc78-41fb-997c-0d6543c1e477} + + + {c38a8d65-5100-44be-b1a5-453d901c892f} + + + + + src + + + src + + + src + + + src + + + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + interface + + + include + + + interface + + + interface + + + include + + + interface + + + interface + + + include + + + include + + + interface + + + include + + + + + + \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.props b/Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.props new file mode 100644 index 00000000..53a6cd34 --- /dev/null +++ b/Graphics/GraphicsEngine/build/Windows.Shared/GraphicsEngine.props @@ -0,0 +1,20 @@ + + + + + ..\..\..\.. + ..\..\.. + + + $(GraphicsRoot)\GraphicsEngine\include;$(GraphicsRoot)\GraphicsEngine\interface;$(GraphicsRoot)\GraphicsTools\include;$(EngineRoot)\Common\include;$(EngineRoot)\Common\interface;$(EngineRoot)\Platforms\interface;$(VC_IncludePath);$(WindowsSDK_IncludePath);$(IncludePath) + + + + + $(EngineRoot) + + + $(GraphicsRoot) + + + \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Windows/Android/gcc_Debug.h b/Graphics/GraphicsEngine/build/Windows/Android/gcc_Debug.h deleted file mode 100644 index da574716..00000000 --- a/Graphics/GraphicsEngine/build/Windows/Android/gcc_Debug.h +++ /dev/null @@ -1,249 +0,0 @@ -/* - This file is only used by IntelliSense (VisualStudio code suggestion system) - DO NOT INCLUDE THIS FILE FROM YOUR ACTUAL SOURCE FILES. - This file lists the preprocessor macros extracted from your GCC. - It is needed for IntelliSense to parse other header files correctly. -*/ -#ifdef _MSC_VER -#define __DBL_MIN_EXP__ (-1021) -#define __UINT_LEAST16_MAX__ 65535 -#define __FLT_MIN__ 1.1754943508222875e-38F -#define __UINT_LEAST8_TYPE__ unsigned char -#define __CHAR_BIT__ 8 -#define __UINT8_MAX__ 255 -#define __ANDROID__ 1 -#define __WINT_MAX__ 4294967295U -#define R3000 1 -#define __ORDER_LITTLE_ENDIAN__ 1234 -#define __SIZE_MAX__ 4294967295U -#define __WCHAR_MAX__ 2147483647 -#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 -#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 -#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 -#define __DBL_DENORM_MIN__ double(4.9406564584124654e-324L) -#define __FLT_EVAL_METHOD__ 0 -#define __unix__ 1 -#define _MIPS_ISA _MIPS_ISA_MIPS32 -#define __UINT_FAST64_MAX__ 18446744073709551615ULL -#define __SIG_ATOMIC_TYPE__ int -#define __DBL_MIN_10_EXP__ (-307) -#define __FINITE_MATH_ONLY__ 0 -#define _MIPS_TUNE "mips32" -#define _ABIO32 1 -#define __GNUC_PATCHLEVEL__ 0 -#define __UINT_FAST8_MAX__ 255 -#define __DEC64_MAX_EXP__ 385 -#define __UINT_LEAST64_MAX__ 18446744073709551615ULL -#define __SHRT_MAX__ 32767 -#define __LDBL_MAX__ 1.7976931348623157e+308L -#define __UINT_LEAST8_MAX__ 255 -#define __mips_abicalls 1 -#define __UINTMAX_TYPE__ long long unsigned int -#define __linux 1 -#define __DEC32_EPSILON__ 1E-6DF -#define __unix 1 -#define __UINT32_MAX__ 4294967295U -#define __LDBL_MAX_EXP__ 1024 -#define __LANGUAGE_C_PLUS_PLUS 1 -#define __WINT_MIN__ 0U -#define __MIPSEL__ 1 -#define __linux__ 1 -#define __SCHAR_MAX__ 127 -#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) -#define __DBL_DIG__ 15 -#define __SIZEOF_INT__ 4 -#define __SIZEOF_POINTER__ 4 -#define __USER_LABEL_PREFIX__ -#define __STDC_HOSTED__ 1 -#define __LDBL_HAS_INFINITY__ 1 -#define __mips_fpr 32 -#define __FLT_EPSILON__ 1.1920928955078125e-7F -#define __GXX_WEAK__ 1 -#define __mips__ 1 -#define __LDBL_MIN__ 2.2250738585072014e-308L -#define __DEC32_MAX__ 9.999999E96DF -#define MIPSEL 1 -#define __INT32_MAX__ 2147483647 -#define __SIZEOF_LONG__ 4 -#define __DECIMAL_DIG__ 17 -#define __LDBL_HAS_QUIET_NAN__ 1 -#define __GNUC__ 4 -#define __GXX_RTTI 1 -#define __FLT_HAS_DENORM__ 1 -#define __SIZEOF_LONG_DOUBLE__ 8 -#define _R3000 1 -#define __BIGGEST_ALIGNMENT__ 8 -#define __DBL_MAX__ double(1.7976931348623157e+308L) -#define __INT_FAST32_MAX__ 2147483647 -#define __DBL_HAS_INFINITY__ 1 -#define __INT64_MAX__ 9223372036854775807LL -#define __DEC32_MIN_EXP__ (-94) -#define __INT_FAST16_TYPE__ int -#define __LDBL_HAS_DENORM__ 1 -#define __cplusplus 1 -#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL -#define __INT_LEAST32_MAX__ 2147483647 -#define __DEC32_MIN__ 1E-95DF -#define __DEPRECATED 1 -#define __DBL_MAX_EXP__ 1024 -#define __R3000__ 1 -#define __DEC128_EPSILON__ 1E-33DL -#define __PTRDIFF_MAX__ 2147483647 -#define mips 1 -#define __GNUG__ 4 -#define __LANGUAGE_C_PLUS_PLUS__ 1 -#define __LONG_LONG_MAX__ 9223372036854775807LL -#define __SIZEOF_SIZE_T__ 4 -#define __SIZEOF_WINT_T__ 4 -#define __GCC_HAVE_DWARF2_CFI_ASM 1 -#define __GXX_ABI_VERSION 1002 -#define __FLT_MIN_EXP__ (-125) -#define __INT_FAST64_TYPE__ long long int -#define _MIPSEL 1 -#define __DBL_MIN__ double(2.2250738585072014e-308L) -#define _MIPS_ARCH "mips32" -#define __FLT_MIN_10_EXP__ (-37) -#define __DEC128_MIN__ 1E-6143DL -#define __REGISTER_PREFIX__ -#define __UINT16_MAX__ 65535 -#define __DBL_HAS_DENORM__ 1 -#define __UINT8_TYPE__ unsigned char -#define __NO_INLINE__ 1 -#define __R3000 1 -#define __FLT_MANT_DIG__ 24 -#define __VERSION__ "4.6 20120106 (prerelease)" -#define _LANGUAGE_C_PLUS_PLUS 1 -#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define __DEC64_EPSILON__ 1E-15DD -#define __ORDER_PDP_ENDIAN__ 3412 -#define __DEC128_MIN_EXP__ (-6142) -#define __INT_FAST32_TYPE__ int -#define __UINT_LEAST16_TYPE__ short unsigned int -#define unix 1 -#define _MIPS_ARCH_MIPS32 1 -#define __INT16_MAX__ 32767 -#define __SIZE_TYPE__ unsigned int -#define __UINT64_MAX__ 18446744073709551615ULL -#define __INT8_TYPE__ signed char -#define __ELF__ 1 -#define __mips_isa_rev 1 -#define _MIPS_TUNE_MIPS32 1 -#define __FLT_RADIX__ 2 -#define __INT_LEAST16_TYPE__ short int -#define __LDBL_EPSILON__ 2.2204460492503131e-16L -#define __SIG_ATOMIC_MAX__ 2147483647 -#define __SIZEOF_PTRDIFF_T__ 4 -#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF -#define __INT_FAST16_MAX__ 2147483647 -#define _MIPS_SZPTR 32 -#define __UINT_FAST32_MAX__ 4294967295U -#define __UINT_LEAST64_TYPE__ long long unsigned int -#define __FLT_HAS_QUIET_NAN__ 1 -#define __FLT_MAX_10_EXP__ 38 -#define __LONG_MAX__ 2147483647L -#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL -#define __FLT_HAS_INFINITY__ 1 -#define __UINT_FAST16_TYPE__ unsigned int -#define __DEC64_MAX__ 9.999999999999999E384DD -#define __CHAR16_TYPE__ short unsigned int -#define __PRAGMA_REDEFINE_EXTNAME 1 -#define __INT_LEAST16_MAX__ 32767 -#define __DEC64_MANT_DIG__ 16 -#define __UINT_LEAST32_MAX__ 4294967295U -#define __INT_LEAST64_TYPE__ long long int -#define __INT16_TYPE__ short int -#define __INT_LEAST8_TYPE__ signed char -#define _mips 1 -#define __DEC32_MAX_EXP__ 97 -#define __INT_FAST8_MAX__ 127 -#define __INTPTR_MAX__ 2147483647 -#define linux 1 -#define _MIPS_SZINT 32 -#define __EXCEPTIONS 1 -#define __LDBL_MANT_DIG__ 53 -#define __DBL_HAS_QUIET_NAN__ 1 -#define __MIPSEL 1 -#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) -#define __GCC_HAVE_BUILTIN_MIPS_CACHE 1 -#define __INTPTR_TYPE__ int -#define __UINT16_TYPE__ short unsigned int -#define __WCHAR_TYPE__ int -#define __SIZEOF_FLOAT__ 4 -#define __pic__ 1 -#define __UINTPTR_MAX__ 4294967295U -#define __DEC64_MIN_EXP__ (-382) -#define __INT_FAST64_MAX__ 9223372036854775807LL -#define __FLT_DIG__ 6 -#define __UINT_FAST64_TYPE__ long long unsigned int -#define __INT_MAX__ 2147483647 -#define __INT64_TYPE__ long long int -#define __FLT_MAX_EXP__ 128 -#define _MIPS_SIM _ABIO32 -#define __DBL_MANT_DIG__ 53 -#define __INT_LEAST64_MAX__ 9223372036854775807LL -#define __DEC64_MIN__ 1E-383DD -#define __WINT_TYPE__ unsigned int -#define __UINT_LEAST32_TYPE__ unsigned int -#define __SIZEOF_SHORT__ 2 -#define __LDBL_MIN_EXP__ (-1021) -#define _MIPS_FPSET 16 -#define __INT_LEAST8_MAX__ 127 -#define __LDBL_MAX_10_EXP__ 308 -#define __DBL_EPSILON__ double(2.2204460492503131e-16L) -#define __INT_LEAST32_TYPE__ int -#define __SIZEOF_WCHAR_T__ 4 -#define __UINT64_TYPE__ long long unsigned int -#define __INT_FAST8_TYPE__ signed char -#define __DBL_DECIMAL_DIG__ 17 -#define __DEC_EVAL_METHOD__ 2 -#define __ORDER_BIG_ENDIAN__ 4321 -#define __INTMAX_MAX__ 9223372036854775807LL -#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define __FLT_DENORM_MIN__ 1.4012984643248171e-45F -#define __INT8_MAX__ 127 -#define __PIC__ 1 -#define __UINT_FAST32_TYPE__ unsigned int -#define __CHAR32_TYPE__ unsigned int -#define __FLT_MAX__ 3.4028234663852886e+38F -#define __INT32_TYPE__ int -#define __SIZEOF_DOUBLE__ 8 -#define __INTMAX_TYPE__ long long int -#define __DEC128_MAX_EXP__ 6145 -#define __GNUC_MINOR__ 6 -#define __UINTMAX_MAX__ 18446744073709551615ULL -#define __DEC32_MANT_DIG__ 7 -#define __DBL_MAX_10_EXP__ 308 -#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L -#define __STDC__ 1 -#define __mips_hard_float 1 -#define __PTRDIFF_TYPE__ int -#define __mips 32 -#define __UINT32_TYPE__ unsigned int -#define _MIPS_SZLONG 32 -#define __UINTPTR_TYPE__ unsigned int -#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD -#define __DEC128_MANT_DIG__ 34 -#define __LDBL_MIN_10_EXP__ (-307) -#define __SIZEOF_LONG_LONG__ 8 -#define __LDBL_DIG__ 15 -#define __FLT_DECIMAL_DIG__ 9 -#define __UINT_FAST16_MAX__ 4294967295U -#define __GNUC_GNU_INLINE__ 1 -#define __UINT_FAST8_TYPE__ unsigned char -#define _GNU_SOURCE 1 -#define ANDROID -#endif - -// --- Include directories begin --- // -//C:/Android/ndk/platforms/android-9/arch-mips/usr/include -//C:\Android\ndk\toolchains\mipsel-linux-android-4.6\prebuilt\windows\bin\../lib/gcc/mipsel-linux-android/4.6/include -//C:\Android\ndk\toolchains\mipsel-linux-android-4.6\prebuilt\windows\bin\../lib/gcc/mipsel-linux-android/4.6/include-fixed -// --- Library directories end --- // - - -// --- Library directories begin --- // -//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/mipsel-linux-android/4.6/ -//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/ -//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/mipsel-linux-android/4.6/../../../../mipsel-linux-android/lib/ -// --- Library directories begin --- // - diff --git a/Graphics/GraphicsEngine/build/Windows/Android/gcc_Release.h b/Graphics/GraphicsEngine/build/Windows/Android/gcc_Release.h deleted file mode 100644 index da574716..00000000 --- a/Graphics/GraphicsEngine/build/Windows/Android/gcc_Release.h +++ /dev/null @@ -1,249 +0,0 @@ -/* - This file is only used by IntelliSense (VisualStudio code suggestion system) - DO NOT INCLUDE THIS FILE FROM YOUR ACTUAL SOURCE FILES. - This file lists the preprocessor macros extracted from your GCC. - It is needed for IntelliSense to parse other header files correctly. -*/ -#ifdef _MSC_VER -#define __DBL_MIN_EXP__ (-1021) -#define __UINT_LEAST16_MAX__ 65535 -#define __FLT_MIN__ 1.1754943508222875e-38F -#define __UINT_LEAST8_TYPE__ unsigned char -#define __CHAR_BIT__ 8 -#define __UINT8_MAX__ 255 -#define __ANDROID__ 1 -#define __WINT_MAX__ 4294967295U -#define R3000 1 -#define __ORDER_LITTLE_ENDIAN__ 1234 -#define __SIZE_MAX__ 4294967295U -#define __WCHAR_MAX__ 2147483647 -#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 -#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 -#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 -#define __DBL_DENORM_MIN__ double(4.9406564584124654e-324L) -#define __FLT_EVAL_METHOD__ 0 -#define __unix__ 1 -#define _MIPS_ISA _MIPS_ISA_MIPS32 -#define __UINT_FAST64_MAX__ 18446744073709551615ULL -#define __SIG_ATOMIC_TYPE__ int -#define __DBL_MIN_10_EXP__ (-307) -#define __FINITE_MATH_ONLY__ 0 -#define _MIPS_TUNE "mips32" -#define _ABIO32 1 -#define __GNUC_PATCHLEVEL__ 0 -#define __UINT_FAST8_MAX__ 255 -#define __DEC64_MAX_EXP__ 385 -#define __UINT_LEAST64_MAX__ 18446744073709551615ULL -#define __SHRT_MAX__ 32767 -#define __LDBL_MAX__ 1.7976931348623157e+308L -#define __UINT_LEAST8_MAX__ 255 -#define __mips_abicalls 1 -#define __UINTMAX_TYPE__ long long unsigned int -#define __linux 1 -#define __DEC32_EPSILON__ 1E-6DF -#define __unix 1 -#define __UINT32_MAX__ 4294967295U -#define __LDBL_MAX_EXP__ 1024 -#define __LANGUAGE_C_PLUS_PLUS 1 -#define __WINT_MIN__ 0U -#define __MIPSEL__ 1 -#define __linux__ 1 -#define __SCHAR_MAX__ 127 -#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) -#define __DBL_DIG__ 15 -#define __SIZEOF_INT__ 4 -#define __SIZEOF_POINTER__ 4 -#define __USER_LABEL_PREFIX__ -#define __STDC_HOSTED__ 1 -#define __LDBL_HAS_INFINITY__ 1 -#define __mips_fpr 32 -#define __FLT_EPSILON__ 1.1920928955078125e-7F -#define __GXX_WEAK__ 1 -#define __mips__ 1 -#define __LDBL_MIN__ 2.2250738585072014e-308L -#define __DEC32_MAX__ 9.999999E96DF -#define MIPSEL 1 -#define __INT32_MAX__ 2147483647 -#define __SIZEOF_LONG__ 4 -#define __DECIMAL_DIG__ 17 -#define __LDBL_HAS_QUIET_NAN__ 1 -#define __GNUC__ 4 -#define __GXX_RTTI 1 -#define __FLT_HAS_DENORM__ 1 -#define __SIZEOF_LONG_DOUBLE__ 8 -#define _R3000 1 -#define __BIGGEST_ALIGNMENT__ 8 -#define __DBL_MAX__ double(1.7976931348623157e+308L) -#define __INT_FAST32_MAX__ 2147483647 -#define __DBL_HAS_INFINITY__ 1 -#define __INT64_MAX__ 9223372036854775807LL -#define __DEC32_MIN_EXP__ (-94) -#define __INT_FAST16_TYPE__ int -#define __LDBL_HAS_DENORM__ 1 -#define __cplusplus 1 -#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL -#define __INT_LEAST32_MAX__ 2147483647 -#define __DEC32_MIN__ 1E-95DF -#define __DEPRECATED 1 -#define __DBL_MAX_EXP__ 1024 -#define __R3000__ 1 -#define __DEC128_EPSILON__ 1E-33DL -#define __PTRDIFF_MAX__ 2147483647 -#define mips 1 -#define __GNUG__ 4 -#define __LANGUAGE_C_PLUS_PLUS__ 1 -#define __LONG_LONG_MAX__ 9223372036854775807LL -#define __SIZEOF_SIZE_T__ 4 -#define __SIZEOF_WINT_T__ 4 -#define __GCC_HAVE_DWARF2_CFI_ASM 1 -#define __GXX_ABI_VERSION 1002 -#define __FLT_MIN_EXP__ (-125) -#define __INT_FAST64_TYPE__ long long int -#define _MIPSEL 1 -#define __DBL_MIN__ double(2.2250738585072014e-308L) -#define _MIPS_ARCH "mips32" -#define __FLT_MIN_10_EXP__ (-37) -#define __DEC128_MIN__ 1E-6143DL -#define __REGISTER_PREFIX__ -#define __UINT16_MAX__ 65535 -#define __DBL_HAS_DENORM__ 1 -#define __UINT8_TYPE__ unsigned char -#define __NO_INLINE__ 1 -#define __R3000 1 -#define __FLT_MANT_DIG__ 24 -#define __VERSION__ "4.6 20120106 (prerelease)" -#define _LANGUAGE_C_PLUS_PLUS 1 -#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define __DEC64_EPSILON__ 1E-15DD -#define __ORDER_PDP_ENDIAN__ 3412 -#define __DEC128_MIN_EXP__ (-6142) -#define __INT_FAST32_TYPE__ int -#define __UINT_LEAST16_TYPE__ short unsigned int -#define unix 1 -#define _MIPS_ARCH_MIPS32 1 -#define __INT16_MAX__ 32767 -#define __SIZE_TYPE__ unsigned int -#define __UINT64_MAX__ 18446744073709551615ULL -#define __INT8_TYPE__ signed char -#define __ELF__ 1 -#define __mips_isa_rev 1 -#define _MIPS_TUNE_MIPS32 1 -#define __FLT_RADIX__ 2 -#define __INT_LEAST16_TYPE__ short int -#define __LDBL_EPSILON__ 2.2204460492503131e-16L -#define __SIG_ATOMIC_MAX__ 2147483647 -#define __SIZEOF_PTRDIFF_T__ 4 -#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF -#define __INT_FAST16_MAX__ 2147483647 -#define _MIPS_SZPTR 32 -#define __UINT_FAST32_MAX__ 4294967295U -#define __UINT_LEAST64_TYPE__ long long unsigned int -#define __FLT_HAS_QUIET_NAN__ 1 -#define __FLT_MAX_10_EXP__ 38 -#define __LONG_MAX__ 2147483647L -#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL -#define __FLT_HAS_INFINITY__ 1 -#define __UINT_FAST16_TYPE__ unsigned int -#define __DEC64_MAX__ 9.999999999999999E384DD -#define __CHAR16_TYPE__ short unsigned int -#define __PRAGMA_REDEFINE_EXTNAME 1 -#define __INT_LEAST16_MAX__ 32767 -#define __DEC64_MANT_DIG__ 16 -#define __UINT_LEAST32_MAX__ 4294967295U -#define __INT_LEAST64_TYPE__ long long int -#define __INT16_TYPE__ short int -#define __INT_LEAST8_TYPE__ signed char -#define _mips 1 -#define __DEC32_MAX_EXP__ 97 -#define __INT_FAST8_MAX__ 127 -#define __INTPTR_MAX__ 2147483647 -#define linux 1 -#define _MIPS_SZINT 32 -#define __EXCEPTIONS 1 -#define __LDBL_MANT_DIG__ 53 -#define __DBL_HAS_QUIET_NAN__ 1 -#define __MIPSEL 1 -#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) -#define __GCC_HAVE_BUILTIN_MIPS_CACHE 1 -#define __INTPTR_TYPE__ int -#define __UINT16_TYPE__ short unsigned int -#define __WCHAR_TYPE__ int -#define __SIZEOF_FLOAT__ 4 -#define __pic__ 1 -#define __UINTPTR_MAX__ 4294967295U -#define __DEC64_MIN_EXP__ (-382) -#define __INT_FAST64_MAX__ 9223372036854775807LL -#define __FLT_DIG__ 6 -#define __UINT_FAST64_TYPE__ long long unsigned int -#define __INT_MAX__ 2147483647 -#define __INT64_TYPE__ long long int -#define __FLT_MAX_EXP__ 128 -#define _MIPS_SIM _ABIO32 -#define __DBL_MANT_DIG__ 53 -#define __INT_LEAST64_MAX__ 9223372036854775807LL -#define __DEC64_MIN__ 1E-383DD -#define __WINT_TYPE__ unsigned int -#define __UINT_LEAST32_TYPE__ unsigned int -#define __SIZEOF_SHORT__ 2 -#define __LDBL_MIN_EXP__ (-1021) -#define _MIPS_FPSET 16 -#define __INT_LEAST8_MAX__ 127 -#define __LDBL_MAX_10_EXP__ 308 -#define __DBL_EPSILON__ double(2.2204460492503131e-16L) -#define __INT_LEAST32_TYPE__ int -#define __SIZEOF_WCHAR_T__ 4 -#define __UINT64_TYPE__ long long unsigned int -#define __INT_FAST8_TYPE__ signed char -#define __DBL_DECIMAL_DIG__ 17 -#define __DEC_EVAL_METHOD__ 2 -#define __ORDER_BIG_ENDIAN__ 4321 -#define __INTMAX_MAX__ 9223372036854775807LL -#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define __FLT_DENORM_MIN__ 1.4012984643248171e-45F -#define __INT8_MAX__ 127 -#define __PIC__ 1 -#define __UINT_FAST32_TYPE__ unsigned int -#define __CHAR32_TYPE__ unsigned int -#define __FLT_MAX__ 3.4028234663852886e+38F -#define __INT32_TYPE__ int -#define __SIZEOF_DOUBLE__ 8 -#define __INTMAX_TYPE__ long long int -#define __DEC128_MAX_EXP__ 6145 -#define __GNUC_MINOR__ 6 -#define __UINTMAX_MAX__ 18446744073709551615ULL -#define __DEC32_MANT_DIG__ 7 -#define __DBL_MAX_10_EXP__ 308 -#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L -#define __STDC__ 1 -#define __mips_hard_float 1 -#define __PTRDIFF_TYPE__ int -#define __mips 32 -#define __UINT32_TYPE__ unsigned int -#define _MIPS_SZLONG 32 -#define __UINTPTR_TYPE__ unsigned int -#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD -#define __DEC128_MANT_DIG__ 34 -#define __LDBL_MIN_10_EXP__ (-307) -#define __SIZEOF_LONG_LONG__ 8 -#define __LDBL_DIG__ 15 -#define __FLT_DECIMAL_DIG__ 9 -#define __UINT_FAST16_MAX__ 4294967295U -#define __GNUC_GNU_INLINE__ 1 -#define __UINT_FAST8_TYPE__ unsigned char -#define _GNU_SOURCE 1 -#define ANDROID -#endif - -// --- Include directories begin --- // -//C:/Android/ndk/platforms/android-9/arch-mips/usr/include -//C:\Android\ndk\toolchains\mipsel-linux-android-4.6\prebuilt\windows\bin\../lib/gcc/mipsel-linux-android/4.6/include -//C:\Android\ndk\toolchains\mipsel-linux-android-4.6\prebuilt\windows\bin\../lib/gcc/mipsel-linux-android/4.6/include-fixed -// --- Library directories end --- // - - -// --- Library directories begin --- // -//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/mipsel-linux-android/4.6/ -//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/ -//C:/Android/ndk/toolchains/mipsel-linux-android-4.6/prebuilt/windows/bin/../lib/gcc/mipsel-linux-android/4.6/../../../../mipsel-linux-android/lib/ -// --- Library directories begin --- // - diff --git a/Graphics/GraphicsEngine/build/Windows/EngineRoot.props b/Graphics/GraphicsEngine/build/Windows/EngineRoot.props deleted file mode 100644 index 6e4b958b..00000000 --- a/Graphics/GraphicsEngine/build/Windows/EngineRoot.props +++ /dev/null @@ -1,18 +0,0 @@ - - - - - ..\..\..\.. - ..\..\.. - - - - - - $(EngineRoot) - - - $(GraphicsRoot) - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Windows/GraphicsEngine-Debug.vgdbsettings b/Graphics/GraphicsEngine/build/Windows/GraphicsEngine-Debug.vgdbsettings deleted file mode 100644 index 3f5b24b1..00000000 --- a/Graphics/GraphicsEngine/build/Windows/GraphicsEngine-Debug.vgdbsettings +++ /dev/null @@ -1,76 +0,0 @@ - - - Debug - - - - MinGWWindowsSlash - - $(ProjectDir) - - - android-19 - true - true - bin;obj - false - false - - - - - - false - false - true - false - false - false - false - true - false - KillApp - - false - false - false - false - false - false - false - false - - false - false - main - true - - - false - false - 5039 - 5039 - 10000 - 0 - false - Ask - true - true - - - - - - - - - - - Default - - - - true - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Windows/GraphicsEngine-Release.vgdbsettings b/Graphics/GraphicsEngine/build/Windows/GraphicsEngine-Release.vgdbsettings deleted file mode 100644 index 669691f2..00000000 --- a/Graphics/GraphicsEngine/build/Windows/GraphicsEngine-Release.vgdbsettings +++ /dev/null @@ -1,76 +0,0 @@ - - - Release - - - - MinGWWindowsSlash - - $(ProjectDir) - - - android-19 - false - true - bin;obj - false - false - - - - - - false - false - true - false - false - false - false - true - false - KillApp - - false - false - false - false - false - false - false - false - - false - false - main - true - - - false - false - 5039 - 5039 - 10000 - 0 - false - Ask - true - true - - - - - - - - - - - Default - - - - true - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Windows/GraphicsEngine.props b/Graphics/GraphicsEngine/build/Windows/GraphicsEngine.props deleted file mode 100644 index f5ff61e5..00000000 --- a/Graphics/GraphicsEngine/build/Windows/GraphicsEngine.props +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - $(GraphicsRoot)\GraphicsEngine\include;$(GraphicsRoot)\GraphicsEngine\interface;$(GraphicsRoot)\GraphicsTools\include;$(EngineRoot)\Common\include;$(EngineRoot)\Common\interface;$(EngineRoot)\Platforms\interface;$(VC_IncludePath);$(WindowsSDK_IncludePath);$(IncludePath) - - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Windows/GraphicsEngine.vcxproj b/Graphics/GraphicsEngine/build/Windows/GraphicsEngine.vcxproj deleted file mode 100644 index 34dfc85e..00000000 --- a/Graphics/GraphicsEngine/build/Windows/GraphicsEngine.vcxproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - - Debug - ARM - - - Debug - Win32 - - - Debug - x64 - - - Release - ARM - - - Release - Win32 - - - Release - x64 - - - - {052DD700-477C-4512-A7F4-B05EBEF5C80E} - Win32Proj - RenderEngine - GraphicsEngine - - - - StaticLibrary - true - Unicode - v140 - - - StaticLibrary - true - Unicode - v140 - - - StaticLibrary - false - true - Unicode - v140 - - - StaticLibrary - false - true - Unicode - v140 - - - v120 - Makefile - - - v120 - Makefile - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(ProjectDir)\Android\gcc_Debug.h;$(NMakeForcedIncludes) - - - $(ProjectDir)\Android\gcc_Release.h;$(NMakeForcedIncludes) - - - - Level3 - Disabled - _LIB;%(PreprocessorDefinitions) - - - Windows - true - - - - - Level3 - Disabled - _LIB;%(PreprocessorDefinitions) - - - Windows - true - - - MachineX64 - - - - - Level3 - MaxSpeed - true - true - _LIB;%(PreprocessorDefinitions) - - - Windows - true - true - true - - - - - Level3 - MaxSpeed - true - true - _LIB;%(PreprocessorDefinitions) - - - Windows - true - true - true - - - MachineX64 - - - - - - - - - true - true - true - true - - - true - true - true - true - - - - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Windows/GraphicsEngine.vcxproj.filters b/Graphics/GraphicsEngine/build/Windows/GraphicsEngine.vcxproj.filters deleted file mode 100644 index f9817491..00000000 --- a/Graphics/GraphicsEngine/build/Windows/GraphicsEngine.vcxproj.filters +++ /dev/null @@ -1,27 +0,0 @@ - - - - - {8939e7b7-453a-4762-9f92-ad0a2915609f} - - - {551d0b50-542f-47e1-8e7b-6b382176f2b1} - - - - - jni - - - jni - - - - - android_src - - - android_src - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/Windows/jni/Android.mk b/Graphics/GraphicsEngine/build/Windows/jni/Android.mk deleted file mode 100644 index 5d40b9a3..00000000 --- a/Graphics/GraphicsEngine/build/Windows/jni/Android.mk +++ /dev/null @@ -1,24 +0,0 @@ -# Android NDK project makefile autogenerated by Premake - -# Preamble -DEPENDENCY_PATH := $(call my-dir) -LOCAL_PATH := $(abspath $(DEPENDENCY_PATH)) -include $(CLEAR_VARS) - - -# Project configuration -LOCAL_MODULE := GraphicsEngine -LOCAL_CFLAGS := -std=c++11 -LOCAL_CPP_FEATURES := exceptions -LOCAL_STATIC_LIBRARIES += - -# Include paths -PROJECT_ROOT := $(LOCAL_PATH)/../../.. -SOLUTION_ROOT := $(PROJECT_ROOT)/../.. -LOCAL_C_INCLUDES := $(PROJECT_ROOT)/include $(PROJECT_ROOT)/interface $(SOLUTION_ROOT)/Common/include $(SOLUTION_ROOT)/Common/interface $(SOLUTION_ROOT)/Platforms/interface $(SOLUTION_ROOT)/Graphics/GraphicsTools/include - -# Source files -#VisualGDBAndroid: AutoUpdateSourcesInNextLine -LOCAL_SRC_FILES := ../../../src/ResourceMapping.cpp ../../../src/Texture.cpp - -include $(BUILD_STATIC_LIBRARY) diff --git a/Graphics/GraphicsEngine/build/Windows/jni/Application.mk b/Graphics/GraphicsEngine/build/Windows/jni/Application.mk deleted file mode 100644 index 45f02b20..00000000 --- a/Graphics/GraphicsEngine/build/Windows/jni/Application.mk +++ /dev/null @@ -1,7 +0,0 @@ -# Generated by VisualGDB - -DEPENDENCY_PATH := $(call my-dir) -LOCAL_PATH := $(abspath $(DEPENDENCY_PATH)) -include $(LOCAL_PATH)/../../../../../Common/make/AppCommon.mk - -APP_MODULES := GraphicsEngine \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/WindowsStore/EngineRoot.props b/Graphics/GraphicsEngine/build/WindowsStore/EngineRoot.props deleted file mode 100644 index fcb891c0..00000000 --- a/Graphics/GraphicsEngine/build/WindowsStore/EngineRoot.props +++ /dev/null @@ -1,18 +0,0 @@ - - - - - ..\..\..\..\.. - ..\..\..\.. - - - - - - $(EngineRoot) - - - $(GraphicsRoot) - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Shared/GraphicsEngine.Shared.vcxitems b/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Shared/GraphicsEngine.Shared.vcxitems deleted file mode 100644 index e8d4f5a7..00000000 --- a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Shared/GraphicsEngine.Shared.vcxitems +++ /dev/null @@ -1,65 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - true - {0cdd843c-089d-4fee-be9f-c08fa2b51acb} - GraphicsEngine - GraphicsEngine.Shared - 248F659F-DAC5-46E8-AC09-60EC9FC95053 - - - - %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) - - - - - - - - - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Shared/GraphicsEngine.Shared.vcxitems.filters b/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Shared/GraphicsEngine.Shared.vcxitems.filters deleted file mode 100644 index 8014c299..00000000 --- a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Shared/GraphicsEngine.Shared.vcxitems.filters +++ /dev/null @@ -1,138 +0,0 @@ - - - - - {32eded03-121f-406a-8a23-6721ca9116ee} - - - {d881c412-cc78-41fb-997c-0d6543c1e477} - - - {c38a8d65-5100-44be-b1a5-453d901c892f} - - - - - src - - - src - - - src - - - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - include - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - interface - - - include - - - interface - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Windows/GraphicsEngine.Windows.vcxproj b/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Windows/GraphicsEngine.Windows.vcxproj deleted file mode 100644 index 7a0d8593..00000000 --- a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Windows/GraphicsEngine.Windows.vcxproj +++ /dev/null @@ -1,209 +0,0 @@ - - - - - Debug - ARM - - - Debug - Win32 - - - Debug - x64 - - - Release - ARM - - - Release - Win32 - - - Release - x64 - - - - {9df5553c-ca9d-4cb6-a06a-ca905119c00b} - GraphicsEngine - en-US - 12.0 - true - Windows Store - 8.1 - CodeSharingStaticLibrary - - - - StaticLibrary - true - v120 - - - StaticLibrary - true - v120 - - - StaticLibrary - true - v120 - - - StaticLibrary - false - true - v120 - - - StaticLibrary - false - true - v120 - - - StaticLibrary - false - true - v120 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - false - - - false - - - false - - - false - - - false - - - - Use - false - true - pch.h - - - Console - false - false - - - - - Use - false - true - pch.h - - - Console - false - false - - - - - Use - false - true - pch.h - - - Console - false - false - - - - - Use - false - true - pch.h - - - Console - false - false - - - - - Use - false - true - - - Console - false - false - - - - - Use - false - true - - - Console - false - false - - - - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Windows/GraphicsEngine.Windows.vcxproj.filters b/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Windows/GraphicsEngine.Windows.vcxproj.filters deleted file mode 100644 index a7761ab0..00000000 --- a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.Windows/GraphicsEngine.Windows.vcxproj.filters +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.WindowsPhone/GraphicsEngine.WindowsPhone.vcxproj b/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.WindowsPhone/GraphicsEngine.WindowsPhone.vcxproj deleted file mode 100644 index b3f74084..00000000 --- a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.WindowsPhone/GraphicsEngine.WindowsPhone.vcxproj +++ /dev/null @@ -1,144 +0,0 @@ - - - - - Debug - ARM - - - Debug - Win32 - - - Release - ARM - - - Release - Win32 - - - - {aefba9a8-e16d-4b06-b16d-bc74ac799b4f} - GraphicsEngine - en-US - 12.0 - true - Windows Phone - 8.1 - CodeSharingStaticLibrary - - - - StaticLibrary - true - v120_wp81 - - - StaticLibrary - true - v120_wp81 - - - StaticLibrary - false - true - v120_wp81 - - - StaticLibrary - false - true - v120_wp81 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - false - - - false - - - false - - - - Use - false - true - - - Console - false - false - - - - - Use - false - true - - - Console - false - false - - - - - Use - false - true - - - Console - false - false - - - - - Use - false - true - - - Console - false - false - - - - - - \ No newline at end of file diff --git a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.WindowsPhone/GraphicsEngine.WindowsPhone.vcxproj.filters b/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.WindowsPhone/GraphicsEngine.WindowsPhone.vcxproj.filters deleted file mode 100644 index a7761ab0..00000000 --- a/Graphics/GraphicsEngine/build/WindowsStore/GraphicsEngine.WindowsPhone/GraphicsEngine.WindowsPhone.vcxproj.filters +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/Graphics/GraphicsEngine/include/BlendStateBase.h b/Graphics/GraphicsEngine/include/BlendStateBase.h deleted file mode 100644 index 78494b46..00000000 --- a/Graphics/GraphicsEngine/include/BlendStateBase.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright 2015 Egor Yusov - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. - * - * In no event and under no legal theory, whether in tort (including negligence), - * contract, or otherwise, unless required by applicable law (such as deliberate - * and grossly negligent acts) or agreed to in writing, shall any Contributor be - * liable for any damages, including any direct, indirect, special, incidental, - * or consequential damages of any character arising as a result of this License or - * out of the use or inability to use the software (including but not limited to damages - * for loss of goodwill, work stoppage, computer failure or malfunction, or any and - * all other commercial damages or losses), even if such Contributor has been advised - * of the possibility of such damages. - */ - -#pragma once - -/// \file -/// Implementation of the Diligent::BlendStateBase template class - -#include "BlendState.h" -#include "DeviceObjectBase.h" - -namespace Diligent -{ - -/// Template class implementing base functionality for a blend state object. - -/// \tparam BaseInterface - base interface that this class will inheret -/// (Diligent::IBlendStateD3D11 or Diligent::IBlendStateGL). -/// \tparam RenderDeviceBaseInterface - base interface for the render device -/// (Diligent::IRenderDeviceD3D11, Diligent::IRenderDeviceGL, -/// or Diligent::IRenderDeviceGLES). -template -class BlendStateBase : public DeviceObjectBase -{ -public: - typedef DeviceObjectBase TDeviceObjectBase; - typedef RenderDeviceBase < RenderDeviceBaseInterface > TRenderDeviceBase; - - /// \param pDevice - pointer to the device. - /// \param BSDesc - blend state description. - /// \param bIsDeviceInternal - flag indicating if the blend state is an internal device object and - /// must not keep a strong reference to the device. - BlendStateBase( IRenderDevice *pDevice, const BlendStateDesc& BSDesc, bool bIsDeviceInternal = false ) : - TDeviceObjectBase( pDevice, BSDesc, nullptr, bIsDeviceInternal ) - { - } - - ~BlendStateBase() - { - /// \note Destructor cannot directly remove the object from the registry as this may cause a - /// deadlock at the point where StateObjectsRegistry::Find() locks the weak pointer: if we - /// are in dtor, the object is locked by Diligent::RefCountedObject::Release() and - /// StateObjectsRegistry::Find() will wait for that lock to be released. - /// A the same time this thread will be waiting for the other thread to unlock the registry.\n - /// Thus destructor only notifies the registry that there is a deleted object. - /// The reference to the object will be removed later. - auto &BlendStateRegistry = static_cast(this->GetDevice())->GetBSRegistry(); - // StateObjectsRegistry::ReportDeletedObject() does not lock the registry, but only - // atomically increments the outstanding deleted objects counter. - BlendStateRegistry.ReportDeletedObject(); - } - - IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_BlendState, TDeviceObjectBase ) -}; - -} diff --git a/Graphics/GraphicsEngine/include/BufferBase.h b/Graphics/GraphicsEngine/include/BufferBase.h index 43b07662..ded3bbc3 100644 --- a/Graphics/GraphicsEngine/include/BufferBase.h +++ b/Graphics/GraphicsEngine/include/BufferBase.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ #include "Buffer.h" #include "DeviceObjectBase.h" #include "GraphicsUtilities.h" +#include "STDAllocator.h" #include namespace Diligent @@ -37,22 +38,39 @@ namespace Diligent /// Template class implementing base functionality for a buffer object /// \tparam BaseInterface - base interface that this class will inheret -/// (Diligent::IBufferD3D11 or Diligent::IBufferGL). +/// (Diligent::IBufferD3D11, Diligent::IBufferD3D12 or Diligent::IBufferGL). /// \tparam BufferViewImplType - type of the buffer view implementation -/// (Diligent::BufferViewD3D11Impl or Diligent::BufferVeiwGLImpl) -template -class BufferBase : public DeviceObjectBase < BaseInterface, BufferDesc > +/// (Diligent::BufferViewD3D11Impl, Diligent::BufferViewD3D12Impl or Diligent::BufferViewGLImpl) +/// \tparam TBuffObjAllocator - type of the allocator that is used to allocate memory for the buffer object instances +/// \tparam TBuffViewObjAllocator - type of the allocator that is used to allocate memory for the buffer view object instances +template +class BufferBase : public DeviceObjectBase < BaseInterface, BufferDesc, TBuffObjAllocator > { public: - typedef DeviceObjectBase TDeviceObjectBase; + typedef DeviceObjectBase TDeviceObjectBase; + /// \param BuffObjAllocator - allocator that was used to allocate memory for this instance of the buffer object. + /// \param BuffViewObjAllocator - allocator that is used to allocate memory for the buffer view instances. + /// This parameter is only used for debug purposes. /// \param pDevice - pointer to the device. /// \param BuffDesc - buffer description. /// \param bIsDeviceInternal - flag indicating if the buffer is an internal device object and /// must not keep a strong reference to the device. - BufferBase( IRenderDevice *pDevice, const BufferDesc& BuffDesc, bool bIsDeviceInternal = false ) : - TDeviceObjectBase( pDevice, BuffDesc, nullptr, bIsDeviceInternal ) + BufferBase( TBuffObjAllocator &BuffObjAllocator, + TBuffViewObjAllocator &BuffViewObjAllocator, + IRenderDevice *pDevice, + const BufferDesc& BuffDesc, + bool bIsDeviceInternal = false ) : + TDeviceObjectBase( BuffObjAllocator, pDevice, BuffDesc, nullptr, bIsDeviceInternal ), +#ifdef _DEBUG + m_dbgBuffViewAllocator(BuffViewObjAllocator), +#endif + m_pDefaultUAV(nullptr, STDDeleter(BuffViewObjAllocator) ), + m_pDefaultSRV(nullptr, STDDeleter(BuffViewObjAllocator) ) { +#define VERIFY_BUFFER(Expr, ...) VERIFY(Expr, "Buffer \"", this->m_Desc.Name ? this->m_Desc.Name : "", "\": ", ##__VA_ARGS__) + +#ifdef _DEBUG Uint32 AllowedBindFlags = BIND_VERTEX_BUFFER | BIND_INDEX_BUFFER | BIND_UNIFORM_BUFFER | BIND_SHADER_RESOURCE | BIND_STREAM_OUTPUT | BIND_UNORDERED_ACCESS | @@ -62,142 +80,162 @@ public: "BIND_SHADER_RESOURCE (8), BIND_STREAM_OUTPUT (16), BIND_UNORDERED_ACCESS (128), " "BIND_INDIRECT_DRAW_ARGS (256)"; -#define VERIFY_BUFFER(Expr, ...) VERIFY(Expr, "Buffer \"", m_Desc.Name ? m_Desc.Name : "", "\": ", ##__VA_ARGS__) - VERIFY_BUFFER( (BuffDesc.BindFlags & ~AllowedBindFlags) == 0, "Incorrect bind flags specified (", BuffDesc.BindFlags & ~AllowedBindFlags, "). Only the following flags are allowed:\n", strAllowedBindFlags ); - - m_Desc = BuffDesc; - if( (m_Desc.BindFlags & BIND_UNORDERED_ACCESS) || - (m_Desc.BindFlags & BIND_SHADER_RESOURCE) ) +#endif + + if( (this->m_Desc.BindFlags & BIND_UNORDERED_ACCESS) || + (this->m_Desc.BindFlags & BIND_SHADER_RESOURCE) ) { - VERIFY_BUFFER( m_Desc.Mode > BUFFER_MODE_UNDEFINED && m_Desc.Mode < BUFFER_MODE_NUM_MODES, "Buffer mode (", m_Desc.Mode, ") is not correct" ); - if( m_Desc.Mode == BUFFER_MODE_STRUCTURED ) + VERIFY_BUFFER( this->m_Desc.Mode > BUFFER_MODE_UNDEFINED && this->m_Desc.Mode < BUFFER_MODE_NUM_MODES, "Buffer mode (", this->m_Desc.Mode, ") is not correct" ); + if( this->m_Desc.Mode == BUFFER_MODE_STRUCTURED ) { - VERIFY_BUFFER( m_Desc.ElementByteStride != 0, "Element stride cannot be zero for structured buffer" ); + VERIFY_BUFFER( this->m_Desc.ElementByteStride != 0, "Element stride cannot be zero for structured buffer" ); } - if( m_Desc.Mode == BUFFER_MODE_FORMATED ) + if( this->m_Desc.Mode == BUFFER_MODE_FORMATED ) { - VERIFY_BUFFER( m_Desc.Format.ValueType != VT_UNDEFINED, "Value type is not specified for a formated buffer" ); - VERIFY_BUFFER( m_Desc.Format.NumComponents != 0, "Num components cannot be zero in a formated buffer" ); - if( m_Desc.ElementByteStride == 0 ) - m_Desc.ElementByteStride = static_cast(GetValueSize( m_Desc.Format.ValueType )) * m_Desc.Format.NumComponents; + VERIFY_BUFFER( this->m_Desc.Format.ValueType != VT_UNDEFINED, "Value type is not specified for a formated buffer" ); + VERIFY_BUFFER( this->m_Desc.Format.NumComponents != 0, "Num components cannot be zero in a formated buffer" ); + if( this->m_Desc.ElementByteStride == 0 ) + this->m_Desc.ElementByteStride = static_cast(GetValueSize( this->m_Desc.Format.ValueType )) * this->m_Desc.Format.NumComponents; } } } IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_Buffer, TDeviceObjectBase ) + /// Base implementation of IBuffer::UpdateData(); validates input parameters. virtual void UpdateData( IDeviceContext *pContext, Uint32 Offset, Uint32 Size, const PVoid pData )override = 0; + /// Base implementation of IBuffer::CopyData(); validates input parameters. virtual void CopyData( IDeviceContext *pContext, IBuffer *pSrcBuffer, Uint32 SrcOffset, Uint32 DstOffset, Uint32 Size )override = 0; + /// Base implementation of IBuffer::Map(); validates input parameters. virtual void Map( IDeviceContext *pContext, MAP_TYPE MapType, Uint32 MapFlags, PVoid &pMappedData )override; - virtual void Unmap( IDeviceContext *pContext )override = 0; + /// Base implementation of IBuffer::Unmap() + virtual void Unmap( IDeviceContext *pContext, MAP_TYPE MapType )override = 0; + /// Implementation of IBuffer::CreateView(); calls CreateViewInternal() virtual function + /// that creates buffer view for the specific engine implementation. virtual void CreateView( const struct BufferViewDesc &ViewDesc, IBufferView **ppView )override; + /// Implementation of IBuffer::GetDefaultView(). virtual IBufferView* GetDefaultView( BUFFER_VIEW_TYPE ViewType )override; + /// Creates default buffer views. + + /// + /// - Creates default shader resource view addressing the entire buffer if Diligent::BIND_SHADER_RESOURCE flag is set + /// - Creates default unordered access view addressing the entire buffer if Diligent::BIND_UNORDERED_ACCESS flag is set + /// + /// The function calls CreateViewInternal(). void CreateDefaultViews(); protected: + + /// Pure virtual function that creates buffer view for the specific engine implementation. virtual void CreateViewInternal( const struct BufferViewDesc &ViewDesc, IBufferView **ppView, bool bIsDefaultView ) = 0; + /// Corrects buffer view description and validates view parameters. void CorrectBufferViewDesc( struct BufferViewDesc &ViewDesc ); - BufferDesc m_Desc; +#ifdef _DEBUG + TBuffViewObjAllocator &m_dbgBuffViewAllocator; +#endif + + /// Default UAV addressing the entire buffer + std::unique_ptr > m_pDefaultUAV; - std::unique_ptr m_pDefaultUAV; - std::unique_ptr m_pDefaultSRV; + /// Default SRV addressing the entire buffer + std::unique_ptr > m_pDefaultSRV; }; -template -void BufferBase :: UpdateData( IDeviceContext *pContext, Uint32 Offset, Uint32 Size, const PVoid pData ) +template +void BufferBase :: UpdateData( IDeviceContext *pContext, Uint32 Offset, Uint32 Size, const PVoid pData ) { - VERIFY_BUFFER( m_Desc.Usage == USAGE_DEFAULT, "Only default usage buffers can be updated with UpdateData()" ); - VERIFY_BUFFER( Offset < m_Desc.uiSizeInBytes, "Offset (", Offset, ") exceeds the buffer size (", m_Desc.uiSizeInBytes, ")" ); - VERIFY_BUFFER( Size + Offset <= m_Desc.uiSizeInBytes, "Update region [", Offset, ",", Size + Offset, ") is out of buffer bounds [0,",m_Desc.uiSizeInBytes,")" ); + VERIFY_BUFFER( this->m_Desc.Usage == USAGE_DEFAULT, "Only default usage buffers can be updated with UpdateData()" ); + VERIFY_BUFFER( Offset < this->m_Desc.uiSizeInBytes, "Offset (", Offset, ") exceeds the buffer size (", this->m_Desc.uiSizeInBytes, ")" ); + VERIFY_BUFFER( Size + Offset <= this->m_Desc.uiSizeInBytes, "Update region [", Offset, ",", Size + Offset, ") is out of buffer bounds [0,",this->m_Desc.uiSizeInBytes,")" ); } -template -void BufferBase :: CopyData( IDeviceContext *pContext, IBuffer *pSrcBuffer, Uint32 SrcOffset, Uint32 DstOffset, Uint32 Size ) +template +void BufferBase :: CopyData( IDeviceContext *pContext, IBuffer *pSrcBuffer, Uint32 SrcOffset, Uint32 DstOffset, Uint32 Size ) { - VERIFY_BUFFER( DstOffset + Size <= m_Desc.uiSizeInBytes, "Destination range [", DstOffset, ",", DstOffset + Size, ") is out of buffer bounds [0,",m_Desc.uiSizeInBytes,")" ); - VERIFY_BUFFER( SrcOffset + Size <= pSrcBuffer->GetDesc().uiSizeInBytes, "Source range [", SrcOffset, ",", SrcOffset + Size, ") is out of buffer bounds [0,",m_Desc.uiSizeInBytes,")" ); + VERIFY_BUFFER( DstOffset + Size <= this->m_Desc.uiSizeInBytes, "Destination range [", DstOffset, ",", DstOffset + Size, ") is out of buffer bounds [0,",this->m_Desc.uiSizeInBytes,")" ); + VERIFY_BUFFER( SrcOffset + Size <= pSrcBuffer->GetDesc().uiSizeInBytes, "Source range [", SrcOffset, ",", SrcOffset + Size, ") is out of buffer bounds [0,",this->m_Desc.uiSizeInBytes,")" ); } -template -void BufferBase :: Map( IDeviceContext *pContext, MAP_TYPE MapType, Uint32 MapFlags, PVoid &pMappedData ) +template +void BufferBase :: Map( IDeviceContext *pContext, MAP_TYPE MapType, Uint32 MapFlags, PVoid &pMappedData ) { switch( MapType ) { case MAP_READ: - VERIFY_BUFFER( m_Desc.Usage == USAGE_CPU_ACCESSIBLE, "Only buffers with usage USAGE_CPU_ACCESSIBLE can be read from" ); - VERIFY_BUFFER( (m_Desc.CPUAccessFlags & CPU_ACCESS_READ), "Buffer being mapped for reading was not created with CPU_ACCESS_READ flag" ); + VERIFY_BUFFER( this->m_Desc.Usage == USAGE_CPU_ACCESSIBLE, "Only buffers with usage USAGE_CPU_ACCESSIBLE can be read from" ); + VERIFY_BUFFER( (this->m_Desc.CPUAccessFlags & CPU_ACCESS_READ), "Buffer being mapped for reading was not created with CPU_ACCESS_READ flag" ); break; case MAP_WRITE: - VERIFY_BUFFER( m_Desc.Usage == USAGE_CPU_ACCESSIBLE, "Only buffers with usage USAGE_CPU_ACCESSIBLE can be written to" ); - VERIFY_BUFFER( (m_Desc.CPUAccessFlags & CPU_ACCESS_WRITE), "Buffer being mapped for writing was not created with CPU_ACCESS_WRITE flag" ); + VERIFY_BUFFER( this->m_Desc.Usage == USAGE_CPU_ACCESSIBLE, "Only buffers with usage USAGE_CPU_ACCESSIBLE can be written to" ); + VERIFY_BUFFER( (this->m_Desc.CPUAccessFlags & CPU_ACCESS_WRITE), "Buffer being mapped for writing was not created with CPU_ACCESS_WRITE flag" ); break; case MAP_READ_WRITE: - VERIFY_BUFFER( m_Desc.Usage == USAGE_CPU_ACCESSIBLE, "Only buffers with usage USAGE_CPU_ACCESSIBLE can be read and written" ); - VERIFY_BUFFER( (m_Desc.CPUAccessFlags & CPU_ACCESS_WRITE), "Buffer being mapped for reading & writing was not created with CPU_ACCESS_WRITE flag" ); - VERIFY_BUFFER( (m_Desc.CPUAccessFlags & CPU_ACCESS_READ), "Buffer being mapped for reading & writing was not created with CPU_ACCESS_READ flag" ); + VERIFY_BUFFER( this->m_Desc.Usage == USAGE_CPU_ACCESSIBLE, "Only buffers with usage USAGE_CPU_ACCESSIBLE can be read and written" ); + VERIFY_BUFFER( (this->m_Desc.CPUAccessFlags & CPU_ACCESS_WRITE), "Buffer being mapped for reading & writing was not created with CPU_ACCESS_WRITE flag" ); + VERIFY_BUFFER( (this->m_Desc.CPUAccessFlags & CPU_ACCESS_READ), "Buffer being mapped for reading & writing was not created with CPU_ACCESS_READ flag" ); break; case MAP_WRITE_DISCARD: - VERIFY_BUFFER( m_Desc.Usage == USAGE_DYNAMIC, "Only dynamic buffers can be mapped with write discard flag" ); - VERIFY_BUFFER( (m_Desc.CPUAccessFlags & CPU_ACCESS_WRITE), "Dynamic buffer must be created with CPU_ACCESS_WRITE flag" ); + VERIFY_BUFFER( this->m_Desc.Usage == USAGE_DYNAMIC, "Only dynamic buffers can be mapped with write discard flag" ); + VERIFY_BUFFER( (this->m_Desc.CPUAccessFlags & CPU_ACCESS_WRITE), "Dynamic buffer must be created with CPU_ACCESS_WRITE flag" ); break; case MAP_WRITE_NO_OVERWRITE: - VERIFY_BUFFER( m_Desc.Usage == USAGE_DYNAMIC, "Only dynamic buffers can be mapped with write no overwrite flag" ); - VERIFY_BUFFER( (m_Desc.CPUAccessFlags & CPU_ACCESS_WRITE), "Dynamic buffer must be created with CPU_ACCESS_WRITE flag" ); + VERIFY_BUFFER( this->m_Desc.Usage == USAGE_DYNAMIC, "Only dynamic buffers can be mapped with write no overwrite flag" ); + VERIFY_BUFFER( (this->m_Desc.CPUAccessFlags & CPU_ACCESS_WRITE), "Dynamic buffer must be created with CPU_ACCESS_WRITE flag" ); break; default: UNEXPECTED( "Unknown map type" ); } } -template -void BufferBase :: Unmap( IDeviceContext *pContext ) +template +void BufferBase :: Unmap( IDeviceContext *pContext, MAP_TYPE MapType ) { } -template -void BufferBase :: CreateView( const struct BufferViewDesc &ViewDesc, IBufferView **ppView ) +template +void BufferBase :: CreateView( const struct BufferViewDesc &ViewDesc, IBufferView **ppView ) { CreateViewInternal( ViewDesc, ppView, false ); } -template -void BufferBase :: CorrectBufferViewDesc( struct BufferViewDesc &ViewDesc ) +template +void BufferBase :: CorrectBufferViewDesc( struct BufferViewDesc &ViewDesc ) { if( ViewDesc.ByteWidth == 0 ) - ViewDesc.ByteWidth = m_Desc.uiSizeInBytes; - if( ViewDesc.ByteOffset + ViewDesc.ByteWidth > m_Desc.uiSizeInBytes ) - LOG_ERROR_AND_THROW( "Buffer view range [", ViewDesc.ByteOffset, ", ", ViewDesc.ByteOffset + ViewDesc.ByteWidth, ") is out of the buffer boundaries [0, ", m_Desc.uiSizeInBytes, ")." ); - if( (m_Desc.BindFlags & BIND_UNORDERED_ACCESS) || - (m_Desc.BindFlags & BIND_SHADER_RESOURCE) ) + ViewDesc.ByteWidth = this->m_Desc.uiSizeInBytes; + if( ViewDesc.ByteOffset + ViewDesc.ByteWidth > this->m_Desc.uiSizeInBytes ) + LOG_ERROR_AND_THROW( "Buffer view range [", ViewDesc.ByteOffset, ", ", ViewDesc.ByteOffset + ViewDesc.ByteWidth, ") is out of the buffer boundaries [0, ", this->m_Desc.uiSizeInBytes, ")." ); + if( (this->m_Desc.BindFlags & BIND_UNORDERED_ACCESS) || + (this->m_Desc.BindFlags & BIND_SHADER_RESOURCE) ) { - VERIFY( m_Desc.ElementByteStride != 0, "Element byte stride is zero" ); - if( (ViewDesc.ByteOffset % m_Desc.ElementByteStride) != 0 ) - LOG_ERROR_AND_THROW( "Buffer view byte offset (", ViewDesc.ByteOffset, ") is not multiple of element byte stride (", m_Desc.ElementByteStride, ")." ); - if( (ViewDesc.ByteWidth % m_Desc.ElementByteStride) != 0 ) - LOG_ERROR_AND_THROW( "Buffer view byte width (", ViewDesc.ByteWidth, ") is not multiple of element byte stride (", m_Desc.ElementByteStride, ")." ); + VERIFY( this->m_Desc.ElementByteStride != 0, "Element byte stride is zero" ); + if( (ViewDesc.ByteOffset % this->m_Desc.ElementByteStride) != 0 ) + LOG_ERROR_AND_THROW( "Buffer view byte offset (", ViewDesc.ByteOffset, ") is not multiple of element byte stride (", this->m_Desc.ElementByteStride, ")." ); + if( (ViewDesc.ByteWidth % this->m_Desc.ElementByteStride) != 0 ) + LOG_ERROR_AND_THROW( "Buffer view byte width (", ViewDesc.ByteWidth, ") is not multiple of element byte stride (", this->m_Desc.ElementByteStride, ")." ); } } -template -IBufferView* BufferBase ::GetDefaultView( BUFFER_VIEW_TYPE ViewType ) +template +IBufferView* BufferBase ::GetDefaultView( BUFFER_VIEW_TYPE ViewType ) { switch( ViewType ) { @@ -207,10 +245,10 @@ IBufferView* BufferBase ::GetDefaultView( BUF } } -template -void BufferBase :: CreateDefaultViews() +template +void BufferBase :: CreateDefaultViews() { - if( m_Desc.BindFlags & BIND_UNORDERED_ACCESS ) + if( this->m_Desc.BindFlags & BIND_UNORDERED_ACCESS ) { BufferViewDesc ViewDesc; ViewDesc.ViewType = BUFFER_VIEW_UNORDERED_ACCESS; @@ -220,7 +258,7 @@ void BufferBase :: CreateDefaultViews() VERIFY( m_pDefaultUAV->GetDesc().ViewType == BUFFER_VIEW_UNORDERED_ACCESS, "Unexpected view type" ); } - if( m_Desc.BindFlags & BIND_SHADER_RESOURCE ) + if( this->m_Desc.BindFlags & BIND_SHADER_RESOURCE ) { BufferViewDesc ViewDesc; ViewDesc.ViewType = BUFFER_VIEW_SHADER_RESOURCE; diff --git a/Graphics/GraphicsEngine/include/BufferViewBase.h b/Graphics/GraphicsEngine/include/BufferViewBase.h index 59ce395a..00eb5008 100644 --- a/Graphics/GraphicsEngine/include/BufferViewBase.h +++ b/Graphics/GraphicsEngine/include/BufferViewBase.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,27 +37,30 @@ namespace Diligent /// Template class implementing base functionality for a buffer view object /// \tparam BaseInterface - base interface that this class will inheret -/// (Diligent::IBufferViewD3D11 or Diligent::IBufferViewGL). -template -class BufferViewBase : public DeviceObjectBase +/// (Diligent::IBufferViewD3D11, Diligent::IBufferViewD3D12 or Diligent::IBufferViewGL). +/// \tparam BuffViewObjAllocator - type of the allocator that is used to allocate memory for the buffer view object instances +template +class BufferViewBase : public DeviceObjectBase { public: - typedef DeviceObjectBase TDeviceObjectBase; + typedef DeviceObjectBase TDeviceObjectBase; + /// \param ObjAllocator - allocator that was used to allocate memory for this instance of the buffer view object /// \param pDevice - pointer to the render device. /// \param ViewDesc - buffer view description. /// \param pBuffer - pointer to the buffer that the view is to be created for. /// \param bIsDefaultView - flag indicating if the view is default view, and is thus /// part of the buffer object. In this case the view will attach /// to the buffer's reference counters. - BufferViewBase( class IRenderDevice *pDevice, + BufferViewBase( BuffViewObjAllocator &ObjAllocator, + class IRenderDevice *pDevice, const BufferViewDesc& ViewDesc, class IBuffer *pBuffer, bool bIsDefaultView ) : // Default views are created as part of the buffer, so we cannot not keep strong // reference to the buffer to avoid cyclic links. Instead, we will attach to the // reference counters of the buffer. - TDeviceObjectBase( pDevice, ViewDesc, bIsDefaultView ? pBuffer : nullptr ), + TDeviceObjectBase( ObjAllocator, pDevice, ViewDesc, bIsDefaultView ? pBuffer : nullptr ), m_pBuffer( pBuffer ), // For non-default view, we will keep strong reference to buffer m_spBuffer(bIsDefaultView ? nullptr : pBuffer) @@ -65,15 +68,16 @@ public: IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_BufferView, TDeviceObjectBase ) - virtual IBuffer* GetBuffer() + /// Implementation of IBufferView::GetBuffer() + virtual IBuffer* GetBuffer()override final { return m_pBuffer; } protected: - /// Reference to the buffer - IBuffer* m_pBuffer; + /// Pointer to the buffer + IBuffer* const m_pBuffer; /// Strong reference to the buffer. Used for non-default views /// to keep the buffer alive diff --git a/Graphics/GraphicsEngine/include/CommandListBase.h b/Graphics/GraphicsEngine/include/CommandListBase.h new file mode 100644 index 00000000..fd917490 --- /dev/null +++ b/Graphics/GraphicsEngine/include/CommandListBase.h @@ -0,0 +1,66 @@ +/* Copyright 2015-2016 Egor Yusov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#pragma once + +/// \file +/// Implementation of the Diligent::CommandListBase template class + +#include "CommandList.h" +#include "DeviceObjectBase.h" +#include "RenderDeviceBase.h" + +namespace Diligent +{ + +struct CommandListDesc : public DeviceObjectAttribs +{ +}; + +/// Template class implementing base functionality for a command list object. + +/// \tparam BaseInterface - base interface that this class will inheret +/// (Diligent::ICommandListD3D11 or Diligent::ICommandListD3D12). +/// \tparam CommandListObjAllocator - allocator that is used to allocate memory for command list object instances +template +class CommandListBase : public DeviceObjectBase +{ +public: + typedef DeviceObjectBase TDeviceObjectBase; + + /// \param ObjAllocator - Allocator that was used to allocate memory for this instance of the command list object + /// \param pDevice - pointer to the device. + /// \param bIsDeviceInternal - flag indicating if the CommandList is an internal device object and + /// must not keep a strong reference to the device. + CommandListBase( CommandListObjAllocator &ObjAllocator, IRenderDevice *pDevice, bool bIsDeviceInternal = false ) : + TDeviceObjectBase( ObjAllocator, pDevice, CommandListDesc(), nullptr, bIsDeviceInternal ) + {} + + ~CommandListBase() + { + } + + IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_CommandList, TDeviceObjectBase ) +}; + +} diff --git a/Graphics/GraphicsEngine/include/Defines.h b/Graphics/GraphicsEngine/include/Defines.h index 7f6a56e3..23585de3 100644 --- a/Graphics/GraphicsEngine/include/Defines.h +++ b/Graphics/GraphicsEngine/include/Defines.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Graphics/GraphicsEngine/include/DepthStencilStateBase.h b/Graphics/GraphicsEngine/include/DepthStencilStateBase.h deleted file mode 100644 index dbfe43d3..00000000 --- a/Graphics/GraphicsEngine/include/DepthStencilStateBase.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright 2015 Egor Yusov - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. - * - * In no event and under no legal theory, whether in tort (including negligence), - * contract, or otherwise, unless required by applicable law (such as deliberate - * and grossly negligent acts) or agreed to in writing, shall any Contributor be - * liable for any damages, including any direct, indirect, special, incidental, - * or consequential damages of any character arising as a result of this License or - * out of the use or inability to use the software (including but not limited to damages - * for loss of goodwill, work stoppage, computer failure or malfunction, or any and - * all other commercial damages or losses), even if such Contributor has been advised - * of the possibility of such damages. - */ - -#pragma once - -/// \file -/// Implementation of the Diligent::DepthStencilStateBase template class - -#include "DepthStencilState.h" -#include "DeviceObjectBase.h" - -namespace Diligent -{ - -/// Template class implementing base functionality for a depth stencil state object. - -/// \tparam BaseInterface - base interface that this class will inheret -/// (Diligent::IDepthStencilStateD3D11 or Diligent::IDepthStencilStateGL). -/// \tparam RenderDeviceBaseInterface - base interface for the render device -/// (Diligent::IRenderDeviceD3D11, Diligent::IRenderDeviceGL, -/// or Diligent::IRenderDeviceGLES). -template -class DepthStencilStateBase : public DeviceObjectBase -{ -public: - typedef DeviceObjectBase TDeviceObjectBase; - typedef RenderDeviceBase TRenderDeviceBase; - - /// \param pDevice - pointer to the device. - /// \param DSSDesc - depth-stencil state description. - /// \param bIsDeviceInternal - flag indicating if the state is an internal device object and - /// must not keep a strong reference to the device. - DepthStencilStateBase( IRenderDevice *pDevice, const DepthStencilStateDesc& DSSDesc, bool bIsDeviceInternal = false ) : - TDeviceObjectBase( pDevice, DSSDesc, nullptr, bIsDeviceInternal ) - { - } - - ~DepthStencilStateBase() - { - /// \note Destructor cannot directly remove the object from the registry as this may cause a - /// deadlock. See BlendStateBase::~BlendStateBase() for details. - auto &DSStateRegistry = static_cast(this->GetDevice())->GetDSStateRegistry(); - DSStateRegistry.ReportDeletedObject(); - } - - IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_DepthStencilState, TDeviceObjectBase ) -}; - -} diff --git a/Graphics/GraphicsEngine/include/DeviceContextBase.h b/Graphics/GraphicsEngine/include/DeviceContextBase.h index 26885aa4..f18a8f85 100644 --- a/Graphics/GraphicsEngine/include/DeviceContextBase.h +++ b/Graphics/GraphicsEngine/include/DeviceContextBase.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,8 +49,8 @@ struct VertexStreamInfo { /// Strong reference to the buffer object RefCntAutoPtr pBuffer; - Uint32 Stride; ///< Stride - Uint32 Offset; ///< Offset + Uint32 Stride; ///< Stride in bytes + Uint32 Offset; ///< Offset in bytes VertexStreamInfo() : Stride( 0 ), Offset( 0 ) @@ -64,25 +64,30 @@ struct VertexStreamInfo /// the pipeline: buffers, states, samplers, shaders, etc. /// The context also keeps strong references to the device and /// the swap chain. -template -class DeviceContextBase : public ObjectBase +template +class DeviceContextBase : public ObjectBase { public: - DeviceContextBase(IRenderDevice *pRenderDevice) : + + typedef ObjectBase TObjectBase; + + /// \param RawMemAllocator - allocator that was used to allocate memory for this instance of the device context object. + /// \param pRenderDevice - render device. + /// \param bIsDeferred - flag indicating if this instance is a deferred context + DeviceContextBase(IMemoryAllocator& RawMemAllocator, IRenderDevice *pRenderDevice, bool bIsDeferred) : + TObjectBase(nullptr, &RawMemAllocator), m_pDevice(pRenderDevice), m_IndexDataStartOffset( 0 ), m_StencilRef( 0 ), - m_SamplesBlendMask( 0 ) + m_NumVertexStreams(0), + m_bIsDeferred(bIsDeferred) { for( int i = 0; i < 4; ++i ) m_BlendFactors[i] = -1; - m_VertexStreams.reserve( MaxBufferSlots ); - m_Viewports.reserve( 16 ); - m_ScissorRects.reserve( 16 ); // Set dummy render target array size to make sure that // render targets are actually bound the first time // SetRenderTargets() is called - m_pBoundRenderTargets.resize( 8 ); + m_NumBoundRenderTargets = _countof(m_pBoundRenderTargets); } ~DeviceContextBase() @@ -91,89 +96,62 @@ public: IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_DeviceContext, ObjectBase ) - virtual void SetVertexBuffers( Uint32 StartSlot, Uint32 NumBuffersSet, IBuffer **ppBuffers, Uint32 *pStrides, Uint32 *pOffsets, Uint32 Flags ) = 0; - - virtual void ClearState() = 0; - - virtual void SetShaders( IShader **ppShaders, Uint32 NumShadersToSet ) - { - m_pBoundShaders.resize( NumShadersToSet ); - for( Uint32 i = 0; i < NumShadersToSet; ++i ) - m_pBoundShaders[i] = ppShaders[i]; -#ifdef DEBUG_CHECKS - { - Uint32 BoundShaders = 0; - for( auto sh = m_pBoundShaders.begin(); sh != m_pBoundShaders.end(); ++sh ) - { - auto ShaderType = (*sh)->GetDesc().ShaderType; - if( BoundShaders & ShaderType ) - { - LOG_ERROR_MESSAGE( "More than one shader of type ", GetShaderTypeLiteralName( ShaderType ), " is being set to the pipeline" ); - BoundShaders |= ShaderType; - } - } - } -#endif - } - - virtual void BindShaderResources( IResourceMapping *pResourceMapping, Uint32 Flags ) - { - } - - // Body of the pure virtual function cannot be inlined - /// Caches the strong reference to the vertex description - virtual void SetVertexDescription( IVertexDescription *pVertexDesc ) = 0; - - /// Caches the strong reference to the index buffer - virtual void SetIndexBuffer( IBuffer *pIndexBuffer, Uint32 ByteOffset ) = 0; + /// Base implementation of IDeviceContext::SetVertexBuffers(); validates parameters and + /// caches references to the buffers. + inline virtual void SetVertexBuffers( Uint32 StartSlot, Uint32 NumBuffersSet, IBuffer **ppBuffers, Uint32 *pStrides, Uint32 *pOffsets, Uint32 Flags ) = 0; - /// If the new depth stencil parameters differ from the cached values, - /// updates the values and returns true. Otherwise returns false. - bool SetDepthStencilState( IDepthStencilState *pDSState, Uint32 StencilRef, Uint32 Dummy = 0); + inline virtual void ClearState() = 0; + /// Base implementation of IDeviceContext::SetPipelineState(); caches references to the pipeline state object. + inline virtual void SetPipelineState(IPipelineState *pPipelineState) = 0; - /// If the new rasterizer state differs from the cached state, - /// updates the cached state and returns true. Otherwise returns false. - bool SetRasterizerState( IRasterizerState *pRS, Uint32 Dummy = 0 ); + /// Base implementation of IDeviceContext::CommitShaderResources(); validates parameters. + inline bool CommitShaderResources(IShaderResourceBinding *pShaderResourceBinding, Uint32 Flags, int); + /// Base implementation of IDeviceContext::SetIndexBuffer(); caches the strong reference to the index buffer + inline virtual void SetIndexBuffer( IBuffer *pIndexBuffer, Uint32 ByteOffset ) = 0; - /// If the new blend parameters differ from the cached values, - /// updates the cached values and returns true. Otherwise returns false. - bool SetBlendState( IBlendState *pBS, const float* pBlendFactors, Uint32 SampleMask, Uint32 Dummy = 0 ); - /// Caches the viewports - void SetViewports( Uint32 NumViewports, const Viewport *pViewports, Uint32 &RTWidth, Uint32 &RTHeight ); + inline void SetViewports( Uint32 NumViewports, const Viewport *pViewports, Uint32 &RTWidth, Uint32 &RTHeight ); /// Caches the scissor rects - void SetScissorRects( Uint32 NumRects, const Rect *pRects, Uint32 &RTWidth, Uint32 &RTHeight ); + inline void SetScissorRects( Uint32 NumRects, const Rect *pRects, Uint32 &RTWidth, Uint32 &RTHeight ); /// Caches the render target and depth stencil views. Returns true if any view is different /// from the cached value and false otherwise. - bool SetRenderTargets( Uint32 NumRenderTargets, ITextureView *ppRenderTargets[], ITextureView *pDepthStencil, Uint32 Dummy = 0 ); + inline bool SetRenderTargets( Uint32 NumRenderTargets, ITextureView *ppRenderTargets[], ITextureView *pDepthStencil, Uint32 Dummy = 0 ); /// Sets the strong pointer to the swap chain - void SetSwapChain( ISwapChain *pSwapChain ) { m_pSwapChain = pSwapChain; } + inline void SetSwapChain( ISwapChain *pSwapChain ) { m_pSwapChain = pSwapChain; } - bool IsDefaultFBBound(){ return m_pBoundRenderTargets.size() == 0 && m_pBoundDepthStencil == nullptr; } + /// Returns the swap chain + ISwapChain *GetSwapChain() { return m_pSwapChain; } - void GetDepthStencilState(IDepthStencilState **ppDSS, Uint32 &StencilRef); + /// Returns true if currently bound frame buffer is the default frame buffer + inline bool IsDefaultFBBound(){ return m_NumBoundRenderTargets == 0 && m_pBoundDepthStencil == nullptr; } - void GetRasterizerState( IRasterizerState **ppRS ); + /// Returns currently bound pipeline state and blend factors + inline void GetPipelineState(IPipelineState **ppPSO, float* BlendFactors, Uint32 &StencilRef); - void GetBlendState( IBlendState **ppBS, float* BlendFactors, Uint32& SamplesBlendMask ); + /// Returns currently bound render targets + inline void GetRenderTargets(Uint32 &NumRenderTargets, ITextureView **ppRTVs, ITextureView **ppDSV); - void GetRenderTargets(Uint32 &NumRenderTargets, ITextureView **ppRTVs, ITextureView **ppDSV); + /// Returns currently set viewports + inline void GetViewports( Uint32 &NumViewports, Viewport *pViewports ); - /// Creates and binds default depth stencil, rasterizer & blend states - void CreateDefaultStates(); + /// Returns the render device + IRenderDevice *GetDevice(){return m_pDevice;} - void GetShaders( IShader **ppShaders, Uint32 &NumShaders ); +protected: + inline bool SetBlendFactors(const float *BlendFactors, int Dummy); - void GetViewports( Uint32 &NumViewports, Viewport *pViewports ); + inline bool SetStencilRef(Uint32 StencilRef, int Dummy); -protected: /// Returns the size of the currently bound render target - void GetRenderTargetSize( Uint32 &RTWidth, Uint32 &RTHeight ); + inline void GetRenderTargetSize( Uint32 &RTWidth, Uint32 &RTHeight ); + + /// Clears all cached resources + inline void ClearStateCache(); /// Strong reference to the device. RefCntAutoPtr m_pDevice; @@ -182,59 +160,51 @@ protected: /// weak reference to the immediate context. RefCntAutoPtr m_pSwapChain; - /// Vector of strong references to bound shaders - std::vector< RefCntAutoPtr > m_pBoundShaders; - /// Vertex streams. Every stream holds strong reference to the buffer - std::vector m_VertexStreams; + VertexStreamInfo m_VertexStreams[MaxBufferSlots]; + + /// Number of bound vertex streams + Uint32 m_NumVertexStreams = 0; - /// Strong reference to the bound vertex description object - RefCntAutoPtr m_pVertexDesc; + /// Strong reference to the bound pipeline state object + RefCntAutoPtr m_pPipelineState; /// Strong reference to the bound index buffer RefCntAutoPtr m_pIndexBuffer; + /// Offset from the beginning of the index buffer to the start of the index data, in bytes. Uint32 m_IndexDataStartOffset; - /// Strong references to the bound depth-stencil state - RefCntAutoPtr< IDepthStencilState > m_pDSState; - - /// Strong references to the bound rasterizer state - RefCntAutoPtr< IRasterizerState> m_pRasterizerState; - - /// Strong references to the bound blend state - RefCntAutoPtr< IBlendState> m_pBlendState; - /// Current stencil reference value Uint32 m_StencilRef; /// Curent blend factors Float32 m_BlendFactors[4]; - /// Current samples blend mask - Uint32 m_SamplesBlendMask; - /// Current viewports - std::vector m_Viewports; + Viewport m_Viewports[MaxRenderTargets]; + /// Number of current viewports + Uint32 m_NumViewports = 0; /// Current scissor rects - std::vector m_ScissorRects; + Rect m_ScissorRects[MaxRenderTargets]; + /// Number of current scissor rects + Uint32 m_NumScissorRects = 0; - /// Vector of strong references to bound render targets - std::vector< RefCntAutoPtr > m_pBoundRenderTargets; + /// Vector of strong references to the bound render targets + RefCntAutoPtr m_pBoundRenderTargets[MaxRenderTargets]; + /// Number of bound render targets + Uint32 m_NumBoundRenderTargets = 0; /// Strong references to the bound depth stencil view RefCntAutoPtr m_pBoundDepthStencil; -private: - RefCntAutoPtr m_pDefaultDSS; - RefCntAutoPtr m_pDefaultRS; - RefCntAutoPtr m_pDefaultBS; + bool m_bIsDeferred = false; }; template -void DeviceContextBase :: SetVertexBuffers( Uint32 StartSlot, Uint32 NumBuffersSet, IBuffer **ppBuffers, Uint32 *pStrides, Uint32 *pOffsets, Uint32 Flags ) +inline void DeviceContextBase :: SetVertexBuffers( Uint32 StartSlot, Uint32 NumBuffersSet, IBuffer **ppBuffers, Uint32 *pStrides, Uint32 *pOffsets, Uint32 Flags ) { if( StartSlot >= MaxBufferSlots ) { @@ -250,9 +220,12 @@ void DeviceContextBase :: SetVertexBuffers( Uint32 StartSlot, Uin if( Flags & SET_VERTEX_BUFFERS_FLAG_RESET ) { - m_VertexStreams.clear(); + for(Uint32 s=0; s < m_NumVertexStreams; ++s) + m_VertexStreams[s] = VertexStreamInfo(); + m_NumVertexStreams = 0; } - m_VertexStreams.resize( std::max(m_VertexStreams.size(), static_cast(StartSlot + NumBuffersSet) ) ); + m_NumVertexStreams = std::max(m_NumVertexStreams, StartSlot + NumBuffersSet ); + for( Uint32 Buff = 0; Buff < NumBuffersSet; ++Buff ) { auto &CurrStream = m_VertexStreams[StartSlot + Buff]; @@ -271,27 +244,50 @@ void DeviceContextBase :: SetVertexBuffers( Uint32 StartSlot, Uin #endif } // Remove null buffers from the end of the array - while(m_VertexStreams.size() > 0 && !m_VertexStreams.back().pBuffer) - m_VertexStreams.pop_back(); + while(m_NumVertexStreams > 0 && !m_VertexStreams[m_NumVertexStreams-1].pBuffer) + m_VertexStreams[m_NumVertexStreams--] = VertexStreamInfo(); } template -void DeviceContextBase :: ClearState() +inline void DeviceContextBase :: SetPipelineState(IPipelineState *pPipelineState) { - UNSUPPORTED("This function is not implemented") - //m_VertexStreams.clear(); - //m_pIndexBuffer.Release(); - //m_IndexDataStartOffset = 0; + m_pPipelineState = pPipelineState; } template -void DeviceContextBase :: SetVertexDescription( IVertexDescription *pVertexDesc ) +inline bool DeviceContextBase :: CommitShaderResources(IShaderResourceBinding *pShaderResourceBinding, Uint32 Flags, int) { - m_pVertexDesc = pVertexDesc; +#ifdef _DEBUG + if (!m_pPipelineState) + { + LOG_ERROR_MESSAGE("No pipeline state is bound to the pipeline"); + return false; + } + + if (pShaderResourceBinding) + { + auto *pPSO = pShaderResourceBinding->GetPipelineState(); + if (pPSO != m_pPipelineState) + { + LOG_ERROR_MESSAGE("Shader resource binding object does not match currently bound pipeline state"); + return false; + } + } +#endif + return true; } template -void DeviceContextBase :: SetIndexBuffer( IBuffer *pIndexBuffer, Uint32 ByteOffset ) +inline void DeviceContextBase :: ClearState() +{ + UNSUPPORTED("This function is deprecated") + //m_VertexStreams.clear(); + //m_pIndexBuffer.Release(); + //m_IndexDataStartOffset = 0; +} + +template +inline void DeviceContextBase :: SetIndexBuffer( IBuffer *pIndexBuffer, Uint32 ByteOffset ) { m_pIndexBuffer = pIndexBuffer; m_IndexDataStartOffset = ByteOffset; @@ -305,151 +301,56 @@ void DeviceContextBase :: SetIndexBuffer( IBuffer *pIndexBuffer, } -/// \param [in] pDSState - pointer to the new depth-stencil state interface. -/// \param [in] StencilRef - new stencil reference value. -/// \param [in] Dummy - dummy argument required to make function signature distinct -/// from IDeviceContext::SetDepthStencilState(). This is required -/// because otherwise this overloaded function will only differ in -/// the return type which is not allowed. -/// \return -/// - True if either new depth stencil state or stencil reference value differs from -/// currently cached values. -/// - False otherwise. -/// -/// \remarks The method caches *strong reference* to the provided interface in m_pDSState. template -bool DeviceContextBase :: SetDepthStencilState( IDepthStencilState *pDSState, Uint32 StencilRef, Uint32 Dummy ) -{ - // If null depth-stencil state is provided, bind default state - if( !pDSState ) - pDSState = m_pDefaultDSS; - - // Here m_pDSState is certainly a live object because we keep the - // strong reference. pDSState is also clearly live object, so we can - // safely compare pointers. - if( m_pDSState != pDSState || m_StencilRef != StencilRef ) +inline void DeviceContextBase :: GetPipelineState(IPipelineState **ppPSO, float* BlendFactors, Uint32 &StencilRef) +{ + VERIFY( ppPSO != nullptr, "Null pointer provided null" ); + VERIFY( *ppPSO == nullptr, "Memory address contains a pointer to a non-null blend state" ); + if(m_pPipelineState) { - m_pDSState = pDSState; - m_StencilRef = StencilRef; - return true; + m_pPipelineState->QueryInterface( IID_PipelineState, reinterpret_cast( ppPSO ) ); + } + else + { + *ppPSO = nullptr; } - return false; -} + for( Uint32 f = 0; f < 4; ++f ) + BlendFactors[f] = m_BlendFactors[f]; + StencilRef = m_StencilRef; +}; -/// \param [in] pRS - pointer to the new rasterizer state interface. -/// \param [in] Dummy - dummy argument required to make function signature distinct -/// from IDeviceContext::SetRasterizerState(). This is required -/// because otherwise this overloaded function will only differ in -/// the return type which is not allowed. -/// \return -/// - True if the new rasterizer state differ from the cached state. -/// - False otherwise. -/// -/// \remarks The method caches *strong reference* to the provided interface in m_pRasterizerState. template -bool DeviceContextBase :: SetRasterizerState( IRasterizerState *pRS, Uint32 Dummy ) +inline bool DeviceContextBase ::SetBlendFactors(const float *BlendFactors, int) { - // If null rasterizer state provided, bind default state - if( !pRS ) - pRS = m_pDefaultRS; - - // Here m_pRasterizerState is certainly a live object because we keep the - // strong reference. pRS is also clearly live object, so we can - // safely compare pointers. - if( m_pRasterizerState != pRS ) + bool FactorsDiffer = false; + for( Uint32 f = 0; f < 4; ++f ) { - m_pRasterizerState = pRS; - return true; + if( m_BlendFactors[f] != BlendFactors[f] ) + FactorsDiffer = true; + m_BlendFactors[f] = BlendFactors[f]; } - - return false; + return FactorsDiffer; } - -/// \param [in] pBS - pointer to the new blend state interface. -/// \param [in] pBlendFactors - new blend factors. -/// \param [in] SampleMask - new sample mask. -/// \param [in] Dummy - dummy argument required to make function signature distinct -/// from IDeviceContext::SetBlendState(). This is required -/// because otherwise this overloaded function will only differ in -/// the return type which is not allowed. -/// \return -/// - True if either the new blend state, blend factors or sample mask value differs from -/// the currently cached values. -/// - False otherwise. -/// -/// \remarks The method caches *strong reference* to the provided interface in m_pBlendState. template -bool DeviceContextBase :: SetBlendState( IBlendState *pBS, const float* pBlendFactors, Uint32 SampleMask, Uint32 Dummy ) +inline bool DeviceContextBase :: SetStencilRef(Uint32 StencilRef, int) { - // If null blend state provided, bind default state - if( !pBS ) - pBS = m_pDefaultBS; - - static const float DefaultBlendFactors[4] = { 1, 1, 1, 1 }; - if( pBlendFactors == nullptr ) - pBlendFactors = DefaultBlendFactors; - - // Here m_pBlendState is certainly a live object because we keep the - // strong reference. pBS is also clearly live object, so we can - // safely compare pointers. - if( m_pBlendState != pBS || - m_BlendFactors[0] != pBlendFactors[0] || - m_BlendFactors[1] != pBlendFactors[1] || - m_BlendFactors[2] != pBlendFactors[2] || - m_BlendFactors[3] != pBlendFactors[3] || - m_SamplesBlendMask != SampleMask ) + if (m_StencilRef != StencilRef) { - m_pBlendState = pBS; - m_SamplesBlendMask = SampleMask; - for( int i = 0; i < 4; ++i ) - m_BlendFactors[i] = pBlendFactors[i]; - + m_StencilRef = StencilRef; return true; } - return false; } template -void DeviceContextBase :: GetDepthStencilState(IDepthStencilState **ppDSS, Uint32 &StencilRef) -{ - VERIFY( ppDSS != nullptr, "Null pointer provided null" ); - VERIFY( *ppDSS == nullptr, "Memory address contains a pointer to a non-null depth-stencil state" ); - VERIFY( m_pDSState, "No depth-stencil state is bound. At least default state must always be bound. Did you forget to call CreateDefaultStates()?" ); - m_pDSState->QueryInterface( IID_DepthStencilState, reinterpret_cast( ppDSS ) ); - StencilRef = m_StencilRef; -}; - -template -void DeviceContextBase :: GetRasterizerState(IRasterizerState **ppRS ) -{ - VERIFY( ppRS != nullptr, "Null pointer provided null" ); - VERIFY( *ppRS == nullptr, "Memory address contains a pointer to a non-null rasterizer state" ); - VERIFY( m_pRasterizerState, "No rasterizer state is bound. At least default state must always be bound. Did you forget to call CreateDefaultStates()?" ); - m_pRasterizerState->QueryInterface( IID_RasterizerState, reinterpret_cast( ppRS ) ); -} - -template -void DeviceContextBase :: GetBlendState( IBlendState **ppBS, float* BlendFactors, Uint32& SamplesBlendMask ) -{ - VERIFY( ppBS != nullptr, "Null pointer provided null" ); - VERIFY( *ppBS == nullptr, "Memory address contains a pointer to a non-null blend state" ); - VERIFY( m_pBlendState, "No blend state is bound. At least default state must always be bound. Did you forget to call CreateDefaultStates()?" ); - m_pBlendState->QueryInterface( IID_BlendState, reinterpret_cast( ppBS ) ); - for( Uint32 f = 0; f < 4; ++f ) - BlendFactors[f] = m_BlendFactors[f]; - SamplesBlendMask = m_SamplesBlendMask; -} - -template -void DeviceContextBase :: GetRenderTargetSize( Uint32 &RTWidth, Uint32 &RTHeight ) +inline void DeviceContextBase :: GetRenderTargetSize( Uint32 &RTWidth, Uint32 &RTHeight ) { RTWidth = 0; RTHeight = 0; // First, try to find non-null render target - for( Uint32 rt = 0; rt < m_pBoundRenderTargets.size(); ++rt ) + for( Uint32 rt = 0; rt < m_NumBoundRenderTargets; ++rt ) if( auto *pRTView = m_pBoundRenderTargets[rt].RawPtr() ) { // Use render target size as viewport size @@ -487,22 +388,24 @@ void DeviceContextBase :: GetRenderTargetSize( Uint32 &RTWidth, U } template -void DeviceContextBase :: SetViewports( Uint32 NumViewports, const Viewport *pViewports, Uint32 &RTWidth, Uint32 &RTHeight ) +inline void DeviceContextBase :: SetViewports( Uint32 NumViewports, const Viewport *pViewports, Uint32 &RTWidth, Uint32 &RTHeight ) { if( RTWidth == 0 || RTHeight == 0 ) { GetRenderTargetSize( RTWidth, RTHeight ); } - m_Viewports.resize(NumViewports); + VERIFY(NumViewports < MaxRenderTargets, "Num viewports (", NumViewports,") exceeds the limit (", MaxRenderTargets, ")") + m_NumViewports = std::min(MaxRenderTargets, NumViewports); + Viewport DefaultVP( 0, 0, static_cast(RTWidth), static_cast(RTHeight) ); // If no viewports are specified, use default viewport - if( NumViewports == 1 && pViewports == nullptr ) + if( m_NumViewports == 1 && pViewports == nullptr ) { pViewports = &DefaultVP; } - for( Uint32 vp = 0; vp < NumViewports; ++vp ) + for( Uint32 vp = 0; vp < m_NumViewports; ++vp ) { m_Viewports[vp] = pViewports[vp]; VERIFY( m_Viewports[vp].Width >= 0, "Incorrect viewport width (", m_Viewports[vp].Width, ")" ); @@ -512,26 +415,28 @@ void DeviceContextBase :: SetViewports( Uint32 NumViewports, cons } template -void DeviceContextBase :: GetViewports( Uint32 &NumViewports, Viewport *pViewports ) +inline void DeviceContextBase :: GetViewports( Uint32 &NumViewports, Viewport *pViewports ) { - NumViewports = static_cast( m_Viewports.size() ); + NumViewports = m_NumViewports; if( pViewports ) { - for( Uint32 vp = 0; vp < m_Viewports.size(); ++vp ) + for( Uint32 vp = 0; vp < m_NumViewports; ++vp ) pViewports[vp] = m_Viewports[vp]; } } template -void DeviceContextBase :: SetScissorRects( Uint32 NumRects, const Rect *pRects, Uint32 &RTWidth, Uint32 &RTHeight ) +inline void DeviceContextBase :: SetScissorRects( Uint32 NumRects, const Rect *pRects, Uint32 &RTWidth, Uint32 &RTHeight ) { if( RTWidth == 0 || RTHeight == 0 ) { GetRenderTargetSize( RTWidth, RTHeight ); } - m_ScissorRects.resize( NumRects ); - for( Uint32 sr = 0; sr < NumRects; ++sr ) + VERIFY(NumRects < MaxRenderTargets, "Num scissor rects (", NumRects,") exceeds the limit (", MaxRenderTargets, ")") + m_NumScissorRects = std::min(MaxRenderTargets, NumRects); + + for( Uint32 sr = 0; sr < m_NumScissorRects; ++sr ) { m_ScissorRects[sr] = pRects[sr]; VERIFY( m_ScissorRects[sr].left <= m_ScissorRects[sr].right, "Incorrect horizontal bounds for a scissor rect [", m_ScissorRects[sr].left, ", ", m_ScissorRects[sr].right, ")" ); @@ -540,13 +445,16 @@ void DeviceContextBase :: SetScissorRects( Uint32 NumRects, const } template -bool DeviceContextBase :: SetRenderTargets( Uint32 NumRenderTargets, ITextureView *ppRenderTargets[], ITextureView *pDepthStencil, Uint32 Dummy ) +inline bool DeviceContextBase :: SetRenderTargets( Uint32 NumRenderTargets, ITextureView *ppRenderTargets[], ITextureView *pDepthStencil, Uint32 Dummy ) { bool bBindRenderTargets = false; - if( NumRenderTargets != m_pBoundRenderTargets.size() ) + if( NumRenderTargets != m_NumBoundRenderTargets ) { bBindRenderTargets = true; - m_pBoundRenderTargets.resize(NumRenderTargets); + for(Uint32 rt=NumRenderTargets; rt :: SetRenderTargets( Uint32 NumRenderTarge } template -void DeviceContextBase :: GetRenderTargets( Uint32 &NumRenderTargets, ITextureView **ppRTVs, ITextureView **ppDSV ) +inline void DeviceContextBase :: GetRenderTargets( Uint32 &NumRenderTargets, ITextureView **ppRTVs, ITextureView **ppDSV ) { - NumRenderTargets = static_cast( m_pBoundRenderTargets.size() ); + NumRenderTargets = m_NumBoundRenderTargets; if( ppRTVs ) { @@ -620,40 +528,51 @@ void DeviceContextBase :: GetRenderTargets( Uint32 &NumRenderTarg } template -void DeviceContextBase :: CreateDefaultStates() +inline void DeviceContextBase :: ClearStateCache() { - DepthStencilStateDesc DefaultDSSDesc; - DefaultDSSDesc.Name = "Default depth stencil state"; - m_pDevice->CreateDepthStencilState( DefaultDSSDesc, &m_pDefaultDSS ); - - RasterizerStateDesc DefaultRSDesc; - DefaultRSDesc.Name = "Default rasterizer state"; - m_pDevice->CreateRasterizerState( DefaultRSDesc, &m_pDefaultRS ); - - BlendStateDesc DefaultBlendState; - DefaultBlendState.Name = "Default blend state"; - m_pDevice->CreateBlendState( DefaultBlendState, &m_pDefaultBS ); - - SetDepthStencilState( m_pDefaultDSS, 0 ); - SetRasterizerState( m_pDefaultRS ); - float BlendFactors[4] = { 1, 1, 1, 1 }; - SetBlendState( m_pDefaultBS, BlendFactors, 0xFFFFFFFF ); -} + for(Uint32 stream=0; stream < m_NumVertexStreams; ++stream) + m_VertexStreams[stream] = VertexStreamInfo(); +#ifdef _DEBUG + for(Uint32 stream=m_NumVertexStreams; stream < _countof(m_VertexStreams); ++stream) + { + VERIFY(m_VertexStreams[stream].pBuffer == nullptr, "Unexpected non-null buffer"); + VERIFY(m_VertexStreams[stream].Offset == 0, "Unexpected non-zero offset"); + VERIFY(m_VertexStreams[stream].Stride == 0, "Unexpected non-zero stride"); + } +#endif + m_NumVertexStreams = 0; -template -void DeviceContextBase :: GetShaders( IShader **ppShaders, Uint32 &NumShaders ) -{ - NumShaders = static_cast( m_pBoundShaders.size() ); - if( ppShaders == nullptr ) - return; - for( Uint32 s = 0; s < NumShaders; ++s ) - { - VERIFY( ppShaders[s] == nullptr, "Non-null pointer found in shader array element #", s ); - if( auto pBoundShader = m_pBoundShaders[s] ) - pBoundShader->QueryInterface( IID_Shader, reinterpret_cast( ppShaders + s ) ); - else - ppShaders[s] = nullptr; + m_pPipelineState.Release(); + + m_pIndexBuffer.Release(); + m_IndexDataStartOffset = 0; + + m_StencilRef = 0; + + for( int i = 0; i < 4; ++i ) + m_BlendFactors[i] = -1; + + for(Uint32 vp=0; vp < m_NumViewports; ++vp) + m_Viewports[vp] = Viewport(); + m_NumViewports = 0; + + for(Uint32 sr=0; sr < m_NumScissorRects; ++sr) + m_ScissorRects[sr] = Rect(); + m_NumScissorRects = 0; + + /// Vector of strong references to bound render targets + for(Uint32 rt=0; rt < m_NumBoundRenderTargets; ++rt ) + m_pBoundRenderTargets[rt].Release(); +#ifdef _DEBUG + for (Uint32 rt = m_NumBoundRenderTargets; rt < _countof(m_pBoundRenderTargets); ++rt) + { + VERIFY(m_pBoundRenderTargets[rt] == nullptr, "Non-null render target found") } +#endif + // Set this to max RT count to force render targets to be bound next time + m_NumBoundRenderTargets = _countof(m_pBoundRenderTargets); + + m_pBoundDepthStencil.Release(); } } diff --git a/Graphics/GraphicsEngine/include/DeviceObjectBase.h b/Graphics/GraphicsEngine/include/DeviceObjectBase.h index f96b6d7c..f4ca83f9 100644 --- a/Graphics/GraphicsEngine/include/DeviceObjectBase.h +++ b/Graphics/GraphicsEngine/include/DeviceObjectBase.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,21 +36,24 @@ template class RenderDeviceBase; /// Template class implementing base functionality for a device object -template -class DeviceObjectBase : public ObjectBase +template +class DeviceObjectBase : public ObjectBase { public: + typedef ObjectBase TBase; + /// \param ObjAllocator - allocator that was used to allocate memory for this instance /// \param pDevice - pointer to the render device. /// \param ObjDesc - object description. /// \param pOwner - owner object. /// \param bIsDeviceInternal - flag indicating if the object is an internal device object /// and must not keep a strong reference to the device. - DeviceObjectBase( class IRenderDevice *pDevice, + DeviceObjectBase( TObjectAllocator &ObjAllocator, + class IRenderDevice *pDevice, const ObjectDescType &ObjDesc, IObject *pOwner = nullptr, bool bIsDeviceInternal = false) : - ObjectBase(pOwner), + TBase(pOwner, &ObjAllocator), m_pDevice( pDevice ), // Do not keep strong reference to the device if the object is an internal device object m_spDevice( bIsDeviceInternal ? nullptr : pDevice ), @@ -70,9 +73,9 @@ public: { } - IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_DeviceObject, ObjectBase ) + IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_DeviceObject, TBase ) - virtual const ObjectDescType& GetDesc()const override + virtual const ObjectDescType& GetDesc()const override final { return m_Desc; } @@ -88,11 +91,15 @@ public: return m_UniqueID.GetID(); } + IRenderDevice *GetDevice()const{return m_pDevice;} + protected: - IRenderDevice *GetDevice(){return m_pDevice;} + /// Copy of a device object name. - /// Copy of a device object name + /// When new object is created, its description structure is copied + /// to m_Desc, the name is copied to m_ObjectNameCopy, and + /// m_Desc.Name pointer is set to m_ObjectNameCopy.c_str(). const String m_ObjectNameCopy; /// Object description diff --git a/Graphics/GraphicsEngine/include/EngineMemory.h b/Graphics/GraphicsEngine/include/EngineMemory.h new file mode 100644 index 00000000..bf5f157c --- /dev/null +++ b/Graphics/GraphicsEngine/include/EngineMemory.h @@ -0,0 +1,73 @@ +/* Copyright 2015-2016 Egor Yusov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#pragma once + +/// \file +/// Implementation of the Diligent::BufferBase template class + +#include "MemoryAllocator.h" + +namespace Diligent +{ + /// Sets raw memory allocator. This function must be called before any memory allocation/deallocation function + /// is called. + void SetRawAllocator(IMemoryAllocator *pRawAllocator); + + /// Returns raw memory allocator + IMemoryAllocator& GetRawAllocator(); +} + +#define NEW(Allocator, Desc, Type, ...) new(Allocator, Desc, __FILE__, __LINE__) Type(Allocator, ##__VA_ARGS__) +#define ALLOCATE(Allocator, Desc, Size) (Allocator).Allocate(Size, Desc, __FILE__, __LINE__) +#define FREE(Allocator, Ptr) Allocator.Free(Ptr) + +#if 0 +inline void* operator new(size_t Size, const char* dbgDescription, const char* dbgFileName, const int dbgLineNumber) +{ + return Diligent::GetRawAllocator().Allocate(Size, dbgDescription, dbgFileName, dbgLineNumber); +} + +inline void* operator new[](size_t Size, const char* dbgDescription, const char* dbgFileName, const int dbgLineNumber) +{ + return Diligent::GetRawAllocator().Allocate(Size, dbgDescription, dbgFileName, dbgLineNumber); +} + +// Arguments of the delete operator must exactly match the arguments of new +inline void operator delete(void* Ptr, const char* dbgDescription, const char* dbgFileName, const int dbgLineNumber) +{ + Diligent::GetRawAllocator().Free(Ptr); +} + +inline void operator delete[](void* Ptr, const char* dbgDescription, const char* dbgFileName, const int dbgLineNumber) +{ + Diligent::GetRawAllocator().Free(Ptr); +} + +#define MemAlloc(Size, Desc) GetRawAllocator().Allocate(Size, Desc, __FILE__, __LINE__) +#define MemFree(Ptr) GetRawAllocator().Free(Ptr) +#define New(Desc) new(Desc, __FILE__, __LINE__) +#define Delete delete + + +#endif \ No newline at end of file diff --git a/Graphics/GraphicsEngine/include/PipelineStateBase.h b/Graphics/GraphicsEngine/include/PipelineStateBase.h new file mode 100644 index 00000000..1cb7d453 --- /dev/null +++ b/Graphics/GraphicsEngine/include/PipelineStateBase.h @@ -0,0 +1,194 @@ +/* Copyright 2015-2016 Egor Yusov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#pragma once + +/// \file +/// Implementation of the Diligent::PipelineStateBase template class + +#include "PipelineState.h" +#include "DeviceObjectBase.h" +#include "STDAllocator.h" +#include "EngineMemory.h" +#include "GraphicsUtilities.h" + +namespace Diligent +{ + +/// Template class implementing base functionality for a pipeline state object. + +/// \tparam BaseInterface - base interface that this class will inheret +/// (Diligent::IPipelineStateD3D11, Diligent::IPipelineStateD3D12 or Diligent::IPipelineStateGL). +/// \tparam RenderDeviceBaseInterface - base interface for the render device +/// (Diligent::IRenderDeviceD3D11, Diligent::IRenderDeviceD3D12, Diligent::IRenderDeviceGL, +/// or Diligent::IRenderDeviceGLES). +template +class PipelineStateBase : public DeviceObjectBase +{ +public: + typedef DeviceObjectBase TDeviceObjectBase; + typedef RenderDeviceBase < RenderDeviceBaseInterface > TRenderDeviceBase; + + /// \param ObjAllocator - allocator that was used to allocate memory for this instance of the pipeline state object + /// \param pDevice - pointer to the device. + /// \param PSODesc - pipeline state description. + /// \param bIsDeviceInternal - flag indicating if the blend state is an internal device object and + /// must not keep a strong reference to the device. + PipelineStateBase( PSOAllocator &ObjAllocator, IRenderDevice *pDevice, const PipelineStateDesc& PSODesc, bool bIsDeviceInternal = false ) : + TDeviceObjectBase( ObjAllocator, pDevice, PSODesc, nullptr, bIsDeviceInternal ), + m_LayoutElements( PSODesc.GraphicsPipeline.InputLayout.NumElements, LayoutElement(), STD_ALLOCATOR_RAW_MEM(LayoutElement, GetRawAllocator(), "Allocator for vector" ) ), + m_NumShaders(0) + { + memset(m_ppShaders, 0, sizeof(m_ppShaders)); + + if (this->m_Desc.IsComputePipeline) + { + const auto &ComputePipeline = PSODesc.ComputePipeline; + if (ComputePipeline.pCS == nullptr) + { + LOG_ERROR_AND_THROW( "Compute shader is not provided" ); + } + +#define VALIDATE_SHADER_TYPE(Shader, ExpectedType, ShaderName)\ + if (Shader && Shader->GetDesc().ShaderType != ExpectedType) \ + { \ + LOG_ERROR_AND_THROW( GetShaderTypeLiteralName(Shader->GetDesc().ShaderType), " is not valid type for ", ShaderName, " shader" );\ + } + VALIDATE_SHADER_TYPE(ComputePipeline.pCS, SHADER_TYPE_COMPUTE, "compute") + + m_pCS = ComputePipeline.pCS; + m_ppShaders[0] = ComputePipeline.pCS; + m_NumShaders = 1; + } + else + { + const auto &GraphicsPipeline = PSODesc.GraphicsPipeline; + + VALIDATE_SHADER_TYPE(GraphicsPipeline.pVS, SHADER_TYPE_VERTEX, "vertex") + VALIDATE_SHADER_TYPE(GraphicsPipeline.pPS, SHADER_TYPE_PIXEL, "pixel") + VALIDATE_SHADER_TYPE(GraphicsPipeline.pGS, SHADER_TYPE_GEOMETRY, "geometry") + VALIDATE_SHADER_TYPE(GraphicsPipeline.pHS, SHADER_TYPE_HULL, "hull") + VALIDATE_SHADER_TYPE(GraphicsPipeline.pDS, SHADER_TYPE_DOMAIN, "domain") +#undef VALIDATE_SHADER_TYPE + + m_pVS = GraphicsPipeline.pVS; + m_pPS = GraphicsPipeline.pPS; + m_pGS = GraphicsPipeline.pGS; + m_pDS = GraphicsPipeline.pDS; + m_pHS = GraphicsPipeline.pHS; + + if( GraphicsPipeline.pVS )m_ppShaders[m_NumShaders++] = GraphicsPipeline.pVS; + if( GraphicsPipeline.pPS )m_ppShaders[m_NumShaders++] = GraphicsPipeline.pPS; + if( GraphicsPipeline.pGS )m_ppShaders[m_NumShaders++] = GraphicsPipeline.pGS; + if( GraphicsPipeline.pHS )m_ppShaders[m_NumShaders++] = GraphicsPipeline.pHS; + if( GraphicsPipeline.pDS )m_ppShaders[m_NumShaders++] = GraphicsPipeline.pDS; + } + + const auto &InputLayout = PSODesc.GraphicsPipeline.InputLayout; + for( size_t Elem = 0; Elem < InputLayout.NumElements; ++Elem ) + m_LayoutElements[Elem] = InputLayout.LayoutElements[Elem]; + this->m_Desc.GraphicsPipeline.InputLayout.LayoutElements = m_LayoutElements.data(); + + // Correct description and compute offsets and tight strides + for( auto It = m_LayoutElements.begin(); It != m_LayoutElements.end(); ++It ) + { + if( It->ValueType == VT_FLOAT32 || It->ValueType == VT_FLOAT16 ) + It->IsNormalized = false; // Floating point values cannot be normalized + + auto BuffSlot = It->BufferSlot; + if( BuffSlot >= _countof(m_TightStrides) ) + { + UNEXPECTED("Buffer slot (", BuffSlot, ") exceeds the limit (", _countof(m_TightStrides), ")"); + continue; + } + + auto &CurrStride = m_TightStrides[BuffSlot]; + if( It->RelativeOffset < CurrStride ) + { + if( It->RelativeOffset == 0 ) + It->RelativeOffset = CurrStride; + else + UNEXPECTED( "Overlapping layout elements" ); + } + + CurrStride += It->NumComponents * GetValueSize( It->ValueType ); + } + } + + ~PipelineStateBase() + { + /* + /// \note Destructor cannot directly remove the object from the registry as this may cause a + /// deadlock at the point where StateObjectsRegistry::Find() locks the weak pointer: if we + /// are in dtor, the object is locked by Diligent::RefCountedObject::Release() and + /// StateObjectsRegistry::Find() will wait for that lock to be released. + /// A the same time this thread will be waiting for the other thread to unlock the registry.\n + /// Thus destructor only notifies the registry that there is a deleted object. + /// The reference to the object will be removed later. + auto &PipelineStateRegistry = static_cast(this->GetDevice())->GetBSRegistry(); + auto &RasterizerStateRegistry = static_cast(this->GetDevice())->GetRSRegistry(); + auto &DSSRegistry = static_cast(this->GetDevice())->GetDSSRegistry(); + // StateObjectsRegistry::ReportDeletedObject() does not lock the registry, but only + // atomically increments the outstanding deleted objects counter. + PipelineStateRegistry.ReportDeletedObject(); + RasterizerStateRegistry.ReportDeletedObject(); + DSSRegistry.ReportDeletedObject(); + */ + } + + IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_PipelineState, TDeviceObjectBase ) + + virtual const Uint32* GetTightStrides()const + { + return m_TightStrides; + } + + IShader* GetVS(){return m_pVS;} + IShader* GetPS(){return m_pPS;} + IShader* GetGS(){return m_pGS;} + IShader* GetDS(){return m_pDS;} + IShader* GetHS(){return m_pHS;} + IShader* GetCS(){return m_pCS;} + + IShader* const* GetShaders()const{return m_ppShaders;} + Uint32 GetNumShaders()const{return m_NumShaders;} + +protected: + std::vector > m_LayoutElements; + + // The size of this array must be equal to the + // maximum number of buffer slots, because a layout + // element can refer to any input slot + Uint32 m_TightStrides[MaxBufferSlots] = {}; + + RefCntAutoPtr m_pVS; ///< Strong reference to the vertex shader + RefCntAutoPtr m_pPS; ///< Strong reference to the pixel shader + RefCntAutoPtr m_pGS; ///< Strong reference to the geometry shader + RefCntAutoPtr m_pDS; ///< Strong reference to the domain shader + RefCntAutoPtr m_pHS; ///< Strong reference to the hull shader + RefCntAutoPtr m_pCS; ///< Strong reference to the compute shader + IShader *m_ppShaders[5]; ///< Array of pointers to shaders that this PSO uses + Uint32 m_NumShaders; ///< Number of shaders that this PSO uses +}; + +} diff --git a/Graphics/GraphicsEngine/include/RasterizerStateBase.h b/Graphics/GraphicsEngine/include/RasterizerStateBase.h deleted file mode 100644 index a3c90275..00000000 --- a/Graphics/GraphicsEngine/include/RasterizerStateBase.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright 2015 Egor Yusov - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. - * - * In no event and under no legal theory, whether in tort (including negligence), - * contract, or otherwise, unless required by applicable law (such as deliberate - * and grossly negligent acts) or agreed to in writing, shall any Contributor be - * liable for any damages, including any direct, indirect, special, incidental, - * or consequential damages of any character arising as a result of this License or - * out of the use or inability to use the software (including but not limited to damages - * for loss of goodwill, work stoppage, computer failure or malfunction, or any and - * all other commercial damages or losses), even if such Contributor has been advised - * of the possibility of such damages. - */ - -#pragma once - -/// \file -/// Implementation of the Diligent::RasterizerStateBase template class - -#include "RasterizerState.h" -#include "DeviceObjectBase.h" - -namespace Diligent -{ - -/// Template class implementing base functionality for a rasterizer object. - -/// \tparam BaseInterface - base interface that this class will inheret -/// (Diligent::IRasterizerStateD3D11 or Diligent::IRasterizerStateGL). -/// \tparam RenderDeviceBaseInterface - base interface for the render device -/// (Diligent::IRenderDeviceD3D11, Diligent::IRenderDeviceGL, -/// or Diligent::IRenderDeviceGLES). -template -class RasterizerStateBase : public DeviceObjectBase -{ -public: - typedef DeviceObjectBase TDeviceObjectBase; - typedef RenderDeviceBase < RenderDeviceBaseInterface > TRenderDeviceBase; - - /// \param pDevice - pointer to the device. - /// \param RSDesc - rasterizer state description. - /// \param bIsDeviceInternal - flag indicating if the state is an internal device object and - /// must not keep a strong reference to the device. - RasterizerStateBase( IRenderDevice *pDevice, const RasterizerStateDesc& RSDesc, bool bIsDeviceInternal = false ) : - TDeviceObjectBase( pDevice, RSDesc, nullptr, bIsDeviceInternal ) - { - } - - ~RasterizerStateBase() - { - /// \note Destructor cannot directly remove the object from the registry as this may cause a - /// deadlock. See BlendStateBase::~BlendStateBase() for details. - auto &RasterizerStateRegistry = static_cast(this->GetDevice())->GetRSRegistry(); - RasterizerStateRegistry.ReportDeletedObject(); - } - - IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_RasterizerState, TDeviceObjectBase ) -}; - -} diff --git a/Graphics/GraphicsEngine/include/RenderDeviceBase.h b/Graphics/GraphicsEngine/include/RenderDeviceBase.h index 97103f23..bccb4b10 100644 --- a/Graphics/GraphicsEngine/include/RenderDeviceBase.h +++ b/Graphics/GraphicsEngine/include/RenderDeviceBase.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,9 +36,9 @@ #include "DeviceContext.h" #include "SwapChain.h" #include "GraphicsUtilities.h" - -using Diligent::RefCntAutoPtr; -using Diligent::RefCntWeakPtr; +#include "FixedBlockMemoryAllocator.h" +#include "EngineMemory.h" +#include "STDAllocator.h" namespace std { @@ -48,8 +48,8 @@ namespace std { size_t operator()( const Diligent::SamplerDesc &SamDesc ) const { - // Sampler name is ignored in comparison operator - // and should not be hashed + // Sampler name is ignored in comparison operator + // and should not be hashed return Diligent::ComputeHash( // SamDesc.Name, static_cast(SamDesc.MinFilter), static_cast(SamDesc.MagFilter), @@ -75,9 +75,9 @@ namespace std size_t operator()( const Diligent::StencilOpDesc &StOpDesc ) const { return Diligent::ComputeHash( static_cast( StOpDesc.StencilFailOp ), - static_cast( StOpDesc.StencilDepthFailOp ), - static_cast( StOpDesc.StencilPassOp ), - static_cast( StOpDesc.StencilFunc ) ); + static_cast( StOpDesc.StencilDepthFailOp ), + static_cast( StOpDesc.StencilPassOp ), + static_cast( StOpDesc.StencilFunc ) ); } }; @@ -85,19 +85,16 @@ namespace std template<> struct hash { - size_t operator()( const Diligent::DepthStencilStateDesc &DSSDesc ) const + size_t operator()( const Diligent::DepthStencilStateDesc &DepthStencilDesc ) const { - // Depth-stencil state name is ignored in comparison operator - // and should not be hashed - return Diligent::ComputeHash( // DSSDesc.Name, - DSSDesc.DepthEnable, - DSSDesc.DepthWriteEnable, - static_cast(DSSDesc.DepthFunc), - DSSDesc.StencilEnable, - DSSDesc.StencilReadMask, - DSSDesc.StencilWriteMask, - DSSDesc.FrontFace, - DSSDesc.BackFace ); + return Diligent::ComputeHash( DepthStencilDesc.DepthEnable, + DepthStencilDesc.DepthWriteEnable, + static_cast(DepthStencilDesc.DepthFunc), + DepthStencilDesc.StencilEnable, + DepthStencilDesc.StencilReadMask, + DepthStencilDesc.StencilWriteMask, + DepthStencilDesc.FrontFace, + DepthStencilDesc.BackFace ); } }; @@ -105,20 +102,17 @@ namespace std template<> struct hash { - size_t operator()( const Diligent::RasterizerStateDesc &RSDesc ) const + size_t operator()( const Diligent::RasterizerStateDesc &RasterizerDesc ) const { - // Rasterizer state name is ignored in comparison operator - // and should not be hashed - return Diligent::ComputeHash( // RSDesc.Name, - static_cast( RSDesc.FillMode ), - static_cast( RSDesc.CullMode ), - RSDesc.FrontCounterClockwise, - RSDesc.DepthBias, - RSDesc.DepthBiasClamp, - RSDesc.SlopeScaledDepthBias, - RSDesc.DepthClipEnable, - RSDesc.ScissorEnable, - RSDesc.AntialiasedLineEnable ); + return Diligent::ComputeHash( static_cast( RasterizerDesc.FillMode ), + static_cast( RasterizerDesc.CullMode ), + RasterizerDesc.FrontCounterClockwise, + RasterizerDesc.DepthBias, + RasterizerDesc.DepthBiasClamp, + RasterizerDesc.SlopeScaledDepthBias, + RasterizerDesc.DepthClipEnable, + RasterizerDesc.ScissorEnable, + RasterizerDesc.AntialiasedLineEnable ); } }; @@ -143,17 +137,14 @@ namespace std rt.RenderTargetWriteMask ); } Diligent::HashCombine( Seed, - // Blend state name is ignored in comparison operator - // and should not be hashed - // BSDesc.Name, - BSDesc.AlphaToCoverageEnable, - BSDesc.IndependentBlendEnable ); + BSDesc.AlphaToCoverageEnable, + BSDesc.IndependentBlendEnable ); return Seed; } }; - /// Hash function specialization for Diligent::BlendStateDesc structure. + /// Hash function specialization for Diligent::TextureViewDesc structure. template<> struct hash { @@ -162,7 +153,7 @@ namespace std std::size_t Seed = 0; Diligent::HashCombine( Seed, static_cast(TexViewDesc.ViewType), - static_cast(TexViewDesc.TextureType), + static_cast(TexViewDesc.TextureDim), static_cast(TexViewDesc.Format), TexViewDesc.MostDetailedMip, TexViewDesc.NumMipLevels, @@ -179,30 +170,63 @@ namespace Diligent /// Base implementation of a render device +/// \tparam BaseInterface - base interface that this class will inheret. /// \warning /// Render device must *NOT* hold strong references to any /// object it creates to avoid circular dependencies. /// Device context, swap chain and all object the device creates /// keep strong reference to the device. -/// Device only holds weak reference to immediate context. -template -class RenderDeviceBase : public ObjectBase +/// Device only holds weak reference to the immediate context. +template +class RenderDeviceBase : public ObjectBase { public: - RenderDeviceBase() : - m_TextureFormatsInfo( TEX_FORMAT_NUM_FORMATS ), - m_TexFmtInfoInitFlags( TEX_FORMAT_NUM_FORMATS ), - m_SamplersRegistry("sampler"), - m_DSSRegistry("ds state"), - m_RSRegistry("rasterizer state"), - m_BSRegistry("blend state") + + typedef ObjectBase TObjectBase; + + /// \param RawMemAllocator - allocator that will be used to allocate memory for all device objects (including render device itself) + /// \param NumDeferredContexts - number of deferred device contexts + /// \param TextureObjSize - size of the texture object, in bytes + /// \param TexViewObjSize - size of the texture view object, in bytes + /// \param BufferObjSize - size of the buffer object, in bytes + /// \param BuffViewObjSize - size of the buffer view object, in bytes + /// \param ShaderObjSize - size of the shader object, in bytes + /// \param SamplerObjSize - size of the sampler object, in bytes + /// \param PSOSize - size of the pipeline state object, in bytes + /// \param SRBSize - size of the shader resource binding object, in bytes + /// \remarks Render device uses fixed block allocators (see FixedBlockMemoryAllocator) to allocate memory for + /// device objects. The object sizes provided to constructor are used to initialize the allocators. + RenderDeviceBase(IMemoryAllocator &RawMemAllocator, + Uint32 NumDeferredContexts, + size_t TextureObjSize, + size_t TexViewObjSize, + size_t BufferObjSize, + size_t BuffViewObjSize, + size_t ShaderObjSize, + size_t SamplerObjSize, + size_t PSOSize, + size_t SRBSize) : + TObjectBase(nullptr, &RawMemAllocator), + m_TextureFormatsInfo( TEX_FORMAT_NUM_FORMATS, TextureFormatInfoExt(), STD_ALLOCATOR_RAW_MEM(TextureFormatInfoExt, RawMemAllocator, "Allocator for vector") ), + m_TexFmtInfoInitFlags( TEX_FORMAT_NUM_FORMATS, false, STD_ALLOCATOR_RAW_MEM(bool, RawMemAllocator, "Allocator for vector") ), + m_wpDeferredContexts(NumDeferredContexts, RefCntWeakPtr(), STD_ALLOCATOR_RAW_MEM(RefCntWeakPtr, RawMemAllocator, "Allocator for vector< RefCntWeakPtr >")), + m_SamplersRegistry(RawMemAllocator, "sampler"), + m_TexObjAllocator(RawMemAllocator, TextureObjSize, 64), + m_TexViewObjAllocator(RawMemAllocator, TexViewObjSize, 64), + m_BufObjAllocator(RawMemAllocator, BufferObjSize, 128), + m_BuffViewObjAllocator(RawMemAllocator, BuffViewObjSize, 128), + m_ShaderObjAllocator(RawMemAllocator, ShaderObjSize, 32), + m_SamplerObjAllocator(RawMemAllocator, SamplerObjSize, 32), + m_PSOAllocator(RawMemAllocator, PSOSize, 128), + m_SRBAllocator(RawMemAllocator, SRBSize, 1024), + m_ResMappingAllocator(RawMemAllocator, sizeof(ResourceMappingImpl), 16) { // Initialize texture format info for( Uint32 Fmt = TEX_FORMAT_UNKNOWN; Fmt < TEX_FORMAT_NUM_FORMATS; ++Fmt ) static_cast(m_TextureFormatsInfo[Fmt]) = GetTextureFormatAttribs( static_cast(Fmt) ); // https://msdn.microsoft.com/en-us/library/windows/desktop/ff471325(v=vs.85).aspx - std::vector FilterableFormats = + TEXTURE_FORMAT FilterableFormats[] = { TEX_FORMAT_RGBA32_FLOAT, // OpenGL ES3.1 does not require this format to be filterable TEX_FORMAT_RGBA16_FLOAT, @@ -243,8 +267,8 @@ public: TEX_FORMAT_BC5_SNORM, TEX_FORMAT_B5G6R5_UNORM }; - for( auto fmt = FilterableFormats.begin(); fmt != FilterableFormats.end(); ++fmt ) - m_TextureFormatsInfo[ *fmt ].Filterable = true; + for( Uint32 fmt = 0; fmt < _countof(FilterableFormats); ++fmt ) + m_TextureFormatsInfo[ FilterableFormats[fmt] ].Filterable = true; } ~RenderDeviceBase() @@ -253,14 +277,17 @@ public: IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_RenderDevice, ObjectBase ) - virtual void CreateResourceMapping( const ResourceMappingDesc &MappingDesc, IResourceMapping **ppMapping ); + /// Implementation of IRenderDevice::CreateResourceMapping(). + virtual void CreateResourceMapping( const ResourceMappingDesc &MappingDesc, IResourceMapping **ppMapping )override final; - virtual const DeviceCaps& GetDeviceCaps()const + /// Implementation of IRenderDevice::GetDeviceCaps(). + virtual const DeviceCaps& GetDeviceCaps()const override final { return m_DeviceCaps; } - virtual const TextureFormatInfo &GetTextureFormatInfo(TEXTURE_FORMAT TexFormat) + /// Implementation of IRenderDevice::GetTextureFormatInfo(). + virtual const TextureFormatInfo &GetTextureFormatInfo(TEXTURE_FORMAT TexFormat)override final { VERIFY( TexFormat >= TEX_FORMAT_UNKNOWN && TexFormat < TEX_FORMAT_NUM_FORMATS, "Texture format out of range" ); const auto& TexFmtInfo = m_TextureFormatsInfo[TexFormat]; @@ -268,7 +295,8 @@ public: return TexFmtInfo; } - virtual const TextureFormatInfoExt &GetTextureFormatInfoExt( TEXTURE_FORMAT TexFormat ) + /// Implementation of IRenderDevice::GetTextureFormatInfoExt(). + virtual const TextureFormatInfoExt &GetTextureFormatInfoExt( TEXTURE_FORMAT TexFormat )override final { VERIFY( TexFormat >= TEX_FORMAT_UNKNOWN && TexFormat < TEX_FORMAT_NUM_FORMATS, "Texture format out of range" ); const auto& TexFmtInfo = m_TextureFormatsInfo[TexFormat]; @@ -287,9 +315,6 @@ public: } StateObjectsRegistry &GetSamplerRegistry(){ return m_SamplersRegistry; } - StateObjectsRegistry &GetDSStateRegistry(){ return m_DSSRegistry; } - StateObjectsRegistry &GetRSRegistry() { return m_RSRegistry; } - StateObjectsRegistry &GetBSRegistry() { return m_BSRegistry; } /// Set weak reference to the immediate context void SetImmediateContext(IDeviceContext *pImmediateContext) @@ -298,7 +323,25 @@ public: m_wpImmediateContext = pImmediateContext; } + /// Set weak reference to the deferred context + void SetDeferredContext(size_t Ctx, IDeviceContext *pDeferredCtx) + { + VERIFY( m_wpDeferredContexts[Ctx].Lock() == nullptr, "Deferred context has already been set" ); + m_wpDeferredContexts[Ctx] = pDeferredCtx; + } + + /// Returns number of deferred contexts + size_t GetNumDeferredContexts()const + { + return m_wpDeferredContexts.size(); + } + RefCntAutoPtr GetImmediateContext(){ return m_wpImmediateContext.Lock(); } + RefCntAutoPtr GetDeferredContext(size_t Ctx){ return m_wpDeferredContexts[Ctx].Lock(); } + + FixedBlockMemoryAllocator& GetTexViewObjAllocator(){return m_TexViewObjAllocator;} + FixedBlockMemoryAllocator& GetBuffViewObjAllocator(){return m_BuffViewObjAllocator;} + FixedBlockMemoryAllocator& GetSRBAllocator(){return m_SRBAllocator;} protected: @@ -314,15 +357,25 @@ protected: // This is safe because every object unregisters itself // when it is deleted. StateObjectsRegistry m_SamplersRegistry; ///< Sampler state registry - StateObjectsRegistry m_DSSRegistry;///< Depth-stencil state registry - StateObjectsRegistry m_RSRegistry; ///< Rasterizer state registry - StateObjectsRegistry m_BSRegistry; ///< Blend state registry - std::vector m_TextureFormatsInfo; - std::vector m_TexFmtInfoInitFlags; + std::vector > m_TextureFormatsInfo; + std::vector > m_TexFmtInfoInitFlags; /// Weak reference to the immediate context. Immediate context holds strong reference /// to the device, so we must use weak reference to avoid circular dependencies. - Diligent::RefCntWeakPtr m_wpImmediateContext; + RefCntWeakPtr m_wpImmediateContext; + + /// Weak references to deferred contexts. + std::vector< RefCntWeakPtr, STDAllocatorRawMem > > m_wpDeferredContexts; + + FixedBlockMemoryAllocator m_TexObjAllocator; ///< Allocator for texture objects + FixedBlockMemoryAllocator m_TexViewObjAllocator; ///< Allocator for texture view objects + FixedBlockMemoryAllocator m_BufObjAllocator; ///< Allocator for buffer objects + FixedBlockMemoryAllocator m_BuffViewObjAllocator; ///< Allocator for buffer view objects + FixedBlockMemoryAllocator m_ShaderObjAllocator; ///< Allocator for shader objects + FixedBlockMemoryAllocator m_SamplerObjAllocator; ///< Allocator for sampler objects + FixedBlockMemoryAllocator m_PSOAllocator; ///< Allocator for pipeline state objects + FixedBlockMemoryAllocator m_SRBAllocator; ///< Allocator for shader resource binding objects + FixedBlockMemoryAllocator m_ResMappingAllocator; ///< Allocator for resource mapping objects }; @@ -334,20 +387,20 @@ void RenderDeviceBase::CreateResourceMapping( const ResourceMappi return; VERIFY( *ppMapping == nullptr, "Overwriting reference to existing object may cause memory leaks" ); - auto *pResourceMapping( new ResourceMappingImpl() ); + auto *pResourceMapping( NEW(m_ResMappingAllocator, "ResourceMappingImpl instance", ResourceMappingImpl, GetRawAllocator()) ); pResourceMapping->QueryInterface( IID_ResourceMapping, reinterpret_cast(ppMapping) ); if( MappingDesc.pEntries ) { for( auto *pEntry = MappingDesc.pEntries; pEntry->Name && pEntry->pObject; ++pEntry ) { - (*ppMapping)->AddResource( pEntry->Name, pEntry->pObject, true ); + (*ppMapping)->AddResourceArray( pEntry->Name, pEntry->ArrayIndex, &pEntry->pObject, 1, true ); } } } -/// \tparam TObjectType - type of the object being created (IBuffer, ITexture, IBlendState, etc.) -/// \tparam TObjectDescType - type of the object description structure (BufferDesc, TextureDesc, BlendStateDesc, etc.) +/// \tparam TObjectType - type of the object being created (IBuffer, ITexture, etc.) +/// \tparam TObjectDescType - type of the object description structure (BufferDesc, TextureDesc, etc.) /// \tparam TObjectConstructor - type of the function that constructs the object /// \param ObjectTypeName - string name of the object type ("buffer", "texture", etc.) /// \param Desc - object description diff --git a/Graphics/GraphicsEngine/include/ResourceMappingImpl.h b/Graphics/GraphicsEngine/include/ResourceMappingImpl.h index 6d412485..509632d7 100644 --- a/Graphics/GraphicsEngine/include/ResourceMappingImpl.h +++ b/Graphics/GraphicsEngine/include/ResourceMappingImpl.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,29 +30,103 @@ #include "ObjectBase.h" #include #include "HashUtils.h" +#include "STDAllocator.h" namespace Diligent { + struct ResMappingHashKey + { + ResMappingHashKey(const Char* Str, bool bMakeCopy, Uint32 ArrInd): + StrKey(Str, bMakeCopy), + ArrayIndex(ArrInd) + { + } + + ResMappingHashKey(ResMappingHashKey &&rhs) : + StrKey(std::move(rhs.StrKey)), + ArrayIndex(rhs.ArrayIndex) + {} + + bool operator == (const ResMappingHashKey& RHS)const + { + return StrKey == RHS.StrKey && ArrayIndex == RHS.ArrayIndex; + } + + size_t GetHash()const + { + if( Hash == 0 ) + { + Hash = ComputeHash( StrKey, ArrayIndex ); + } + + return Hash; + } + + + ResMappingHashKey( const ResMappingHashKey& ) = delete; + ResMappingHashKey& operator = ( const ResMappingHashKey& ) = delete; + ResMappingHashKey& operator = ( ResMappingHashKey&& ) = delete; + + HashMapStringKey StrKey; + Uint32 ArrayIndex; + mutable size_t Hash = 0; + }; +} + +namespace std +{ + template<> + struct hash + { + size_t operator()( const Diligent::ResMappingHashKey &Key ) const + { + return Key.GetHash(); + } + }; +} + +namespace Diligent +{ + class FixedBlockMemoryAllocator; + /// Implementation of the resource mapping - class ResourceMappingImpl : public ObjectBase + class ResourceMappingImpl : public ObjectBase { public: + typedef ObjectBase TObjectBase; + + /// \param ObjAllocator allocator that was used to allocate memory for this instance of the resource mapping object. + /// \param RawMemAllocator raw memory allocator that is used by the m_HashTable member + ResourceMappingImpl(FixedBlockMemoryAllocator &ObjAllocator, IMemoryAllocator &RawMemAllocator) : + TObjectBase(nullptr, &ObjAllocator), + m_HashTable(STD_ALLOCATOR_RAW_MEM(HashTableElem, RawMemAllocator, "Allocator for unordered_map< ResMappingHashKey, RefCntAutoPtr >") ) + {} + ~ResourceMappingImpl(); - virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface ); + virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface )override final; + + /// Implementation of IResourceMapping::AddResource() + virtual void AddResource( const Char *Name, IDeviceObject *pObject, bool bIsUnique )override final; - virtual void AddResource( const Char *Name, IDeviceObject *pObject, bool bIsUnique ); - virtual void RemoveResource( IDeviceObject *pObject ); - virtual void RemoveResourceByName( const Char *Name ); + /// Implementation of IResourceMapping::AddResourceArray() + virtual void AddResourceArray( const Char *Name, Uint32 StartIndex, IDeviceObject * const* ppObjects, Uint32 NumElements, bool bIsUnique )override final; + + /// Implementation of IResourceMapping::RemoveResourceByName() + virtual void RemoveResourceByName( const Char *Name, Uint32 ArrayIndex )override final; - /// Finds resource in the mapping. If no resource is found, nullptr is returned - virtual void GetResource( const Char *Name, IDeviceObject **ppResource ); + /// Implementation of IResourceMapping::GetResource() + virtual void GetResource( const Char *Name, IDeviceObject **ppResource, Uint32 ArrayIndex )override final; + + /// Returns number of resources in the resource mapping. virtual size_t GetSize(); private: + ThreadingTools::LockHelper Lock(); ThreadingTools::LockFlag m_LockFlag; - std::unordered_map< Diligent::HashMapStringKey, Diligent::RefCntAutoPtr > m_HashTable; + typedef std::pair > HashTableElem; + std::unordered_map< ResMappingHashKey, RefCntAutoPtr, std::hash, std::equal_to, STDAllocatorRawMem > m_HashTable; }; } diff --git a/Graphics/GraphicsEngine/include/SamplerBase.h b/Graphics/GraphicsEngine/include/SamplerBase.h index de8ff566..cc6b8a94 100644 --- a/Graphics/GraphicsEngine/include/SamplerBase.h +++ b/Graphics/GraphicsEngine/include/SamplerBase.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,29 +36,30 @@ namespace Diligent /// Template class implementing base functionality for a sampler object. /// \tparam BaseInterface - base interface that this class will inheret -/// (Diligent::ISamplerD3D11 or Diligent::ISamplerGL). +/// (Diligent::ISamplerD3D11, Diligent::ISamplerD3D12 or Diligent::ISamplerGL). /// \tparam RenderDeviceBaseInterface - base interface for the render device -/// (Diligent::IRenderDeviceD3D11, Diligent::IRenderDeviceGL, -/// or Diligent::IRenderDeviceGLES). -template -class SamplerBase : public DeviceObjectBase +/// (Diligent::IRenderDeviceD3D11, Diligent::IRenderDeviceD3D12, Diligent::IRenderDeviceGL, or Diligent::IRenderDeviceGLES). +/// \tparam SamplerObjAllocator - type of the allocator that is used to allocate memory for the sampler object instances +template +class SamplerBase : public DeviceObjectBase { public: - typedef DeviceObjectBase TDeviceObjectBase; + typedef DeviceObjectBase TDeviceObjectBase; typedef RenderDeviceBase TRenderDeviceBase; + /// \param ObjAllocator - allocator that was used to allocate memory for this instance of the sampler object /// \param pDevice - pointer to the device. /// \param SamDesc - sampler description. /// \param bIsDeviceInternal - flag indicating if the sampler is an internal device object and /// must not keep a strong reference to the device. - SamplerBase( IRenderDevice *pDevice, const SamplerDesc& SamDesc, bool bIsDeviceInternal = false ) : - TDeviceObjectBase( pDevice, SamDesc, nullptr, bIsDeviceInternal ) + SamplerBase( SamplerObjAllocator &ObjAllocator, IRenderDevice *pDevice, const SamplerDesc& SamDesc, bool bIsDeviceInternal = false ) : + TDeviceObjectBase( ObjAllocator, pDevice, SamDesc, nullptr, bIsDeviceInternal ) {} ~SamplerBase() { /// \note Destructor cannot directly remove the object from the registry as this may cause a - /// deadlock. See BlendStateBase::~BlendStateBase() for details. + /// deadlock. auto &SamplerRegistry = static_cast(this->GetDevice())->GetSamplerRegistry(); SamplerRegistry.ReportDeletedObject(); } diff --git a/Graphics/GraphicsEngine/include/ShaderBase.h b/Graphics/GraphicsEngine/include/ShaderBase.h index b2f89341..1e03b352 100644 --- a/Graphics/GraphicsEngine/include/ShaderBase.h +++ b/Graphics/GraphicsEngine/include/ShaderBase.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,39 +28,134 @@ #include "Shader.h" #include "DeviceObjectBase.h" +#include "STDAllocator.h" +#include "PlatformMisc.h" +#include "EngineMemory.h" namespace Diligent { +inline SHADER_TYPE GetShaderTypeFromIndex( Int32 Index ) +{ + return static_cast(1 << Index); +} + +inline Int32 GetShaderTypeIndex( SHADER_TYPE Type ) +{ + Int32 ShaderIndex = PlatformMisc::GetLSB(Type); + +#ifdef _DEBUG + switch( Type ) + { + case SHADER_TYPE_UNKNOWN: VERIFY_EXPR(ShaderIndex == -1); break; + case SHADER_TYPE_VERTEX: VERIFY_EXPR(ShaderIndex == 0); break; + case SHADER_TYPE_PIXEL: VERIFY_EXPR(ShaderIndex == 1); break; + case SHADER_TYPE_GEOMETRY:VERIFY_EXPR(ShaderIndex == 2); break; + case SHADER_TYPE_HULL: VERIFY_EXPR(ShaderIndex == 3); break; + case SHADER_TYPE_DOMAIN: VERIFY_EXPR(ShaderIndex == 4); break; + case SHADER_TYPE_COMPUTE: VERIFY_EXPR(ShaderIndex == 5); break; + default: UNEXPECTED( "Unexpected shader type (", Type, ")" ); break; + } + VERIFY( Type == GetShaderTypeFromIndex(ShaderIndex), "Incorrect shader type index" ); +#endif + return ShaderIndex; +} + +static const int VSInd = GetShaderTypeIndex(SHADER_TYPE_VERTEX); +static const int PSInd = GetShaderTypeIndex(SHADER_TYPE_PIXEL); +static const int GSInd = GetShaderTypeIndex(SHADER_TYPE_GEOMETRY); +static const int HSInd = GetShaderTypeIndex(SHADER_TYPE_HULL); +static const int DSInd = GetShaderTypeIndex(SHADER_TYPE_DOMAIN); +static const int CSInd = GetShaderTypeIndex(SHADER_TYPE_COMPUTE); + +template +SHADER_VARIABLE_TYPE GetShaderVariableType(SHADER_VARIABLE_TYPE DefaultVariableType, const ShaderVariableDesc *VariableDesc, Uint32 NumVars, TNameCompare NameCompare) +{ + for (Uint32 v = 0; v < NumVars; ++v) + { + const auto &CurrVarDesc = VariableDesc[v]; + if ( NameCompare(CurrVarDesc.Name) ) + { + return CurrVarDesc.Type; + } + } + return DefaultVariableType; +} + +inline SHADER_VARIABLE_TYPE GetShaderVariableType(const Char* Name, SHADER_VARIABLE_TYPE DefaultVariableType, const ShaderVariableDesc *VariableDesc, Uint32 NumVars) +{ + return GetShaderVariableType(DefaultVariableType, VariableDesc, NumVars, + [&](const char *VarName) + { + return strcmp(VarName, Name) == 0; + } + ); +} + + /// Base implementation of a shader variable -struct ShaderVariableBase : public ObjectBase + +struct ShaderVariableBase : public IShaderVariable { - ShaderVariableBase(IShader *pShader) : - // Shader variables are always created as part of the shader, - // so we must provide owner pointer to the base class constructor - ObjectBase(pShader), - m_pShader(pShader) - {} + ShaderVariableBase(IObject &Owner) : + // Shader variables are always created as part of the shader, or + // shader resource binding, so we must provide owner pointer to + // the base class constructor + m_Owner(Owner) + { + } - virtual IShader* GetShader()override + IObject& GetOwner() { - return m_pShader; + return m_Owner; } - IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_ShaderVariable, ObjectBase ) + virtual IReferenceCounters* GetReferenceCounters()const override final + { + return m_Owner.GetReferenceCounters(); + } + + virtual Atomics::Long AddRef()override final + { + return m_Owner.AddRef(); + } + + virtual Atomics::Long Release()override final + { + return m_Owner.Release(); + } + + virtual void QueryInterface( const INTERFACE_ID &IID, IObject **ppInterface )override final + { + if( ppInterface == nullptr ) + return; + + *ppInterface = nullptr; + if( IID == IID_ShaderVariable || IID == IID_Unknown ) + { + *ppInterface = this; + (*ppInterface)->AddRef(); + } + } protected: - IShader *m_pShader; + IObject &m_Owner; }; /// Implementation of a dummy shader variable that silently ignores all operations struct DummyShaderVariable : ShaderVariableBase { - DummyShaderVariable(IShader *pShader) : - ShaderVariableBase(pShader) + DummyShaderVariable(IObject &Owner) : + ShaderVariableBase(Owner) {} - virtual void Set( IDeviceObject *pObject )override + virtual void Set( IDeviceObject *pObject )override final + { + // Ignore operation + // Probably output warning + } + + virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final { // Ignore operation // Probably output warning @@ -68,25 +163,77 @@ struct DummyShaderVariable : ShaderVariableBase }; /// Template class implementing base functionality for a shader object -template -class ShaderBase : public DeviceObjectBase + +/// \tparam BaseInterface - base interface that this class will inheret +/// (Diligent::IShaderD3D11, Diligent::IShaderD3D12 or Diligent::IShaderGL). +/// \tparam RenderDeviceBaseInterface - base interface for the render device +/// (Diligent::IRenderDeviceD3D11, Diligent::IRenderDeviceD3D12, Diligent::IRenderDeviceGL, or Diligent::IRenderDeviceGLES). +/// \tparam ShaderObjAllocator - type of the allocator that is used to allocate memory for the shader object instances +template +class ShaderBase : public DeviceObjectBase { public: - typedef DeviceObjectBase TDeviceObjectBase; + typedef DeviceObjectBase TDeviceObjectBase; + /// \param ObjAllocator - allocator that was used to allocate memory for this instance of the shader object /// \param pDevice - pointer to the device. /// \param ShdrDesc - shader description. /// \param bIsDeviceInternal - flag indicating if the shader is an internal device object and /// must not keep a strong reference to the device. - ShaderBase( IRenderDevice *pDevice, const ShaderDesc& ShdrDesc, bool bIsDeviceInternal = false ) : - TDeviceObjectBase( pDevice, ShdrDesc, nullptr, bIsDeviceInternal ), - m_DummyShaderVar(this) - {} + ShaderBase( ShaderObjAllocator &ObjAllocator, IRenderDevice *pDevice, const ShaderDesc& ShdrDesc, bool bIsDeviceInternal = false ) : + TDeviceObjectBase( ObjAllocator, pDevice, ShdrDesc, nullptr, bIsDeviceInternal ), + m_DummyShaderVar(*this), + m_VariablesDesc(ShdrDesc.NumVariables, ShaderVariableDesc(), STD_ALLOCATOR_RAW_MEM(ShaderVariableDesc, GetRawAllocator(), "Allocator for vector") ), + m_StringPool(ShdrDesc.NumVariables + ShdrDesc.NumStaticSamplers, String(), STD_ALLOCATOR_RAW_MEM(String, GetRawAllocator(), "Allocator for vector")), + m_StaticSamplers(ShdrDesc.NumStaticSamplers, StaticSamplerDesc(), STD_ALLOCATOR_RAW_MEM(StaticSamplerDesc, GetRawAllocator(), "Allocator for vector") ) + { + auto Str = m_StringPool.begin(); + if(this->m_Desc.VariableDesc) + { + for (Uint32 v = 0; v < this->m_Desc.NumVariables; ++v, ++Str) + { + m_VariablesDesc[v] = this->m_Desc.VariableDesc[v]; + VERIFY( m_VariablesDesc[v].Name != nullptr, "Variable name not provided" ) + *Str = m_VariablesDesc[v].Name; + m_VariablesDesc[v].Name = Str->c_str(); + } + this->m_Desc.VariableDesc = m_VariablesDesc.data(); + } + if(this->m_Desc.StaticSamplers) + { + for (Uint32 s = 0; s < this->m_Desc.NumStaticSamplers; ++s, ++Str) + { + m_StaticSamplers[s] = this->m_Desc.StaticSamplers[s]; + VERIFY( m_StaticSamplers[s].TextureName != nullptr, "Static sampler texture name not provided" ) + *Str = m_StaticSamplers[s].TextureName; + m_StaticSamplers[s].TextureName = Str->c_str(); +#ifdef _DEBUG + const auto &BorderColor = m_StaticSamplers[s].Desc.BorderColor; + if( !(BorderColor[0] == 0 && BorderColor[1] == 0 && BorderColor[2] == 0 && BorderColor[3] == 0 || + BorderColor[0] == 0 && BorderColor[1] == 0 && BorderColor[2] == 0 && BorderColor[3] == 1 || + BorderColor[0] == 1 && BorderColor[1] == 1 && BorderColor[2] == 1 && BorderColor[3] == 0) ) + { + LOG_WARNING_MESSAGE("Static sampler for variable \"", *Str , "\" specifies border color (", BorderColor[0], ", ", BorderColor[1], ", ", BorderColor[2], ", ", BorderColor[3], "). D3D12 static samplers only allow transparent black (0,0,0,1), opaque black (0,0,0,0) or opaque white (1,1,1,0) as border colors") + } +#endif + } + this->m_Desc.StaticSamplers = m_StaticSamplers.data(); + } + + VERIFY_EXPR(Str == m_StringPool.end()) + } IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_Shader, TDeviceObjectBase ) protected: DummyShaderVariable m_DummyShaderVar; ///< Dummy shader variable + + /// Shader variable descriptions + std::vector > m_VariablesDesc; + /// String pool that is used to hold copies of variable names and static sampler names + std::vector > m_StringPool; + /// Static sampler descriptions + std::vector > m_StaticSamplers; }; } diff --git a/Graphics/GraphicsEngine/include/ShaderResourceBindingBase.h b/Graphics/GraphicsEngine/include/ShaderResourceBindingBase.h new file mode 100644 index 00000000..ce5435f7 --- /dev/null +++ b/Graphics/GraphicsEngine/include/ShaderResourceBindingBase.h @@ -0,0 +1,75 @@ +/* Copyright 2015-2016 Egor Yusov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#pragma once + +/// \file +/// Implementation of the Diligent::ShaderResourceBindingBase template class + +#include "ShaderResourceBinding.h" +#include "ObjectBase.h" +#include "GraphicsTypes.h" +#include "RefCntAutoPtr.h" + +namespace Diligent +{ + +/// Template class implementing base functionality for a shader resource binding + +/// \tparam BaseInterface - base interface that this class will inheret +/// (Diligent::IShaderResourceBindingGL, Diligent::IShaderResourceBindingD3D11, or Diligent::IShaderResourceBindingD3D12). +/// \tparam SRBAllocator - type of the allocator that is used to allocate memory for the shader resource binding object instances +template +class ShaderResourceBindingBase : public ObjectBase +{ +public: + typedef ObjectBase TObjectBase; + + /// \param ObjAllocator - allocator that was used to allocate memory for this instance of the shader resource binding object + /// \param pPSO - pipeline state that this SRB belongs to. + /// \param IsInternal - flag indicating if the shader resource binding is an internal PSO object and + /// must not keep a strong reference to the PSO. + ShaderResourceBindingBase( SRBAllocator &ObjAllocator, IPipelineState *pPSO, bool IsInternal = false ) : + TObjectBase( IsInternal ? pPSO : nullptr, &ObjAllocator ), + m_pPSO( pPSO ), + m_spPSO( IsInternal ? nullptr : pPSO ) + {} + + IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_ShaderResourceBinding, TObjectBase ) + + /// Implementation of IShaderResourceBinding::GetPipelineState(). + virtual IPipelineState* GetPipelineState()override final + { + return m_pPSO; + } + +protected: + + /// Strong reference to PSO. We must use strong reference, because + /// shader resource binding uses PSO's memory allocator to allocate + /// memory for shader resource cache. + Diligent::RefCntAutoPtr m_spPSO; + IPipelineState *m_pPSO; +}; + +} diff --git a/Graphics/GraphicsEngine/include/StateObjectsRegistry.h b/Graphics/GraphicsEngine/include/StateObjectsRegistry.h index e26d1183..35840476 100644 --- a/Graphics/GraphicsEngine/include/StateObjectsRegistry.h +++ b/Graphics/GraphicsEngine/include/StateObjectsRegistry.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ #include "DeviceObject.h" #include +#include "STDAllocator.h" namespace Diligent { @@ -60,8 +61,9 @@ namespace Diligent /// Number of outstanding deleted objects to purge the registry. static const int DeletedObjectsToPurge = 32; - StateObjectsRegistry(const Char* RegistryName) : - m_RegistryName( RegistryName ) + StateObjectsRegistry(IMemoryAllocator &RawAllocator, const Char* RegistryName) : + m_RegistryName( RegistryName ), + m_DescToObjHashMap(STD_ALLOCATOR_RAW_MEM(HashMapElem, RawAllocator, "Allocator for unordered_map >") ) {} ~StateObjectsRegistry() @@ -196,7 +198,8 @@ namespace Diligent Atomics::AtomicLong m_NumDeletedObjects; /// Hash map that stores weak pointers to the referenced objects - std::unordered_map > m_DescToObjHashMap; + typedef std::pair< ResourceDescType, RefCntWeakPtr > HashMapElem; + std::unordered_map, std::hash, std::equal_to, STDAllocatorRawMem > m_DescToObjHashMap; /// Registry name used for debug output const String m_RegistryName; diff --git a/Graphics/GraphicsEngine/include/SwapChainBase.h b/Graphics/GraphicsEngine/include/SwapChainBase.h index c3400877..9b65e80f 100644 --- a/Graphics/GraphicsEngine/include/SwapChainBase.h +++ b/Graphics/GraphicsEngine/include/SwapChainBase.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,17 +34,26 @@ namespace Diligent /// Base implementation of the swap chain. +/// \tparam BaseInterface - base interface that this class will inheret +/// (Diligent::ISwapChainGL, Diligent::ISwapChainD3D11, or Diligent::ISwapChainD3D12). +/// \tparam SwapChainAllocator - type of the allocator that is used to allocate memory for the swap chain object instance /// \remarks Swap chain holds the strong reference to the device and a weak reference to the /// immediate context. -template -class SwapChainBase : public ObjectBase +template +class SwapChainBase : public ObjectBase { public: - typedef ObjectBase TObjectBase; + typedef ObjectBase TObjectBase; - SwapChainBase( IRenderDevice *pDevice, - IDeviceContext *pDeviceContext, - const SwapChainDesc& SCDesc ) : + /// \param Allocator - allocator that was used to allocate memory for this instance of the swap chain object + /// \param pDevice - pointer to the device. + /// \param pDeviceContext - pointer to the device context. + /// \param SCDesc - swap chain description + SwapChainBase( SwapChainAllocator &Allocator, + IRenderDevice *pDevice, + IDeviceContext *pDeviceContext, + const SwapChainDesc& SCDesc ) : + TObjectBase(nullptr, &Allocator), m_pRenderDevice(pDevice), m_wpDeviceContext(pDeviceContext), m_SwapChainDesc(SCDesc) @@ -57,7 +66,8 @@ public: IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_SwapChain, TObjectBase ) - virtual const SwapChainDesc& GetDesc()const + /// Implementation of ISwapChain::GetDesc() + virtual const SwapChainDesc& GetDesc()const override final { return m_SwapChainDesc; } @@ -70,6 +80,7 @@ protected: { m_SwapChainDesc.Width = NewWidth; m_SwapChainDesc.Height = NewHeight; + LOG_INFO_MESSAGE("Changing display resolution to ", m_SwapChainDesc.Width, "x", m_SwapChainDesc.Height); return true; } diff --git a/Graphics/GraphicsEngine/include/TextureBase.h b/Graphics/GraphicsEngine/include/TextureBase.h index 094de62d..4769a97f 100644 --- a/Graphics/GraphicsEngine/include/TextureBase.h +++ b/Graphics/GraphicsEngine/include/TextureBase.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ #include "Texture.h" #include "DeviceObjectBase.h" #include "GraphicsUtilities.h" +#include "STDAllocator.h" #include namespace Diligent @@ -43,49 +44,61 @@ void VliadateCopyTextureDataParams( const TextureDesc &SrcTexDesc, Uint32 SrcMip /// Base implementation of the ITexture interface /// \tparam BaseInterface - base interface that this class will inheret -/// (Diligent::ITextureD3D11 or Diligent::ITextureGL). +/// (Diligent::ITextureD3D11, Diligent::ITextureD3D12 or Diligent::ITextureGL). /// \tparam TTextureViewImpl - type of the texture view implementation -/// (Diligent::TextureViewD3D11Impl or Diligent::TextureViewGLImpl). -template -class TextureBase : public DeviceObjectBase +/// (Diligent::TextureViewD3D11Impl, Diligent::TextureViewD3D12Impl or Diligent::TextureViewGLImpl). +/// \tparam TTexObjAllocator - type of the allocator that is used to allocate memory for the texture object instances +/// \tparam TTexViewObjAllocator - type of the allocator that is used to allocate memory for the texture view object instances +template +class TextureBase : public DeviceObjectBase { public: - typedef DeviceObjectBase TDeviceObjectBase; + typedef DeviceObjectBase TDeviceObjectBase; + /// \param TexObjAllocator - allocator that was used to allocate memory for this instance of the texture object + /// \param TexViewObjAllocator - allocator that is used to allocate memory for the instances of the texture view object. + /// This parameter is only used for debug purposes. /// \param pDevice - pointer to the device /// \param Desc - texture description /// \param bIsDeviceInternal - flag indicating if the texture is an internal device object and /// must not keep a strong reference to the device - TextureBase( IRenderDevice *pDevice, const TextureDesc& Desc, bool bIsDeviceInternal = false ) : - TDeviceObjectBase( pDevice, Desc, nullptr, bIsDeviceInternal ) + TextureBase( TTexObjAllocator &TexObjAllocator, + TTexViewObjAllocator &TexViewObjAllocator, + IRenderDevice *pDevice, + const TextureDesc& Desc, + bool bIsDeviceInternal = false ) : + TDeviceObjectBase( TexObjAllocator, pDevice, Desc, nullptr, bIsDeviceInternal ), +#ifdef _DEBUG + m_dbgTexViewObjAllocator(TexViewObjAllocator), +#endif + m_pDefaultSRV(nullptr, STDDeleter(TexViewObjAllocator)), + m_pDefaultRTV(nullptr, STDDeleter(TexViewObjAllocator)), + m_pDefaultDSV(nullptr, STDDeleter(TexViewObjAllocator)), + m_pDefaultUAV(nullptr, STDDeleter(TexViewObjAllocator)) { if( this->m_Desc.MipLevels == 0 ) { - // Compute the number of levels in the full mipmap chain based - // on the maximum texture dimension - Uint32 MaxDim = 0; - if( this->m_Desc.Type == TEXTURE_TYPE_1D || - this->m_Desc.Type == TEXTURE_TYPE_1D_ARRAY ) + // Compute the number of levels in the full mipmap chain + if( this->m_Desc.Type == RESOURCE_DIM_TEX_1D || + this->m_Desc.Type == RESOURCE_DIM_TEX_1D_ARRAY ) { - MaxDim = this->m_Desc.Width; + this->m_Desc.MipLevels = ComputeMipLevelsCount(this->m_Desc.Width); } - else if( this->m_Desc.Type == TEXTURE_TYPE_2D || - this->m_Desc.Type == TEXTURE_TYPE_2D_ARRAY ) + else if( this->m_Desc.Type == RESOURCE_DIM_TEX_2D || + this->m_Desc.Type == RESOURCE_DIM_TEX_2D_ARRAY || + this->m_Desc.Type == RESOURCE_DIM_TEX_CUBE || + this->m_Desc.Type == RESOURCE_DIM_TEX_CUBE_ARRAY ) { - MaxDim = std::max( this->m_Desc.Width, this->m_Desc.Height ); + this->m_Desc.MipLevels = ComputeMipLevelsCount( this->m_Desc.Width, this->m_Desc.Height ); } - else if( this->m_Desc.Type == TEXTURE_TYPE_3D ) + else if( this->m_Desc.Type == RESOURCE_DIM_TEX_3D ) { - MaxDim = std::max( this->m_Desc.Width, this->m_Desc.Height ); - MaxDim = std::max( MaxDim, this->m_Desc.Depth ); + this->m_Desc.MipLevels = ComputeMipLevelsCount( this->m_Desc.Width, this->m_Desc.Height, this->m_Desc.Depth ); } else { UNEXPECTED( "Unkwnown texture type" ); } - while( (MaxDim >> this->m_Desc.MipLevels) > 0 ) - ++this->m_Desc.MipLevels; - VERIFY( MaxDim >= (1U << (this->m_Desc.MipLevels-1)) && MaxDim < (1U << this->m_Desc.MipLevels), "Incorrect number of Mip levels" ) } // Validate correctness of texture description @@ -94,14 +107,17 @@ public: IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_Texture, TDeviceObjectBase ) + /// Implementaiton of ITexture::CreateView(); calls CreateViewInternal() virtual function that + /// creates texture view for the specific engine implementation. virtual void CreateView( const struct TextureViewDesc &ViewDesc, ITextureView **ppView )override { CreateViewInternal( ViewDesc, ppView, false ); } + /// Base implementaiton of ITexture::UpdateData(); validates input parameters virtual void UpdateData( IDeviceContext *pContext, Uint32 MipLevel, Uint32 Slice, const Box &DstBox, const TextureSubResData &SubresData ) = 0; - + /// Base implementaiton of ITexture::CopyData(); validates input parameters virtual void CopyData( IDeviceContext *pContext, ITexture *pSrcTexture, Uint32 SrcMipLevel, @@ -113,22 +129,42 @@ public: Uint32 DstY, Uint32 DstZ ) = 0; + /// Base implementaiton of ITexture::Map() virtual void Map( IDeviceContext *pContext, MAP_TYPE MapType, Uint32 MapFlags, PVoid &pMappedData ) = 0; - virtual void Unmap( IDeviceContext *pContext ) = 0; + /// Base implementaiton of ITexture::Unmap() + virtual void Unmap( IDeviceContext *pContext, MAP_TYPE MapType ) = 0; + + /// Creates default texture views. + /// + /// - Creates default shader resource view addressing the entire texture if Diligent::BIND_SHADER_RESOURCE flag is set. + /// - Creates default render target view addressing the most detailed mip level if Diligent::BIND_RENDER_TARGET flag is set. + /// - Creates default depth-stencil view addressing the most detailed mip level if Diligent::BIND_DEPTH_STENCIL flag is set. + /// - Creates default unordered access view addressing the entire texture if Diligent::BIND_UNORDERED_ACCESS flag is set. + /// + /// The function calls CreateViewInternal(). void CreateDefaultViews(); protected: + /// Pure virtual function that creates texture view for the specific engine implementation. virtual void CreateViewInternal( const struct TextureViewDesc &ViewDesc, ITextureView **ppView, bool bIsDefaultView ) = 0; +#ifdef _DEBUG + TTexViewObjAllocator &m_dbgTexViewObjAllocator; +#endif // WARNING! We cannot use ITextureView here, because ITextureView has no virtual dtor! - std::unique_ptr m_pDefaultSRV; - std::unique_ptr m_pDefaultRTV; - std::unique_ptr m_pDefaultDSV; - std::unique_ptr m_pDefaultUAV; - + /// Default SRV addressing the entire texture + std::unique_ptr> m_pDefaultSRV; + /// Default RTV addressing the most detailed mip level + std::unique_ptr> m_pDefaultRTV; + /// Default DSV addressing the most detailed mip level + std::unique_ptr> m_pDefaultDSV; + /// Default UAV addressing the entire texture + std::unique_ptr> m_pDefaultUAV; + + /// Implementation of ITexture::GetDefaultView(). ITextureView* GetDefaultView( TEXTURE_VIEW_TYPE ViewType )override { switch( ViewType ) @@ -150,8 +186,8 @@ protected: }; -template -TEXTURE_FORMAT TextureBase :: CorrectTextureViewFormat( TEXTURE_FORMAT Fmt, TEXTURE_VIEW_TYPE TexViewType ) +template +TEXTURE_FORMAT TextureBase :: CorrectTextureViewFormat( TEXTURE_FORMAT Fmt, TEXTURE_VIEW_TYPE TexViewType ) { // Correct texture view format for depth stencil view if( TexViewType == TEXTURE_VIEW_DEPTH_STENCIL ) @@ -203,8 +239,8 @@ TEXTURE_FORMAT TextureBase :: CorrectTextureVie return Fmt; } -template -void TextureBase :: CorrectTextureViewDesc(struct TextureViewDesc &ViewDesc) +template +void TextureBase :: CorrectTextureViewDesc(struct TextureViewDesc &ViewDesc) { #define TEX_VIEW_VALIDATION_ERROR(...) LOG_ERROR_AND_THROW( "Texture view \"", ViewDesc.Name ? ViewDesc.Name : "", "\": ", ##__VA_ARGS__ ); @@ -217,65 +253,159 @@ void TextureBase :: CorrectTextureViewDesc(stru if( ViewDesc.Format == TEX_FORMAT_UNKNOWN ) ViewDesc.Format = CorrectTextureViewFormat( this->m_Desc.Format, ViewDesc.ViewType ); - if( ViewDesc.TextureType == TEXTURE_TYPE_UNDEFINED ) - ViewDesc.TextureType = this->m_Desc.Type; + if( ViewDesc.TextureDim == RESOURCE_DIM_UNDEFINED ) + { + if (this->m_Desc.Type == RESOURCE_DIM_TEX_CUBE || this->m_Desc.Type == RESOURCE_DIM_TEX_CUBE_ARRAY) + { + switch (ViewDesc.ViewType) + { + case TEXTURE_VIEW_SHADER_RESOURCE: + ViewDesc.TextureDim = this->m_Desc.Type; + break; + + case TEXTURE_VIEW_RENDER_TARGET: + case TEXTURE_VIEW_DEPTH_STENCIL: + case TEXTURE_VIEW_UNORDERED_ACCESS: + ViewDesc.TextureDim = RESOURCE_DIM_TEX_2D_ARRAY; + break; + + default: UNEXPECTED("Unexpected view type") + } + } + else + { + ViewDesc.TextureDim = this->m_Desc.Type; + } + } switch( this->m_Desc.Type ) { - case TEXTURE_TYPE_1D: - if( ViewDesc.TextureType != TEXTURE_TYPE_1D ) + case RESOURCE_DIM_TEX_1D: + if( ViewDesc.TextureDim != RESOURCE_DIM_TEX_1D ) { TEX_VIEW_VALIDATION_ERROR( "Incorrect texture type for Texture 1D view: only Texture 1D is allowed" ); } break; - case TEXTURE_TYPE_1D_ARRAY: - if( ViewDesc.TextureType != TEXTURE_TYPE_1D_ARRAY && - ViewDesc.TextureType != TEXTURE_TYPE_1D ) + case RESOURCE_DIM_TEX_1D_ARRAY: + if( ViewDesc.TextureDim != RESOURCE_DIM_TEX_1D_ARRAY && + ViewDesc.TextureDim != RESOURCE_DIM_TEX_1D ) { TEX_VIEW_VALIDATION_ERROR( "Incorrect view type for Texture 1D Array: only Texture 1D or Texture 1D Array are allowed" ); } break; - case TEXTURE_TYPE_2D: - if(ViewDesc.TextureType != TEXTURE_TYPE_2D ) + case RESOURCE_DIM_TEX_2D: + if(ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D ) { TEX_VIEW_VALIDATION_ERROR( "Incorrect texture type for Texture 2D view: only Texture 2D is allowed" ); } break; - case TEXTURE_TYPE_2D_ARRAY: - if( ViewDesc.TextureType != TEXTURE_TYPE_2D_ARRAY && - ViewDesc.TextureType != TEXTURE_TYPE_2D ) + case RESOURCE_DIM_TEX_2D_ARRAY: + if( ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D_ARRAY && + ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D ) { TEX_VIEW_VALIDATION_ERROR( "Incorrect texture type for Texture 2D Array view: only Texture 2D or Texture 2D Array are allowed" ); } break; - case TEXTURE_TYPE_3D: - if( ViewDesc.TextureType != TEXTURE_TYPE_3D ) + case RESOURCE_DIM_TEX_3D: + if( ViewDesc.TextureDim != RESOURCE_DIM_TEX_3D ) { TEX_VIEW_VALIDATION_ERROR( "Incorrect texture type for Texture 3D view: only Texture 3D is allowed" ); } break; + case RESOURCE_DIM_TEX_CUBE: + if(ViewDesc.ViewType == TEXTURE_VIEW_SHADER_RESOURCE) + { + if(ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D && + ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D_ARRAY && + ViewDesc.TextureDim != RESOURCE_DIM_TEX_CUBE) + { + TEX_VIEW_VALIDATION_ERROR( "Incorrect texture type for Texture cube SRV: Texture 2D, Texture 2D array or Texture Cube is allowed" ); + } + } + else + { + if(ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D && + ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D_ARRAY) + { + TEX_VIEW_VALIDATION_ERROR( "Incorrect texture type for Texture cube non-shader resource view: Texture 2D or Texture 2D array is allowed" ); + } + } + break; + + case RESOURCE_DIM_TEX_CUBE_ARRAY: + if(ViewDesc.ViewType == TEXTURE_VIEW_SHADER_RESOURCE) + { + if(ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D && + ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D_ARRAY && + ViewDesc.TextureDim != RESOURCE_DIM_TEX_CUBE && + ViewDesc.TextureDim != RESOURCE_DIM_TEX_CUBE_ARRAY) + { + TEX_VIEW_VALIDATION_ERROR( "Incorrect texture type for Texture cube array SRV: Texture 2D, Texture 2D array, Texture Cube or Texture Cube Array is allowed" ); + } + } + else + { + if(ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D && + ViewDesc.TextureDim != RESOURCE_DIM_TEX_2D_ARRAY) + { + TEX_VIEW_VALIDATION_ERROR( "Incorrect texture type for Texture cube array non-shader resource view: Texture 2D or Texture 2D array is allowed" ); + } + } + break; + default: UNEXPECTED( "Unexpected texture type" ); break; } - if( ViewDesc.TextureType == TEXTURE_TYPE_1D_ARRAY || - ViewDesc.TextureType == TEXTURE_TYPE_2D_ARRAY ) + if ( ViewDesc.TextureDim == RESOURCE_DIM_TEX_CUBE ) + { + VERIFY(ViewDesc.ViewType == TEXTURE_VIEW_SHADER_RESOURCE, "Unexpected view type: SRV is expected"); + if(ViewDesc.NumArraySlices != 6 && ViewDesc.NumArraySlices != 0) + TEX_VIEW_VALIDATION_ERROR( "Texture cube SRV is expected to have 6 array slices, while ", ViewDesc.NumArraySlices, " is provided" ); + if(ViewDesc.FirstArraySlice != 0) + TEX_VIEW_VALIDATION_ERROR( "First slice (", ViewDesc.FirstArraySlice, ") must be 0 for non-array texture cube SRV" ); + } + if ( ViewDesc.TextureDim == RESOURCE_DIM_TEX_CUBE_ARRAY ) + { + VERIFY(ViewDesc.ViewType == TEXTURE_VIEW_SHADER_RESOURCE, "Unexpected view type: SRV is expected"); + if((ViewDesc.NumArraySlices % 6) != 0) + TEX_VIEW_VALIDATION_ERROR( "Number of slices in texture cube array SRV is expected to be multiple of 6. ", ViewDesc.NumArraySlices, " slices provided." ); + } + + if (ViewDesc.TextureDim == RESOURCE_DIM_TEX_1D || + ViewDesc.TextureDim == RESOURCE_DIM_TEX_2D) + { + if(ViewDesc.FirstArraySlice != 0) + TEX_VIEW_VALIDATION_ERROR( "First slice (", ViewDesc.FirstArraySlice, ") must be 0 for non-array texture 1D/2D views" ); + + if(ViewDesc.NumArraySlices > 1) + TEX_VIEW_VALIDATION_ERROR( "Number of slices in the view (", ViewDesc.NumArraySlices, ") must be 1 (or 0) for non-array texture 1D/2D views" ); + } + else if( ViewDesc.TextureDim == RESOURCE_DIM_TEX_1D_ARRAY || + ViewDesc.TextureDim == RESOURCE_DIM_TEX_2D_ARRAY || + ViewDesc.TextureDim == RESOURCE_DIM_TEX_CUBE || + ViewDesc.TextureDim == RESOURCE_DIM_TEX_CUBE_ARRAY ) { if( ViewDesc.FirstArraySlice + ViewDesc.NumArraySlices > this->m_Desc.ArraySize ) TEX_VIEW_VALIDATION_ERROR( "First slice (", ViewDesc.FirstArraySlice, ") and number of slices in the view (", ViewDesc.NumArraySlices, ") specify more slices than target texture has (", this->m_Desc.ArraySize, ")" ); } - else if( ViewDesc.TextureType == TEXTURE_TYPE_3D ) + else if( ViewDesc.TextureDim == RESOURCE_DIM_TEX_3D ) { auto MipDepth = this->m_Desc.Depth >> ViewDesc.MostDetailedMip; if( ViewDesc.FirstDepthSlice + ViewDesc.NumDepthSlices > MipDepth ) TEX_VIEW_VALIDATION_ERROR( "First slice (", ViewDesc.FirstDepthSlice, ") and number of slices in the view (", ViewDesc.NumDepthSlices, ") specify more slices than target 3D texture mip level has (", MipDepth, ")" ); } + else + { + UNEXPECTED("Unexpected texture dimension") + } + #undef TEX_VIEW_VALIDATION_ERROR if( ViewDesc.NumMipLevels == 0 ) @@ -288,10 +418,12 @@ void TextureBase :: CorrectTextureViewDesc(stru if( ViewDesc.NumArraySlices == 0 ) { - if( ViewDesc.TextureType == TEXTURE_TYPE_1D_ARRAY || - ViewDesc.TextureType == TEXTURE_TYPE_2D_ARRAY ) + if( ViewDesc.TextureDim == RESOURCE_DIM_TEX_1D_ARRAY || + ViewDesc.TextureDim == RESOURCE_DIM_TEX_2D_ARRAY || + ViewDesc.TextureDim == RESOURCE_DIM_TEX_CUBE || + ViewDesc.TextureDim == RESOURCE_DIM_TEX_CUBE_ARRAY ) ViewDesc.NumArraySlices = this->m_Desc.ArraySize - ViewDesc.FirstArraySlice; - else if( ViewDesc.TextureType == TEXTURE_TYPE_3D ) + else if( ViewDesc.TextureDim == RESOURCE_DIM_TEX_3D ) { auto MipDepth = this->m_Desc.Depth >> ViewDesc.MostDetailedMip; ViewDesc.NumDepthSlices = MipDepth - ViewDesc.FirstDepthSlice; @@ -311,8 +443,8 @@ void TextureBase :: CorrectTextureViewDesc(stru } } -template -void TextureBase :: CreateDefaultViews() +template +void TextureBase :: CreateDefaultViews() { if(this->m_Desc.BindFlags & BIND_SHADER_RESOURCE ) { @@ -357,14 +489,14 @@ void TextureBase :: CreateDefaultViews() } -template -void TextureBase :: UpdateData( IDeviceContext *pContext, Uint32 MipLevel, Uint32 Slice, const Box &DstBox, const TextureSubResData &SubresData ) +template +void TextureBase :: UpdateData( IDeviceContext *pContext, Uint32 MipLevel, Uint32 Slice, const Box &DstBox, const TextureSubResData &SubresData ) { ValidateUpdateDataParams( this->m_Desc, MipLevel, Slice, DstBox, SubresData ); } -template -void TextureBase :: CopyData( IDeviceContext *pContext, +template +void TextureBase :: CopyData( IDeviceContext *pContext, ITexture *pSrcTexture, Uint32 SrcMipLevel, Uint32 SrcSlice, @@ -381,13 +513,13 @@ void TextureBase :: CopyData( IDeviceContext *p this->GetDesc(), DstMipLevel, DstSlice, DstX, DstY, DstZ ); } -template -void TextureBase :: Map( IDeviceContext *pContext, MAP_TYPE MapType, Uint32 MapFlags, PVoid &pMappedData ) +template +void TextureBase :: Map( IDeviceContext *pContext, MAP_TYPE MapType, Uint32 MapFlags, PVoid &pMappedData ) { } -template -void TextureBase :: Unmap( IDeviceContext *pContext ) +template +void TextureBase :: Unmap( IDeviceContext *pContext, MAP_TYPE MapType ) { } diff --git a/Graphics/GraphicsEngine/include/TextureViewBase.h b/Graphics/GraphicsEngine/include/TextureViewBase.h index af2c93d8..92dbb647 100644 --- a/Graphics/GraphicsEngine/include/TextureViewBase.h +++ b/Graphics/GraphicsEngine/include/TextureViewBase.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,21 +37,31 @@ namespace Diligent /// Template class implementing base functionality for a texture view interface /// \tparam BaseInterface - base interface that this class will inheret -/// (Diligent::ITextureViewD3D11 or Diligent::ITextureViewGL). -template -class TextureViewBase : public DeviceObjectBase +/// (Diligent::ITextureViewD3D11, Diligent::ITextureViewD3D12 or Diligent::ITextureViewGL). +/// \taparam TexViewObjAllocator - type of the allocator that is used to allocate memory for the texture view object instances +template +class TextureViewBase : public DeviceObjectBase { public: - typedef DeviceObjectBase TDeviceObjectBase; + typedef DeviceObjectBase TDeviceObjectBase; - TextureViewBase( IRenderDevice *pDevice, - const TextureViewDesc& ViewDesc, - class ITexture *pTexture, - bool bIsDefaultView ) : + + /// \param ObjAllocator - allocator that was used to allocate memory for this instance of the texture view object + /// \param pDevice - pointer to the render device. + /// \param ViewDesc - texture view description. + /// \param pTexture - pointer to the texture that the view is to be created for. + /// \param bIsDefaultView - flag indicating if the view is default view, and is thus + /// part of the texture object. In this case the view will attach + /// to the texture's reference counters. + TextureViewBase( TexViewObjAllocator &ObjAllocator, + IRenderDevice *pDevice, + const TextureViewDesc& ViewDesc, + class ITexture *pTexture, + bool bIsDefaultView ) : // Default views are created as part of the texture, so we cannot not keep strong // reference to the texture to avoid cyclic links. Instead, we will attach to the // reference counters of the texture. - TDeviceObjectBase( pDevice, ViewDesc, bIsDefaultView ? pTexture : nullptr ), + TDeviceObjectBase( ObjAllocator, pDevice, ViewDesc, bIsDefaultView ? pTexture : nullptr ), m_pTexture( pTexture ), // For non-default view, we will keep strong reference to texture m_spTexture(bIsDefaultView ? nullptr : pTexture) @@ -59,18 +69,21 @@ public: IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_TextureView, TDeviceObjectBase ) - virtual void SetSampler( class ISampler *pSampler ) + /// Implementation of ITextureView::SetSampler() + virtual void SetSampler( class ISampler *pSampler )override final { VERIFY( this->m_Desc.ViewType == TEXTURE_VIEW_SHADER_RESOURCE, "Texture view \"", this->m_Desc.Name, "\": A sampler can be attached to a shader resource view only. The view type is ", GetTexViewTypeLiteralName(this->m_Desc.ViewType) ); m_pSampler = pSampler; } - virtual ISampler* GetSampler() + /// Implementation of ITextureView::GetSampler() + virtual ISampler* GetSampler()override final { return m_pSampler; } - virtual ITexture* GetTexture() + /// Implementation of ITextureView::GetTexture() + virtual ITexture* GetTexture()override final { return m_pTexture; } diff --git a/Graphics/GraphicsEngine/include/VertexDescriptionBase.h b/Graphics/GraphicsEngine/include/VertexDescriptionBase.h deleted file mode 100644 index fdab3db6..00000000 --- a/Graphics/GraphicsEngine/include/VertexDescriptionBase.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright 2015 Egor Yusov - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. - * - * In no event and under no legal theory, whether in tort (including negligence), - * contract, or otherwise, unless required by applicable law (such as deliberate - * and grossly negligent acts) or agreed to in writing, shall any Contributor be - * liable for any damages, including any direct, indirect, special, incidental, - * or consequential damages of any character arising as a result of this License or - * out of the use or inability to use the software (including but not limited to damages - * for loss of goodwill, work stoppage, computer failure or malfunction, or any and - * all other commercial damages or losses), even if such Contributor has been advised - * of the possibility of such damages. - */ - -#pragma once - -/// \file -/// Implementation of the Diligent::VertexDescriptionBase template class - -#include "VertexDescription.h" -#include "DeviceObjectBase.h" -#include "GraphicsUtilities.h" - -namespace Diligent -{ - -/// Template class implementing base functionality for a vertex description object - -/// \tparam BaseInterface - base interface that this class will inheret -/// (Diligent::IVertexDescriptionD3D11 or Diligent::IVertexDescriptionGL). -template -class VertexDescriptionBase : public DeviceObjectBase -{ -public: - typedef DeviceObjectBase TDeviceObjectBase; - - /// \param pDevice - pointer to the device. - /// \param LayoutDesc - layout description. - /// \param bIsDeviceInternal - flag indicating if the vertex description is an internal device object and - /// must not keep a strong reference to the device. - VertexDescriptionBase( IRenderDevice *pDevice, const LayoutDesc &LayoutDesc, bool bIsDeviceInternal = false ) : - TDeviceObjectBase( pDevice, LayoutDesc, nullptr, bIsDeviceInternal), - m_TightStrides( MaxBufferSlots ), // The size of this array must be equal to the - // maximum number of buffer slots, because a layout - // element can refer to any input slot - m_LayoutElements( LayoutDesc.NumElements ) - { - for( size_t Elem = 0; Elem < LayoutDesc.NumElements; ++Elem ) - m_LayoutElements[Elem] = LayoutDesc.LayoutElements[Elem]; - this->m_Desc.LayoutElements = m_LayoutElements.data(); - - // Correct description and compute offsets and tight strides - for( auto It = m_LayoutElements.begin(); It != m_LayoutElements.end(); ++It ) - { - if( It->ValueType == VT_FLOAT32 || It->ValueType == VT_FLOAT16 ) - It->IsNormalized = false; // Floating point values cannot be normalized - - auto BuffSlot = It->BufferSlot; - if( BuffSlot >= m_TightStrides.size() ) - m_TightStrides.resize( BuffSlot + 1 ); - - auto &CurrStride = m_TightStrides[BuffSlot]; - if( It->RelativeOffset < CurrStride ) - { - if( It->RelativeOffset == 0 ) - It->RelativeOffset = CurrStride; - else - UNEXPECTED( "Overlapping layout elements" ); - } - - CurrStride += It->NumComponents * GetValueSize( It->ValueType ); - } - } - - IMPLEMENT_QUERY_INTERFACE_IN_PLACE( IID_VertexDescription, TDeviceObjectBase ) - - virtual const Uint32* GetTightStrides() - { - return m_TightStrides.data(); - } - -protected: - std::vector m_LayoutElements; - std::vector m_TightStrides; -}; - -} diff --git a/Graphics/GraphicsEngine/include/pch.h b/Graphics/GraphicsEngine/include/pch.h index c911c398..cdc2f875 100644 --- a/Graphics/GraphicsEngine/include/pch.h +++ b/Graphics/GraphicsEngine/include/pch.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Graphics/GraphicsEngine/interface/BlendState.h b/Graphics/GraphicsEngine/interface/BlendState.h index 3673bfae..2e14e9eb 100644 --- a/Graphics/GraphicsEngine/interface/BlendState.h +++ b/Graphics/GraphicsEngine/interface/BlendState.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,99 +24,94 @@ #pragma once /// \file -/// Definition of the Diligent::IBlendState interface and related data structures +/// Blend state description -#include "DeviceObject.h" +#include "BasicTypes.h" namespace Diligent { -/// IBlendState interface unique identifier -// {81CFB7AC-6B9F-45FA-ACE2-CC6A9EDE4E75} -static const Diligent::INTERFACE_ID IID_BlendState = -{ 0x81cfb7ac, 0x6b9f, 0x45fa, { 0xac, 0xe2, 0xcc, 0x6a, 0x9e, 0xde, 0x4e, 0x75 } }; - - /// Blend factors /// [D3D11_BLEND]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476086(v=vs.85).aspx +/// [D3D12_BLEND]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770338(v=vs.85).aspx /// [glBlendFuncSeparate]: https://www.opengl.org/wiki/GLAPI/glBlendFuncSeparate /// This enumeration defines blend factors for alpha-blending. -/// It generatlly mirrows [D3D11_BLEND][] enumeration and is used by RenderTargetBlendDesc structure +/// It generatlly mirrors [D3D11_BLEND][] and [D3D12_BLEND][] enumerations and is used by RenderTargetBlendDesc structure /// to define source and destination blend factors for color and alpha channels. -/// \sa [D3D11_BLEND on MSDN][D3D11_BLEND], [glBlendFuncSeparate on OpenGL.org][glBlendFuncSeparate] +/// \sa [D3D11_BLEND on MSDN][D3D11_BLEND], [D3D12_BLEND on MSDN][D3D12_BLEND], [glBlendFuncSeparate on OpenGL.org][glBlendFuncSeparate] enum BLEND_FACTOR : Int32 { /// Undefined blend factor BLEND_FACTOR_UNDEFINED = 0, /// The blend factor is zero.\n - /// D3D11 counterpart: D3D11_BLEND_ZERO. OpenGL counterpart: GL_ZERO. + /// Direct3D counterpart: D3D11_BLEND_ZERO/D3D12_BLEND_ZERO. OpenGL counterpart: GL_ZERO. BLEND_FACTOR_ZERO, /// The blend factor is one.\n - /// D3D11 counterpart: D3D11_BLEND_ONE. OpenGL counterpart: GL_ONE. + /// Direct3D counterpart: D3D11_BLEND_ONE/D3D12_BLEND_ONE. OpenGL counterpart: GL_ONE. BLEND_FACTOR_ONE, /// The blend factor is RGB data from a pixel shader.\n - /// D3D11 counterpart: D3D11_BLEND_SRC_COLOR. OpenGL counterpart: GL_SRC_COLOR. + /// Direct3D counterpart: D3D11_BLEND_SRC_COLOR/D3D12_BLEND_SRC_COLOR. OpenGL counterpart: GL_SRC_COLOR. BLEND_FACTOR_SRC_COLOR, /// The blend factor is 1-RGB, where RGB is the data from a pixel shader.\n - /// D3D11 counterpart: D3D11_BLEND_INV_SRC_COLOR. OpenGL counterpart: GL_ONE_MINUS_SRC_COLOR. + /// Direct3D counterpart: D3D11_BLEND_INV_SRC_COLOR/D3D12_BLEND_INV_SRC_COLOR. OpenGL counterpart: GL_ONE_MINUS_SRC_COLOR. BLEND_FACTOR_INV_SRC_COLOR, /// The blend factor is alpha (A) data from a pixel shader.\n - /// D3D11 counterpart: D3D11_BLEND_SRC_ALPHA. OpenGL counterpart: GL_SRC_ALPHA. + /// Direct3D counterpart: D3D11_BLEND_SRC_ALPHA/D3D12_BLEND_SRC_ALPHA. OpenGL counterpart: GL_SRC_ALPHA. BLEND_FACTOR_SRC_ALPHA, /// The blend factor is 1-A, where A is alpha data from a pixel shader.\n - /// D3D11 counterpart: D3D11_BLEND_INV_SRC_ALPHA. OpenGL counterpart: GL_ONE_MINUS_SRC_ALPHA. + /// Direct3D counterpart: D3D11_BLEND_INV_SRC_ALPHA/D3D12_BLEND_INV_SRC_ALPHA. OpenGL counterpart: GL_ONE_MINUS_SRC_ALPHA. BLEND_FACTOR_INV_SRC_ALPHA, /// The blend factor is alpha (A) data from a render target.\n - /// D3D11 counterpart: D3D11_BLEND_DEST_ALPHA. OpenGL counterpart: GL_DST_ALPHA. + /// Direct3D counterpart: D3D11_BLEND_DEST_ALPHA/D3D12_BLEND_DEST_ALPHA. OpenGL counterpart: GL_DST_ALPHA. BLEND_FACTOR_DEST_ALPHA, /// The blend factor is 1-A, where A is alpha data from a render target.\n - /// D3D11 counterpart: D3D11_BLEND_INV_DEST_ALPHA. OpenGL counterpart: GL_ONE_MINUS_DST_ALPHA. + /// Direct3D counterpart: D3D11_BLEND_INV_DEST_ALPHA/D3D12_BLEND_INV_DEST_ALPHA. OpenGL counterpart: GL_ONE_MINUS_DST_ALPHA. BLEND_FACTOR_INV_DEST_ALPHA, /// The blend factor is RGB data from a render target.\n - /// D3D11 counterpart: D3D11_BLEND_DEST_COLOR. OpenGL counterpart: GL_DST_COLOR. + /// Direct3D counterpart: D3D11_BLEND_DEST_COLOR/D3D12_BLEND_DEST_COLOR. OpenGL counterpart: GL_DST_COLOR. BLEND_FACTOR_DEST_COLOR, /// The blend factor is 1-RGB, where RGB is the data from a render target.\n - /// D3D11 counterpart: D3D11_BLEND_INV_DEST_COLOR. OpenGL counterpart: GL_ONE_MINUS_DST_COLOR. + /// Direct3D counterpart: D3D11_BLEND_INV_DEST_COLOR/D3D12_BLEND_INV_DEST_COLOR. OpenGL counterpart: GL_ONE_MINUS_DST_COLOR. BLEND_FACTOR_INV_DEST_COLOR, /// The blend factor is (f,f,f,1), where f = min(As, 1-Ad), /// As is alpha data from a pixel shader, and Ad is alpha data from a render target.\n - /// D3D11 counterpart: D3D11_BLEND_SRC_ALPHA_SAT. OpenGL counterpart: GL_SRC_ALPHA_SATURATE. + /// Direct3D counterpart: D3D11_BLEND_SRC_ALPHA_SAT/D3D12_BLEND_SRC_ALPHA_SAT. OpenGL counterpart: GL_SRC_ALPHA_SATURATE. BLEND_FACTOR_SRC_ALPHA_SAT, - /// The blend factor is the constant blend factor set with IDeviceContext::SetBlendState().\n - /// D3D11 counterpart: D3D11_BLEND_BLEND_FACTOR. OpenGL counterpart: GL_CONSTANT_COLOR. + /// The blend factor is the constant blend factor set with IDeviceContext::SetBlendFactors().\n + /// Direct3D counterpart: D3D11_BLEND_BLEND_FACTOR/D3D12_BLEND_BLEND_FACTOR. OpenGL counterpart: GL_CONSTANT_COLOR. BLEND_FACTOR_BLEND_FACTOR, - /// The blend factor is one minus constant blend factor set with IDeviceContext::SetBlendState().\n - /// D3D11 counterpart: D3D11_BLEND_INV_BLEND_FACTOR. OpenGL counterpart: GL_ONE_MINUS_CONSTANT_COLOR. + /// The blend factor is one minus constant blend factor set with IDeviceContext::SetBlendFactors().\n + /// Direct3D counterpart: D3D11_BLEND_INV_BLEND_FACTOR/D3D12_BLEND_INV_BLEND_FACTOR. OpenGL counterpart: GL_ONE_MINUS_CONSTANT_COLOR. BLEND_FACTOR_INV_BLEND_FACTOR, /// The blend factor is the second RGB data output from a pixel shader.\n - /// D3D11 counterpart: D3D11_BLEND_SRC1_COLOR. OpenGL counterpart: GL_SRC1_COLOR. + /// Direct3D counterpart: D3D11_BLEND_SRC1_COLOR/D3D12_BLEND_SRC1_COLOR. OpenGL counterpart: GL_SRC1_COLOR. BLEND_FACTOR_SRC1_COLOR, /// The blend factor is 1-RGB, where RGB is the second RGB data output from a pixel shader.\n - /// D3D11 counterpart: D3D11_BLEND_INV_SRC1_COLOR. OpenGL counterpart: GL_ONE_MINUS_SRC1_COLOR. + /// Direct3D counterpart: D3D11_BLEND_INV_SRC1_COLOR/D3D12_BLEND_INV_SRC1_COLOR. OpenGL counterpart: GL_ONE_MINUS_SRC1_COLOR. BLEND_FACTOR_INV_SRC1_COLOR, /// The blend factor is the second alpha (A) data output from a pixel shader.\n - /// D3D11 counterpart: D3D11_BLEND_SRC1_ALPHA. OpenGL counterpart: GL_SRC1_ALPHA. + /// Direct3D counterpart: D3D11_BLEND_SRC1_ALPHA/D3D12_BLEND_SRC1_ALPHA. OpenGL counterpart: GL_SRC1_ALPHA. BLEND_FACTOR_SRC1_ALPHA, /// The blend factor is 1-A, where A is the second alpha data output from a pixel shader.\n - /// D3D11 counterpart: D3D11_BLEND_INV_SRC1_ALPHA. OpenGL counterpart: GL_ONE_MINUS_SRC1_ALPHA. + /// Direct3D counterpart: D3D11_BLEND_INV_SRC1_ALPHA/D3D12_BLEND_INV_SRC1_ALPHA. OpenGL counterpart: GL_ONE_MINUS_SRC1_ALPHA. BLEND_FACTOR_INV_SRC1_ALPHA, /// Helper value that stores the total number of blend factors in the enumeration. @@ -126,34 +121,35 @@ enum BLEND_FACTOR : Int32 /// Blending operation /// [D3D11_BLEND_OP]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476088(v=vs.85).aspx +/// [D3D12_BLEND_OP]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770340(v=vs.85).aspx /// [glBlendEquationSeparate]: https://www.opengl.org/wiki/GLAPI/glBlendEquationSeparate -/// This enumeration describes blending operation for RGB or Alpha channels and generally mirrows -/// [D3D11_BLEND_OP][] enum. It is used by RenderTargetBlendDesc structure to define RGB and Alpha +/// This enumeration describes blending operation for RGB or Alpha channels and generally mirrors +/// [D3D11_BLEND_OP][] and [D3D12_BLEND_OP][] enums. It is used by RenderTargetBlendDesc structure to define RGB and Alpha /// blending operations -/// \sa [D3D11_BLEND_OP on MSDN][D3D11_BLEND_OP], [glBlendEquationSeparate on OpenGL.org][glBlendEquationSeparate] +/// \sa [D3D11_BLEND_OP on MSDN][D3D11_BLEND_OP], [D3D12_BLEND_OP on MSDN][D3D12_BLEND_OP], [glBlendEquationSeparate on OpenGL.org][glBlendEquationSeparate] enum BLEND_OPERATION : Int32 { /// Undefined blend operation BLEND_OPERATION_UNDEFINED = 0, /// Add source and destination color components.\n - /// D3D11 counterpart: D3D11_BLEND_OP_ADD. OpenGL counterpart: GL_FUNC_ADD. + /// Direct3D counterpart: D3D11_BLEND_OP_ADD/D3D12_BLEND_OP_ADD. OpenGL counterpart: GL_FUNC_ADD. BLEND_OPERATION_ADD, /// Subtract destination color components from source color components.\n - /// D3D11 counterpart: D3D11_BLEND_OP_SUBTRACT. OpenGL counterpart: GL_FUNC_SUBTRACT. + /// Direct3D counterpart: D3D11_BLEND_OP_SUBTRACT/D3D12_BLEND_OP_SUBTRACT. OpenGL counterpart: GL_FUNC_SUBTRACT. BLEND_OPERATION_SUBTRACT, /// Subtract source color components from destination color components.\n - /// D3D11 counterpart: D3D11_BLEND_OP_REV_SUBTRACT. OpenGL counterpart: GL_FUNC_REVERSE_SUBTRACT. + /// Direct3D counterpart: D3D11_BLEND_OP_REV_SUBTRACT/D3D12_BLEND_OP_REV_SUBTRACT. OpenGL counterpart: GL_FUNC_REVERSE_SUBTRACT. BLEND_OPERATION_REV_SUBTRACT, /// Compute the minimum of source and destination color components.\n - /// D3D11 counterpart: D3D11_BLEND_OP_MIN. OpenGL counterpart: GL_MIN. + /// Direct3D counterpart: D3D11_BLEND_OP_MIN/D3D12_BLEND_OP_MIN. OpenGL counterpart: GL_MIN. BLEND_OPERATION_MIN, /// Compute the maximum of source and destination color components.\n - /// D3D11 counterpart: D3D11_BLEND_OP_MAX. OpenGL counterpart: GL_MAX. + /// Direct3D counterpart: D3D11_BLEND_OP_MAX/D3D12_BLEND_OP_MAX. OpenGL counterpart: GL_MAX. BLEND_OPERATION_MAX, /// Helper value that stores the total number of blend operations in the enumeration. @@ -182,6 +178,84 @@ enum COLOR_MASK : Int32 COLOR_MASK_ALL = ( ( ( COLOR_MASK_RED | COLOR_MASK_GREEN ) | COLOR_MASK_BLUE ) | COLOR_MASK_ALPHA ) }; + +/// Logic operation + +/// [D3D12_LOGIC_OP]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770379(v=vs.85).aspx +/// This enumeration describes logic operation and generally mirrors [D3D12_LOGIC_OP][] enum. +/// It is used by RenderTargetBlendDesc structure to define logic operation. +/// Only available on D3D12 engine +/// \sa [D3D12_LOGIC_OP on MSDN][D3D12_LOGIC_OP] +enum LOGIC_OPERATION +{ + /// Clear the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_CLEAR. + LOGIC_OP_CLEAR = 0, + + /// Set the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_SET. + LOGIC_OP_SET, + + /// Copy the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_COPY. + LOGIC_OP_COPY, + + /// Perform an inverted-copy of the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_COPY_INVERTED. + LOGIC_OP_COPY_INVERTED, + + /// No operation is performed on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_NOOP. + LOGIC_OP_NOOP, + + /// Invert the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_INVERT. + LOGIC_OP_INVERT, + + /// Perform a logical AND operation on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_AND. + LOGIC_OP_AND, + + /// Perform a logical NAND operation on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_NAND. + LOGIC_OP_NAND, + + /// Perform a logical OR operation on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_OR. + LOGIC_OP_OR, + + /// Perform a logical NOR operation on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_NOR. + LOGIC_OP_NOR, + + /// Perform a logical XOR operation on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_XOR. + LOGIC_OP_XOR, + + /// Perform a logical equal operation on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_EQUIV. + LOGIC_OP_EQUIV, + + /// Perform a logical AND and reverse operation on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_AND_REVERSE. + LOGIC_OP_AND_REVERSE, + + /// Perform a logical AND and invert operation on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_AND_INVERTED. + LOGIC_OP_AND_INVERTED, + + /// Perform a logical OR and reverse operation on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_OR_REVERSE. + LOGIC_OP_OR_REVERSE, + + /// Perform a logical OR and invert operation on the render target.\n + /// Direct3D12 counterpart: D3D12_LOGIC_OP_OR_INVERTED. + LOGIC_OP_OR_INVERTED, + + /// Helper value that stores the total number of logical operations in the enumeration. + LOGIC_OP_NUM_OPERATIONS +}; + /// Describes a blend state for a single render target /// This structure is used by BlendStateDesc to describe @@ -191,6 +265,9 @@ struct RenderTargetBlendDesc /// Enable or disable blending for this render target. Bool BlendEnable; + /// Enable or disable a logical operation for this render target. + Bool LogicOperationEnable; + /// Specifies the blend factor to apply to the RGB value output from the pixel shader BLEND_FACTOR SrcBlend; @@ -213,6 +290,9 @@ struct RenderTargetBlendDesc /// after applying the SrcBlendAlpha and DestBlendAlpha factors. BLEND_OPERATION BlendOpAlpha; + /// Defines logical operation for the render target. + LOGIC_OPERATION LogicOp; + /// Render target write mask Uint32 RenderTargetWriteMask; @@ -221,21 +301,25 @@ struct RenderTargetBlendDesc /// Member | Default value /// ----------------------|-------------- /// BlendEnable | False - /// SrcBlend | BLEND_FACTOR_ONE - /// DestBlend | BLEND_FACTOR_ZERO - /// BlendOp | BLEND_OPERATION_ADD - /// SrcBlendAlpha | BLEND_FACTOR_ONE - /// DestBlendAlpha | BLEND_FACTOR_ZERO - /// BlendOpAlpha | BLEND_OPERATION_ADD - /// RenderTargetWriteMask | COLOR_MASK_ALL + /// LogicOperationEnable | False + /// SrcBlend | Diligent::BLEND_FACTOR_ONE + /// DestBlend | Diligent::BLEND_FACTOR_ZERO + /// BlendOp | Diligent::BLEND_OPERATION_ADD + /// SrcBlendAlpha | Diligent::BLEND_FACTOR_ONE + /// DestBlendAlpha | Diligent::BLEND_FACTOR_ZERO + /// BlendOpAlpha | Diligent::BLEND_OPERATION_ADD + /// LogicOp | Diligent::LOGIC_OP_NOOP + /// RenderTargetWriteMask | Diligent::COLOR_MASK_ALL RenderTargetBlendDesc() : BlendEnable ( False ), + LogicOperationEnable(False), SrcBlend ( BLEND_FACTOR_ONE ), DestBlend ( BLEND_FACTOR_ZERO ), BlendOp ( BLEND_OPERATION_ADD ), SrcBlendAlpha ( BLEND_FACTOR_ONE ), DestBlendAlpha ( BLEND_FACTOR_ZERO ), BlendOpAlpha ( BLEND_OPERATION_ADD ), + LogicOp ( LOGIC_OP_NOOP ), RenderTargetWriteMask( COLOR_MASK_ALL ) {} @@ -249,21 +333,22 @@ struct RenderTargetBlendDesc bool operator == (const RenderTargetBlendDesc& rhs)const { return BlendEnable == rhs.BlendEnable && + LogicOperationEnable == rhs.LogicOperationEnable && SrcBlend == rhs.SrcBlend && DestBlend == rhs.DestBlend && BlendOp == rhs.BlendOp && SrcBlendAlpha == rhs.SrcBlendAlpha && DestBlendAlpha == rhs.DestBlendAlpha && BlendOpAlpha == rhs.BlendOpAlpha && + LogicOp == rhs.LogicOp && RenderTargetWriteMask == rhs.RenderTargetWriteMask; } }; /// Blend state description -/// This structure describes the blend state which is used in a call to -/// IRenderDevice::CreateBlendState() to create a blend state object -struct BlendStateDesc : DeviceObjectAttribs +/// This structure describes the blend state and is part of the GraphicsPipelineDesc. +struct BlendStateDesc { /// Specifies whether to use alpha-to-coverage as a multisampling technique /// when setting a pixel to a render target. Default value: False. @@ -305,8 +390,6 @@ struct BlendStateDesc : DeviceObjectAttribs /// but differ in render target other than 0, the operator will return False /// even though the two blend states created from these structures will be identical. /// - False otherwise - /// \remarks - /// The operator ignores DeviceObjectAttribs::Name field as it does not affect the blend state. bool operator == (const BlendStateDesc& RHS)const { bool bRTsEqual = true; @@ -318,27 +401,9 @@ struct BlendStateDesc : DeviceObjectAttribs } return bRTsEqual && - // Name is primarily used for debug purposes and does not affect the state. - // It is ignored in comparison operation. - // strcmp(Name, RHS.Name) == 0 && AlphaToCoverageEnable == RHS.AlphaToCoverageEnable && IndependentBlendEnable== RHS.IndependentBlendEnable; } }; -/// Blend state interface - -/// The interface holds the blending state that can be bound to the pipeline by a call -/// to IDeviceContext::SetBlendState(). To create a blend state, call -/// IRenderDevice::CreateBlendState(). -class IBlendState : public IDeviceObject -{ -public: - /// Queries the specific interface, see IObject::QueryInterface() for details. - virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface ) = 0; - - /// Returns the blend state description used to create the object - virtual const BlendStateDesc& GetDesc()const = 0; -}; - } diff --git a/Graphics/GraphicsEngine/interface/Buffer.h b/Graphics/GraphicsEngine/interface/Buffer.h index 45dc21bc..847a04c1 100644 --- a/Graphics/GraphicsEngine/interface/Buffer.h +++ b/Graphics/GraphicsEngine/interface/Buffer.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -129,9 +129,9 @@ struct BufferDesc : DeviceObjectAttribs /// --------------------|-------------- /// uiSizeInBytes | 0 /// BindFlags | 0 - /// Usage | USAGE_DEFAULT + /// Usage | Diligent::USAGE_DEFAULT /// CPUAccessFlags | 0 - /// Mode | BUFFER_MODE_UNDEFINED + /// Mode | Diligent::BUFFER_MODE_UNDEFINED /// ElementByteStride | 0 /// Members of BufferDesc::Format are initialized with default values by BufferFormat::BufferFormat() BufferDesc() : @@ -148,7 +148,7 @@ struct BufferDesc : DeviceObjectAttribs struct BufferData { /// Pointer to the data - PVoid pData; + const void* pData; /// Data size, in bytes Uint32 DataSize; @@ -206,7 +206,9 @@ public: /// Unmaps the previously mapped buffer /// \param [in] pContext - Pointer to the device context interface to be used to perform the operation. - virtual void Unmap( IDeviceContext *pContext ) = 0; + /// \param [in] MapType - Type of the map operation. This parameter must match to the type that was + /// provided to the Map() method. + virtual void Unmap( IDeviceContext *pContext, MAP_TYPE MapType ) = 0; /// Creates a new buffer view diff --git a/Graphics/GraphicsEngine/interface/BufferView.h b/Graphics/GraphicsEngine/interface/BufferView.h index 93d52887..f817b3e6 100644 --- a/Graphics/GraphicsEngine/interface/BufferView.h +++ b/Graphics/GraphicsEngine/interface/BufferView.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,7 +53,7 @@ struct BufferViewDesc : DeviceObjectAttribs /// Default values: /// Member | Default value /// --------------------|-------------- - /// ViewType | BUFFER_VIEW_UNDEFINED + /// ViewType | Diligent::BUFFER_VIEW_UNDEFINED /// ByteOffset | 0 /// ByteWidth | 0 BufferViewDesc() : diff --git a/Graphics/GraphicsEngine/interface/CommandList.h b/Graphics/GraphicsEngine/interface/CommandList.h new file mode 100644 index 00000000..e6939c3d --- /dev/null +++ b/Graphics/GraphicsEngine/interface/CommandList.h @@ -0,0 +1,49 @@ +/* Copyright 2015-2016 Egor Yusov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#pragma once + +/// \file +/// Defines Diligent::IBuffer interface and related data structures + +#include "DeviceObject.h" + +namespace Diligent +{ + +// {C38C68F2-8A8C-4ED5-B7EE-69126E75DCD8} +static const Diligent::INTERFACE_ID IID_CommandList = +{ 0xc38c68f2, 0x8a8c, 0x4ed5, { 0xb7, 0xee, 0x69, 0x12, 0x6e, 0x75, 0xdc, 0xd8 } }; + +/// Command list interface + +/// Command list has no methods. When command list recording is finished, it is executed by +/// IDeviceContext::ExecuteCommandList(). +class ICommandList : public IDeviceObject +{ +public: + + +}; + +} diff --git a/Graphics/GraphicsEngine/interface/Constants.h b/Graphics/GraphicsEngine/interface/Constants.h index 50d9d427..7c1505bb 100644 --- a/Graphics/GraphicsEngine/interface/Constants.h +++ b/Graphics/GraphicsEngine/interface/Constants.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Graphics/GraphicsEngine/interface/DepthStencilState.h b/Graphics/GraphicsEngine/interface/DepthStencilState.h index 75347935..de796255 100644 --- a/Graphics/GraphicsEngine/interface/DepthStencilState.h +++ b/Graphics/GraphicsEngine/interface/DepthStencilState.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,22 +24,19 @@ #pragma once /// \file -/// Definition of the Diligent::IDepthStencilState interface and related data structures +/// Definition of data types that describe depth-stencil state -#include "DeviceObject.h" +#include "BasicTypes.h" namespace Diligent { -// {51C3A67F-FADD-411A-BA36-BDE9EE29722B} -static const Diligent::INTERFACE_ID IID_DepthStencilState = -{ 0x51c3a67f, 0xfadd, 0x411a, { 0xba, 0x36, 0xbd, 0xe9, 0xee, 0x29, 0x72, 0x2b } }; - /// Stencil operation /// [D3D11_STENCIL_OP]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476219(v=vs.85).aspx -/// This enumeration describes the stencil operation and generally mirrows -/// [D3D11_STENCIL_OP][] enumeration. +/// [D3D12_STENCIL_OP]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770409(v=vs.85).aspx +/// This enumeration describes the stencil operation and generally mirrors +/// [D3D11_STENCIL_OP][]/[D3D12_STENCIL_OP][] enumeration. /// It is used by Diligent::StencilOpDesc structure to describe the stencil fail, depth fail /// and stencil pass operations enum STENCIL_OP : Int32 @@ -48,37 +45,37 @@ enum STENCIL_OP : Int32 STENCIL_OP_UNDEFINED = 0, /// Keep the existing stencil data.\n - /// D3D11 Counterpart: D3D11_STENCIL_OP_KEEP. OpenGL counterpart: GL_KEEP. + /// Direct3D counterpart: D3D11_STENCIL_OP_KEEP/D3D12_STENCIL_OP_KEEP. OpenGL counterpart: GL_KEEP. STENCIL_OP_KEEP = 1, /// Set the stencil data to 0.\n - /// D3D11 Counterpart: D3D11_STENCIL_OP_ZERO. OpenGL counterpart: GL_ZERO. + /// Direct3D counterpart: D3D11_STENCIL_OP_ZERO/D3D12_STENCIL_OP_ZERO. OpenGL counterpart: GL_ZERO. STENCIL_OP_ZERO = 2, - /// Set the stencil data to the reference value set by calling IDeviceContext::SetDepthStencilState().\n - /// D3D11 Counterpart: D3D11_STENCIL_OP_REPLACE. OpenGL counterpart: GL_REPLACE. + /// Set the stencil data to the reference value set by calling IDeviceContext::SetStencilRef().\n + /// Direct3D counterpart: D3D11_STENCIL_OP_REPLACE/D3D12_STENCIL_OP_REPLACE. OpenGL counterpart: GL_REPLACE. STENCIL_OP_REPLACE = 3, /// Increment the current stencil value, and clamp to the maximum representable unsigned value.\n - /// D3D11 Counterpart: D3D11_STENCIL_OP_INCR_SAT. OpenGL counterpart: GL_INCR. + /// Direct3D counterpart: D3D11_STENCIL_OP_INCR_SAT/D3D12_STENCIL_OP_INCR_SAT. OpenGL counterpart: GL_INCR. STENCIL_OP_INCR_SAT = 4, /// Decrement the current stencil value, and clamp to 0.\n - /// D3D11 Counterpart: D3D11_STENCIL_OP_DECR_SAT. OpenGL counterpart: GL_DECR. + /// Direct3D counterpart: D3D11_STENCIL_OP_DECR_SAT/D3D12_STENCIL_OP_DECR_SAT. OpenGL counterpart: GL_DECR. STENCIL_OP_DECR_SAT = 5, /// Bitwise invert the current stencil buffer value.\n - /// D3D11 Counterpart: D3D11_STENCIL_OP_INVERT. OpenGL counterpart: GL_INVERT. + /// Direct3D counterpart: D3D11_STENCIL_OP_INVERT/D3D12_STENCIL_OP_INVERT. OpenGL counterpart: GL_INVERT. STENCIL_OP_INVERT = 6, /// Increment the current stencil value, and wrap the value to zero when incrementing /// the maximum representable unsigned value. \n - /// D3D11 Counterpart: D3D11_STENCIL_OP_INCR. OpenGL counterpart: GL_INCR_WRAP. + /// Direct3D counterpart: D3D11_STENCIL_OP_INCR/D3D12_STENCIL_OP_INCR. OpenGL counterpart: GL_INCR_WRAP. STENCIL_OP_INCR_WRAP = 7, /// Decrement the current stencil value, and wrap the value to the maximum representable /// unsigned value when decrementing a value of zero.\n - /// D3D11 Counterpart: D3D11_STENCIL_OP_DECR. OpenGL counterpart: GL_DECR_WRAP. + /// Direct3D counterpart: D3D11_STENCIL_OP_DECR/D3D12_STENCIL_OP_DECR. OpenGL counterpart: GL_DECR_WRAP. STENCIL_OP_DECR_WRAP = 8, /// Helper value that stores the total number of stencil operations in the enumeration. @@ -88,7 +85,8 @@ enum STENCIL_OP : Int32 /// Describes stencil operations that are performed based on the results of depth test. /// [D3D11_DEPTH_STENCILOP_DESC]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476109(v=vs.85).aspx -/// The structure generally mirrows [D3D11_DEPTH_STENCILOP_DESC][] structure. +/// [D3D12_DEPTH_STENCILOP_DESC]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770355(v=vs.85).aspx +/// The structure generally mirrors [D3D11_DEPTH_STENCILOP_DESC][]/[D3D12_DEPTH_STENCILOP_DESC][] structure. /// It is used by Diligent::DepthStencilStateDesc structure to describe the stencil /// operations for the front and back facing polygons. struct StencilOpDesc @@ -111,10 +109,10 @@ struct StencilOpDesc /// Default values: /// Member | Default value /// --------------------|-------------- - /// StencilFailOp | STENCIL_OP_KEEP - /// StencilDepthFailOp | STENCIL_OP_KEEP - /// StencilPassOp | STENCIL_OP_KEEP - /// StencilFunc | COMPARISON_FUNC_ALWAYS + /// StencilFailOp | Diligent::STENCIL_OP_KEEP + /// StencilDepthFailOp | Diligent::STENCIL_OP_KEEP + /// StencilPassOp | Diligent::STENCIL_OP_KEEP + /// StencilFunc | Diligent::COMPARISON_FUNC_ALWAYS StencilOpDesc() : StencilFailOp ( STENCIL_OP_KEEP ), StencilDepthFailOp( STENCIL_OP_KEEP ), @@ -140,10 +138,11 @@ struct StencilOpDesc /// Depth stencil state description /// [D3D11_DEPTH_STENCIL_DESC]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476110(v=vs.85).aspx -/// This structure describes the depth stencil state which is used in a call to -/// IRenderDevice::CreateDepthStencilState() and generally mirrows [D3D11_DEPTH_STENCIL_DESC][] +/// [D3D12_DEPTH_STENCIL_DESC]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770356(v=vs.85).aspx +/// This structure describes the depth stencil state and is part of the GraphicsPipelineDesc. +/// The structure generally mirrors [D3D11_DEPTH_STENCIL_DESC][]/[D3D12_DEPTH_STENCIL_DESC][] /// structure. -struct DepthStencilStateDesc : DeviceObjectAttribs +struct DepthStencilStateDesc { /// Enable depth-stencil operations. When it is set to False, /// depth test always passes, depth writes are disabled, @@ -179,7 +178,7 @@ struct DepthStencilStateDesc : DeviceObjectAttribs /// --------------------|-------------- /// DepthEnable | True /// DepthWriteEnable | True - /// DepthFunc | COMPARISON_FUNC_LESS + /// DepthFunc | Diligent::COMPARISON_FUNC_LESS /// StencilEnable | False /// StencilReadMask | 0xFF /// StencilWriteMask | 0xFF @@ -201,15 +200,9 @@ struct DepthStencilStateDesc : DeviceObjectAttribs /// \return /// - True if all members of the two structures are equal. /// - False otherwise - /// \remarks - /// The operator ignores DeviceObjectAttribs::Name field as it does not affect - /// the depth-stencil state. bool operator == (const DepthStencilStateDesc& rhs)const { - // Name is primarily used for debug purposes and does not affect the state. - // It is ignored in comparison operation. - return // strcmp(Name, rhs.Name) == 0 && - DepthEnable == rhs.DepthEnable && + return DepthEnable == rhs.DepthEnable && DepthWriteEnable == rhs.DepthWriteEnable && DepthFunc == rhs.DepthFunc && StencilEnable == rhs.StencilEnable && @@ -220,19 +213,4 @@ struct DepthStencilStateDesc : DeviceObjectAttribs } }; -/// Depth stencil state interface - -/// The interface holds the depth-stencil state that can be bound to the pipeline by a call -/// to IDeviceContext::SetDepthStencilState(). To create a depth-stencil state, call -/// IRenderDevice::CreateDepthStencilState(). -class IDepthStencilState : public IDeviceObject -{ -public: - /// Queries the specific interface, see IObject::QueryInterface() for details - virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface ) = 0; - - /// Returns the depth stencil state description used to create the object - virtual const DepthStencilStateDesc& GetDesc()const = 0; -}; - } diff --git a/Graphics/GraphicsEngine/interface/DeviceCaps.h b/Graphics/GraphicsEngine/interface/DeviceCaps.h index 3d8284ed..4265ce04 100644 --- a/Graphics/GraphicsEngine/interface/DeviceCaps.h +++ b/Graphics/GraphicsEngine/interface/DeviceCaps.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,7 +34,8 @@ namespace Diligent enum class DeviceType : Int32 { Undefined = 0, ///< Undefined device - DirectX, ///< DirectX device + D3D11, ///< D3D11 device + D3D12, ///< D3D12 device OpenGL, ///< OpenGL device OpenGLES ///< OpenGLES device }; @@ -77,13 +78,17 @@ namespace Diligent /// Indicates if device supports texture views bool bTextureViewSupported; + /// Indicates if device supports cubemap arrays + bool bCubemapArraysSupported; + /// Initializes the structure members with default values TextureCaps(): bTexture1DSupported( True ), bTexture1DArraySupported( True ), bTexture2DMSSupported( True ), bTexture2DMSArraySupported( True ), - bTextureViewSupported( True ) + bTextureViewSupported( True ), + bCubemapArraysSupported( True ) {} }; @@ -110,6 +115,9 @@ namespace Diligent /// Indicates if device supports wireframe fill mode Bool bWireframeFillSupported; + /// Indicates if device supports multithreaded resource creation + Bool bMultithreadedResourceCreationSupported; + /// Texture sampling capabilities. See Diligent::SamplerCaps. SamplerCaps SamCaps; @@ -123,7 +131,8 @@ namespace Diligent MinorVersion( 0 ), bSeparableProgramSupported( True ), bIndirectRenderingSupported( True ), - bWireframeFillSupported( True ) + bWireframeFillSupported( True ), + bMultithreadedResourceCreationSupported( False ) {} }; } diff --git a/Graphics/GraphicsEngine/interface/DeviceContext.h b/Graphics/GraphicsEngine/interface/DeviceContext.h index c1998091..20a0f0b4 100644 --- a/Graphics/GraphicsEngine/interface/DeviceContext.h +++ b/Graphics/GraphicsEngine/interface/DeviceContext.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ #include "DeviceCaps.h" #include "Constants.h" #include "Buffer.h" -#include "VertexDescription.h" +#include "InputLayout.h" #include "Shader.h" #include "Texture.h" #include "Sampler.h" @@ -39,6 +39,8 @@ #include "BufferView.h" #include "DepthStencilState.h" #include "BlendState.h" +#include "PipelineState.h" +#include "CommandList.h" namespace Diligent { @@ -56,19 +58,19 @@ enum PRIMITIVE_TOPOLOGY : Int32 PRIMITIVE_TOPOLOGY_UNDEFINED = 0, /// Interpret the vertex data as a list of triangles.\n - /// D3D11 counterpart: D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST. OpenGL counterpart: GL_TRIANGLES. + /// D3D counterpart: D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST. OpenGL counterpart: GL_TRIANGLES. PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, /// Interpret the vertex data as a triangle strip.\n - /// D3D11 counterpart: D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP. OpenGL counterpart: GL_TRIANGLE_STRIP. + /// D3D counterpart: D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP. OpenGL counterpart: GL_TRIANGLE_STRIP. PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, /// Interpret the vertex data as a list of points.\n - /// D3D11 counterpart: D3D11_PRIMITIVE_TOPOLOGY_POINTLIST. OpenGL counterpart: GL_POINTS. + /// D3D counterpart: D3D_PRIMITIVE_TOPOLOGY_POINTLIST. OpenGL counterpart: GL_POINTS. PRIMITIVE_TOPOLOGY_POINT_LIST, /// Interpret the vertex data as a list of lines.\n - /// D3D11 counterpart: D3D11_PRIMITIVE_TOPOLOGY_LINELIST. OpenGL counterpart: GL_LINES. + /// D3D counterpart: D3D_PRIMITIVE_TOPOLOGY_LINELIST. OpenGL counterpart: GL_LINES. PRIMITIVE_TOPOLOGY_LINE_LIST, /// Helper value that stores the total number of topologies in the enumeration @@ -228,6 +230,17 @@ enum SET_VERTEX_BUFFERS_FLAGS : Int32 SET_VERTEX_BUFFERS_FLAG_RESET = 0x01 }; +/// Defines allowed flags for IDeviceContext::CommitShaderResources() function. +enum COMMIT_SHADER_RESOURCES_FLAG +{ + /// Transition resources being committed + + /// If this flag is specified when IDeviceContext::CommitShaderResources() is called, + /// the engine will transition all shader resources to the correct state. + COMMIT_SHADER_RESOURCES_FLAG_TRANSITION_RESOURCES = 0x01 +}; + + /// Describes the viewport. /// This structure is used by IDeviceContext::SetViewports(). @@ -304,25 +317,51 @@ public: /// Queries the specific interface, see IObject::QueryInterface() for details virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface ) = 0; - /// Binds shaders to the pipeline + /// Sets the pipeline state + + /// \param [in] pPipelineState - Pointer to IPipelineState interface to bind to the context. + virtual void SetPipelineState(IPipelineState *pPipelineState) = 0; + + + /// Transitions shader resources to the require states. + /// \param [in] pPipelineState - Pipeline state object that was used to create the shader resource binding. + /// \param [in] pShaderResourceBinding - Shader resource binding whose resources will be transitioned. + /// \remarks This method explicitly transitiones all resources to the correct states. + /// If this method was called, there is no need to specify Diligent::COMMIT_SHADER_RESOURCES_FLAG_TRANSITION_RESOURCES + /// when calling IDeviceContext::CommitShaderResources() + virtual void TransitionShaderResources(IPipelineState *pPipelineState, IShaderResourceBinding *pShaderResourceBinding) = 0; + + /// Commits shader resources to the device context + + /// \param [in] pShaderResourceBinding - Shader resource binding whose resources will be committed. + /// If pipeline state contains no shader resources, this parameter + /// can be null. + /// \param [in] Flags - Additional flags for the operation. See Diligent::COMMIT_SHADER_RESOURCES_FLAG + /// for a list of allowed values. + /// + /// \remarks Pipeline state object that was used to create the shader resource binding must be bound + /// to the pipeline when CommitShaderResources() is called. If no pipeline state object is bound + /// or the pipeline state object does not match shader resource binding, the method will fail.\n + /// If Diligent::COMMIT_SHADER_RESOURCES_FLAG_TRANSITION_RESOURCES flag is specified, + /// the engine will also transition all shader resources to the correct state. If the flag + /// is not specified, it is assumed that all resources are already in correct states.\n + /// Resources can be explicitly transitioned to the required states by calling + /// IDeviceContext::TransitionShaderResources() + virtual void CommitShaderResources(IShaderResourceBinding *pShaderResourceBinding, Uint32 Flags) = 0; - /// \param [in] ppShaders - Array of pointers to IShader interface. - /// \param [in] NumShadersToSet - Number of shaders to bind. - /// \remarks All shaders must be set atomically. All shaders that are not specified - /// in a call to SetShaders() will be unbound.\n - /// The device context keeps strong references to all bound shaders. - /// Thus a shader cannot be released until it is unbound from the context. - virtual void SetShaders(IShader **ppShaders, Uint32 NumShadersToSet) = 0; + /// Sets the stencil reference value - /// Binds resources for all shaders bound to the pipeline + /// \param [in] StencilRef - Stencil reference value. + virtual void SetStencilRef(Uint32 StencilRef) = 0; - /// \param [in] pResourceMapping - Pointer to the resource mapping interface. - /// \param [in] Flags - Additional flags. See Diligent::BIND_SHADER_RESOURCES_FLAGS. - /// \remarks This function is intended to be used with older OpenGL devices that - /// do not support program pipelines (OpenGL4.1-, OpenGLES3.0-).\n - /// The function should be called AFTER all the required shaders are bound to the - /// context. It should also be called for every shader combination. - virtual void BindShaderResources( IResourceMapping *pResourceMapping, Uint32 Flags ) = 0; + + /// \param [in] pBlendFactors - Array of four blend factors, one for each RGBA component. + /// Theses factors are used if the blend state uses one of the + /// Diligent::BLEND_FACTOR_BLEND_FACTOR or + /// Diligent::BLEND_FACTOR_INV_BLEND_FACTOR + /// blend factors. If nullptr is provided, + /// default blend factors array {1,1,1,1} will be used. + virtual void SetBlendFactors(const float* pBlendFactors = nullptr) = 0; /// Binds vertex buffers to the pipeline. @@ -337,7 +376,7 @@ public: /// in the vertex-buffer array. Each stride is the size (in bytes) of the /// elements that are to be used from that vertex buffer. /// If this parameter is nullptr, tight strides from the input layout - /// will be used for each buffer. See IVertexDescription::GetTightStrides(). + /// will be used for each buffer. See IPipelineState::GetTightStrides(). /// \param [in] pOffsets - Pointer to an array of offset values; one offset value for each buffer /// in the vertex-buffer array. Each offset is the number of bytes between /// the first element of a vertex buffer and the first element that will be @@ -359,14 +398,6 @@ public: /// Clears the context state. virtual void ClearState() = 0; - /// Sets vertex description - - /// \param [in] pVertexDesc - Pointer to IVertexDescription interface that describes - /// how to read data from input vertex buffers. - /// \remarks The device context keeps strong reference to the vertex description. - /// Thus a vertex description object cannot be released until it is unbound - /// from the context. - virtual void SetVertexDescription(IVertexDescription *pVertexDesc) = 0; /// Binds an index buffer to the pipeline @@ -380,42 +411,6 @@ public: virtual void SetIndexBuffer(IBuffer *pIndexBuffer, Uint32 ByteOffset) = 0; - /// Sets the depth stencil state - - /// \param [in] pDepthStencilState - Pointer to the IDepthStencilState interface holding the state - /// \param [in] StencilRef - Stencil reference value used in stencil operations. - /// See DepthStencilStateDesc. - /// \remarks The device context keeps strong reference to the bound depth-stencil state. - /// Thus a depth-stencil state object cannot be released until it is unbound - /// from the context. - virtual void SetDepthStencilState( IDepthStencilState *pDepthStencilState, Uint32 StencilRef = 0 ) = 0; - - /// Sets the rasterizer state - - /// \param [in] pRS - Pointer to the IRasterizerState interface holding the state - /// \remarks The device context keeps strong reference to the bound rasterizer state. - /// Thus a rasterizer state object cannot be released until it is unbound - /// from the context. - virtual void SetRasterizerState( IRasterizerState *pRS ) = 0; - - /// Sets the blend state - - /// \param [in] pBS - Pointer to the IBlendState interface holding the state - /// \param [in] pBlendFactors - Array of four blend factors, one for each RGBA component. - /// Theses factors are used if the blend state uses one of the - /// Diligent::BLEND_FACTOR_BLEND_FACTOR or - /// Diligent::BLEND_FACTOR_INV_BLEND_FACTOR - /// blend factors. If nullptr is provided, - /// default blend factors array {1,1,1,1} will be used. - /// \param [in] SampleMask - 32-bit sample mask that determines which samples get updated - /// in all the active render targets. A sample mask is always applied; - /// it is independent of whether multisampling is enabled, and does not - /// depend on whether an application uses multisample render targets. - /// \remarks The device context keeps strong reference to the bound blend state. - /// Thus a blend state object cannot be released until it is unbound - /// from the context. - virtual void SetBlendState( IBlendState *pBS, const float* pBlendFactors = nullptr, Uint32 SampleMask = 0xFFFFFFFF ) = 0; - /// Sets an array of viewports /// \param [in] NumViewports - Number of viewports to set. @@ -503,6 +498,17 @@ public: /// \note The render target view must be bound to the pipeline for clear operation to be performed. virtual void ClearRenderTarget( ITextureView *pView, const float *RGBA = nullptr ) = 0; + /// Finishes recording commands and generates a command list + + /// \param [out] ppCommandList - Memory location where pointer to the recorded command list will be written. + virtual void FinishCommandList(class ICommandList **ppCommandList) = 0; + + /// Executes recorded commands in a command list + + /// \param [in] pCommandList - Pointer to the command list to executre. + /// \remarks After command list is executed, it is no longer valid and should be released. + virtual void ExecuteCommandList(class ICommandList *pCommandList) = 0; + /// Flushes the command buffer virtual void Flush() = 0; }; diff --git a/Graphics/GraphicsEngine/interface/DeviceObject.h b/Graphics/GraphicsEngine/interface/DeviceObject.h index 6a3cde70..00ce8eb8 100644 --- a/Graphics/GraphicsEngine/interface/DeviceObject.h +++ b/Graphics/GraphicsEngine/interface/DeviceObject.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Graphics/GraphicsEngine/interface/GraphicsTypes.h b/Graphics/GraphicsEngine/interface/GraphicsTypes.h index 4f8bbcba..c59295c4 100644 --- a/Graphics/GraphicsEngine/interface/GraphicsTypes.h +++ b/Graphics/GraphicsEngine/interface/GraphicsTypes.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,7 +55,7 @@ namespace Diligent /// [D3D11_BIND_FLAG]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476085(v=vs.85).aspx /// /// This enumeration describes which parts of the pipeline a resource can be bound to. - /// It generally mirrows [D3D11_BIND_FLAG][] enumeration. It is used by + /// It generally mirrors [D3D11_BIND_FLAG][] enumeration. It is used by /// - BufferDesc to describe bind flags for a buffer /// - TextureDesc to describe bind flags for a texture enum BIND_FLAGS : Int32 @@ -77,7 +77,7 @@ namespace Diligent /// Resource usage /// [D3D11_USAGE]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476259(v=vs.85).aspx - /// This enumeration describes expected resource usage. It generally mirrows [D3D11_USAGE] enumeration. + /// This enumeration describes expected resource usage. It generally mirrors [D3D11_USAGE] enumeration. /// The enumeration is used by /// - BufferDesc to describe usage for a buffer /// - TextureDesc to describe usage for a texture @@ -119,7 +119,7 @@ namespace Diligent /// [D3D11_MAP]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476181(v=vs.85).aspx /// Describes how a mapped resource will be accessed. This enumeration generally - /// mirrows [D3D11_MAP][] enumeration. It is used by + /// mirrors [D3D11_MAP][] enumeration. It is used by /// - IBuffer::Map to describe buffer mapping type /// - ITexture::Map to describe texture mapping type enum MAP_TYPE : Int32 @@ -162,22 +162,23 @@ namespace Diligent MAP_FLAG_DO_NOT_WAIT = 0x001 }; - /// Describes texture type + /// Describes resource dimension /// This enumeration is used by /// - TextureDesc to describe texture type /// - TextureViewDesc to describe texture view type - enum TEXTURE_TYPE : Int32 + enum RESOURCE_DIMENSION : Int32 { - TEXTURE_TYPE_UNDEFINED = 0, ///< Texture type undefined - TEXTURE_TYPE_1D, ///< One-dimensional texture - TEXTURE_TYPE_1D_ARRAY, ///< One-dimensional texture array - TEXTURE_TYPE_2D, ///< Two-dimensional texture - TEXTURE_TYPE_2D_ARRAY, ///< Two-dimensional texture array - TEXTURE_TYPE_3D, ///< Three-dimensional texture - TEXTURE_TYPE_CUBE, ///< Cube-map texture - TEXTURE_TYPE_CUBE_ARRAY, ///< Cube-map array texture - TEXTURE_TYPE_NUM_TYPES ///< Helper value that stores the total number of texture types in the enumeration + RESOURCE_DIM_UNDEFINED = 0, ///< Texture type undefined + RESOURCE_DIM_BUFFER, ///< Buffer + RESOURCE_DIM_TEX_1D, ///< One-dimensional texture + RESOURCE_DIM_TEX_1D_ARRAY, ///< One-dimensional texture array + RESOURCE_DIM_TEX_2D, ///< Two-dimensional texture + RESOURCE_DIM_TEX_2D_ARRAY, ///< Two-dimensional texture array + RESOURCE_DIM_TEX_3D, ///< Three-dimensional texture + RESOURCE_DIM_TEX_CUBE, ///< Cube-map texture + RESOURCE_DIM_TEX_CUBE_ARRAY, ///< Cube-map array texture + RESOURCE_DIM_NUM_DIMENSIONS ///< Helper value that stores the total number of texture types in the enumeration }; /// Texture view type @@ -232,7 +233,7 @@ namespace Diligent /// Texture formats - /// This enumeration describes available texture formats and generally mirrows DXGI_FORMAT enumeration. + /// This enumeration describes available texture formats and generally mirrors DXGI_FORMAT enumeration. /// The table below provides detailed information on each format. Most of the formats are widely supported /// by all modern APIs (DX10+, OpenGL3.3+ and OpenGLES3.0+). Specific requirements are additionally indicated. /// \sa DXGI_FORMAT enumeration on MSDN, @@ -783,14 +784,21 @@ namespace Diligent FILTER_TYPE_COMPARISON_POINT, ///< Comparison-point filtering FILTER_TYPE_COMPARISON_LINEAR, ///< Comparison-linear filtering FILTER_TYPE_COMPARISON_ANISOTROPIC, ///< Comparison-anisotropic filtering + FILTER_TYPE_MINIMUM_POINT, ///< Minimum-point filtering (DX12 only) + FILTER_TYPE_MINIMUM_LINEAR, ///< Minimum-linear filtering (DX12 only) + FILTER_TYPE_MINIMUM_ANISOTROPIC, ///< Minimum-anisotropic filtering (DX12 only) + FILTER_TYPE_MAXIMUM_POINT, ///< Maximum-point filtering (DX12 only) + FILTER_TYPE_MAXIMUM_LINEAR, ///< Maximum-linear filtering (DX12 only) + FILTER_TYPE_MAXIMUM_ANISOTROPIC, ///< Maximum-anisotropic filtering (DX12 only) FILTER_TYPE_NUM_FILTERS ///< Helper value that stores the total number of filter types in the enumeration }; /// Texture address mode /// [D3D11_TEXTURE_ADDRESS_MODE]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476256(v=vs.85).aspx + /// [D3D12_TEXTURE_ADDRESS_MODE]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770441(v=vs.85).aspx /// Defines a technique for resolving texture coordinates that are outside of - /// the boundaries of a texture. The enumeration generally mirrows [D3D11_TEXTURE_ADDRESS_MODE][] enumeration. + /// the boundaries of a texture. The enumeration generally mirrors [D3D11_TEXTURE_ADDRESS_MODE][]/[D3D12_TEXTURE_ADDRESS_MODE][] enumeration. /// It is used by SamplerDesc structure to define the address mode for U,V and W texture coordinates. enum TEXTURE_ADDRESS_MODE : Int32 { @@ -798,27 +806,27 @@ namespace Diligent TEXTURE_ADDRESS_UNKNOWN = 0, /// Tile the texture at every integer junction. \n - /// D3D11 Counterpart: D3D11_TEXTURE_ADDRESS_WRAP. OpenGL counterpart: GL_REPEAT + /// Direct3D Counterpart: D3D11_TEXTURE_ADDRESS_WRAP/D3D12_TEXTURE_ADDRESS_MODE_WRAP. OpenGL counterpart: GL_REPEAT TEXTURE_ADDRESS_WRAP = 1, /// Flip the texture at every integer junction. \n - /// D3D11 Counterpart: D3D11_TEXTURE_ADDRESS_MIRROR. OpenGL counterpart: GL_MIRRORED_REPEAT + /// Direct3D Counterpart: D3D11_TEXTURE_ADDRESS_MIRROR/D3D12_TEXTURE_ADDRESS_MODE_MIRROR. OpenGL counterpart: GL_MIRRORED_REPEAT TEXTURE_ADDRESS_MIRROR = 2, /// Texture coordinates outside the range [0.0, 1.0] are set to the /// texture color at 0.0 or 1.0, respectively. \n - /// D3D11 Counterpart: D3D11_TEXTURE_ADDRESS_CLAMP. OpenGL counterpart: GL_CLAMP_TO_EDGE + /// Direct3D Counterpart: D3D11_TEXTURE_ADDRESS_CLAMP/D3D12_TEXTURE_ADDRESS_MODE_CLAMP. OpenGL counterpart: GL_CLAMP_TO_EDGE TEXTURE_ADDRESS_CLAMP = 3, /// Texture coordinates outside the range [0.0, 1.0] are set to the border color specified /// specified in SamplerDesc structure. \n - /// D3D11 Counterpart: D3D11_TEXTURE_ADDRESS_BORDER. OpenGL counterpart: GL_CLAMP_TO_BORDER + /// Direct3D Counterpart: D3D11_TEXTURE_ADDRESS_BORDER/D3D12_TEXTURE_ADDRESS_MODE_BORDER. OpenGL counterpart: GL_CLAMP_TO_BORDER TEXTURE_ADDRESS_BORDER = 4, /// Similar to TEXTURE_ADDRESS_MIRROR and TEXTURE_ADDRESS_CLAMP. Takes the absolute /// value of the texture coordinate (thus, mirroring around 0), and then clamps to /// the maximum value. \n - /// D3D11 Counterpart: D3D11_TEXTURE_ADDRESS_MIRROR_ONCE. OpenGL counterpart: GL_MIRROR_CLAMP_TO_EDGE + /// Direct3D Counterpart: D3D11_TEXTURE_ADDRESS_MIRROR_ONCE/D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE. OpenGL counterpart: GL_MIRROR_CLAMP_TO_EDGE /// \note GL_MIRROR_CLAMP_TO_EDGE is only available in OpenGL4.4+, and is not available until at least OpenGLES3.1 TEXTURE_ADDRESS_MIRROR_ONCE = 5, @@ -829,45 +837,46 @@ namespace Diligent /// Comparison function /// [D3D11_COMPARISON_FUNC]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476101(v=vs.85).aspx - /// This enumeartion defines a comparison function. It generally mirrows [D3D11_COMPARISON_FUNC] enum and is used by + /// [D3D12_COMPARISON_FUNC]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770349(v=vs.85).aspx + /// This enumeartion defines a comparison function. It generally mirrors [D3D11_COMPARISON_FUNC]/[D3D12_COMPARISON_FUNC] enum and is used by /// - SamplerDesc to define a comparison function if one of the comparison mode filters is used /// - StencilOpDesc to define a stencil function /// - DepthStencilStateDesc to define a depth function enum COMPARISON_FUNCTION : Int32 { /// Unknown comparison function - COMPARISON_FUNC_UNKNOW = 0, + COMPARISON_FUNC_UNKNOWN = 0, /// Comparison never passes. \n - /// D3D11 counterpart: D3D11_COMPARISON_NEVER. OpenGL counterpart: GL_NEVER. + /// Direct3D counterpart: D3D11_COMPARISON_NEVER/D3D12_COMPARISON_FUNC_NEVER. OpenGL counterpart: GL_NEVER. COMPARISON_FUNC_NEVER, /// Comparison passes if the source data is less than the destination data.\n - /// D3D11 counterpart: D3D11_COMPARISON_LESS. OpenGL counterpart: GL_LESS. + /// Direct3D counterpart: D3D11_COMPARISON_LESS/D3D12_COMPARISON_FUNC_LESS. OpenGL counterpart: GL_LESS. COMPARISON_FUNC_LESS, /// Comparison passes if the source data is equal to the destination data.\n - /// D3D11 counterpart: 3D11_COMPARISON_EQUAL. OpenGL counterpart: GL_EQUAL. + /// Direct3D counterpart: D3D11_COMPARISON_EQUAL/D3D12_COMPARISON_FUNC_EQUAL. OpenGL counterpart: GL_EQUAL. COMPARISON_FUNC_EQUAL, /// Comparison passes if the source data is less than or equal to the destination data.\n - /// D3D11 counterpart: D3D11_COMPARISON_LESS_EQUAL. OpenGL counterpart: GL_LEQUAL. + /// Direct3D counterpart: D3D11_COMPARISON_LESS_EQUAL/D3D12_COMPARISON_FUNC_LESS_EQUAL. OpenGL counterpart: GL_LEQUAL. COMPARISON_FUNC_LESS_EQUAL, /// Comparison passes if the source data is greater than the destination data.\n - /// D3D11 counterpart: 3D11_COMPARISON_GREATER. OpenGL counterpart: GL_GREATER. + /// Direct3D counterpart: 3D11_COMPARISON_GREATER/D3D12_COMPARISON_FUNC_GREATER. OpenGL counterpart: GL_GREATER. COMPARISON_FUNC_GREATER, /// Comparison passes if the source data is not equal to the destination data.\n - /// D3D11 counterpart: D3D11_COMPARISON_NOT_EQUAL. OpenGL counterpart: GL_NOTEQUAL. + /// Direct3D counterpart: D3D11_COMPARISON_NOT_EQUAL/D3D12_COMPARISON_FUNC_NOT_EQUAL. OpenGL counterpart: GL_NOTEQUAL. COMPARISON_FUNC_NOT_EQUAL, /// Comparison passes if the source data is greater than or equal to the destination data.\n - /// D3D11 counterpart: D3D11_COMPARISON_GREATER_EQUAL. OpenGL counterpart: GL_GEQUAL. + /// Direct3D counterpart: D3D11_COMPARISON_GREATER_EQUAL/D3D12_COMPARISON_FUNC_GREATER_EQUAL. OpenGL counterpart: GL_GEQUAL. COMPARISON_FUNC_GREATER_EQUAL, /// Comparison always passes. \n - /// D3D11 counterpart: D3D11_COMPARISON_ALWAYS. OpenGL counterpart: GL_ALWAYS. + /// Direct3D counterpart: D3D11_COMPARISON_ALWAYS/D3D12_COMPARISON_FUNC_ALWAYS. OpenGL counterpart: GL_ALWAYS. COMPARISON_FUNC_ALWAYS, /// Helper value that stores the total number of comparison functions in the enumeration @@ -915,13 +924,25 @@ namespace Diligent /// Sample count. Default value is 1 Uint32 SamplesCount; + /// Number of buffers int the swap chain + Uint32 BufferCount; + + /// Default depth value, which is used as optimized depth clear value in D3D12 + Float32 DefaultDepthValue; + + /// Default stencil value, which is used as optimized stencil clear value in D3D12 + Uint8 DefaultStencilValue; + /// Constructor intializes the structure members with default values SwapChainDesc() : Width(0), Height(0), ColorBufferFormat( TEX_FORMAT_RGBA8_UNORM_SRGB ), DepthBufferFormat( TEX_FORMAT_D32_FLOAT ), - SamplesCount( 1 ) + SamplesCount( 1 ), + BufferCount( 2 ), + DefaultDepthValue(1.f), + DefaultStencilValue(0) {} }; @@ -929,12 +950,47 @@ namespace Diligent struct EngineCreationAttribs { const Char* strShaderCachePath; - + /// Pointer to the raw memory allocator that will be used for all memory allocation/deallocation + /// operations in an engine + class IMemoryAllocator *pRawMemAllocator; EngineCreationAttribs() : - strShaderCachePath(nullptr) + strShaderCachePath(nullptr), + pRawMemAllocator(nullptr) {} }; + /// Attributes specific to D3D12 engine + struct EngineD3D12Attribs : public EngineCreationAttribs + { + /// Size of the CPU descriptor heap allocations for different heap types. + Uint32 CPUDescriptorHeapAllocationSize[4] = + { + 1024, // D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV + 256, // D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER + 128, // D3D12_DESCRIPTOR_HEAP_TYPE_RTV + 64 // D3D12_DESCRIPTOR_HEAP_TYPE_DSV + }; + + /// Size of the GPU descriptor heap allocations for different heap types. + Uint32 GPUDescriptorHeapSize[2] = + { + 16384, // D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV + 1024 // D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER + }; + + /// Size of the dynamic GPU descriptor heap region for different heap types. + Uint32 GPUDescriptorHeapDynamicSize[2] = + { + 4096, // D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV + 1024 // D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER + }; + + /// Number of commands to flush the command list. Only draw/dispatch commands count + /// towards the limit. Command lists are only flushed when pipeline state is changed + /// or when backbuffer is presented. + Uint32 NumCommandsToFlushCmdList = 256; + }; + /// Box struct Box { diff --git a/Graphics/GraphicsEngine/interface/InputLayout.h b/Graphics/GraphicsEngine/interface/InputLayout.h new file mode 100644 index 00000000..fa37536e --- /dev/null +++ b/Graphics/GraphicsEngine/interface/InputLayout.h @@ -0,0 +1,119 @@ +/* Copyright 2015-2016 Egor Yusov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#pragma once + +/// \file +/// Definition input layout + +#include "BasicTypes.h" + +namespace Diligent +{ + +static const Uint32 iMaxLayoutElements = 16; + +/// Description of a single element of the input layout +struct LayoutElement +{ + /// Input index of the element, which is specified in the vertex shader. + Uint32 InputIndex; + + /// Buffer slot index that this element is read from. + Uint32 BufferSlot; + + /// Number of components in the element. Allowed values are 1, 2, 3, and 4. + Uint32 NumComponents; + + /// Type of the element components, see Diligent::VALUE_TYPE for details. + VALUE_TYPE ValueType; + + /// For signed and unsigned integer value types + /// (VT_INT8, VT_INT16, VT_INT32, VT_UINT8, VT_UINT16, VT_UINT32) + /// indicates if the value should be normalized to [-1,+1] or + /// [0, 1] range respectively. For floating point types + /// (VT_FLOAT16 and VT_FLOAT32), this member is ignored. + Bool IsNormalized; + + /// Relative offset, in bytes, to the element bits. + /// If this value is zero, the offset will be computed automatically + /// assuming that all previous elements in the same buffer slot a tightly packed. + /// Overlapping elements are not allowed. + Uint32 RelativeOffset; + + /// Input frequency + enum FREQUENCY : Int32 + { + /// Frequency is undefined. + FREQUENCY_UNDEFINED = 0, + + /// Input data is per-vertex data. + FREQUENCY_PER_VERTEX, + + /// Input data is per-instance data. + FREQUENCY_PER_INSTANCE, + + /// Helper value that stores the total number of frequencies in the enumeration. + FREQUENCY_NUM_FREQUENCIES + }Frequency; + + /// The number of instances to draw using the same per-instance data before advancing + /// in the buffer by one element. + Uint32 InstanceDataStepRate; + + /// Initializes the structure + LayoutElement(Uint32 _InputIndex = 0, + Uint32 _BufferSlot = 0, + Uint32 _NumComponents = 0, + VALUE_TYPE _ValueType = VT_FLOAT32, + Bool _IsNormalized = True, + Uint32 _RelativeOffset = 0, + FREQUENCY _Frequency = FREQUENCY_PER_VERTEX, + Uint32 _InstanceDataStepRate = 1) : + InputIndex(_InputIndex), + BufferSlot(_BufferSlot), + NumComponents(_NumComponents), + ValueType(_ValueType), + IsNormalized(_IsNormalized), + RelativeOffset(_RelativeOffset), + Frequency(_Frequency), + InstanceDataStepRate(_InstanceDataStepRate) + {} +}; + +/// Layout description + +/// This structure is used by IRenderDevice::CreatePipelineState(). +struct InputLayoutDesc +{ + /// Array of layout elements + const LayoutElement *LayoutElements; + /// Number of layout elements + Uint32 NumElements; + InputLayoutDesc() : + LayoutElements(nullptr), + NumElements(0) + {} +}; + +} diff --git a/Graphics/GraphicsEngine/interface/MapHelper.h b/Graphics/GraphicsEngine/interface/MapHelper.h index 9f2aae72..b0d54e69 100644 --- a/Graphics/GraphicsEngine/interface/MapHelper.h +++ b/Graphics/GraphicsEngine/interface/MapHelper.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,21 +43,24 @@ namespace Diligent /// MapHelper UniformData( pDeviceContext, pUniformBuff, MAP_WRITE_DISCARD, 0 ); /// UniformData[0] = UniformData[1] = UniformData[2] = UniformData[3] = 1; /// } -template +template class MapHelper { public: /// Initializes the class member with null values MapHelper() : - m_pMappedData(nullptr) + m_pMappedData(nullptr), + m_pBuffer(nullptr), + m_pContext(nullptr), + m_MapType(static_cast(-1)) { } /// Initializes the object and maps the provided resource. /// See Map() for details. MapHelper( IDeviceContext *pContext, IBuffer *pBuffer, MAP_TYPE MapType, Uint32 MapFlags ) : - m_pMappedData(nullptr) + MapHelper() { Map(pContext, pBuffer, MapType, MapFlags); } @@ -66,11 +69,13 @@ public: MapHelper(MapHelper&& Helper) : m_pBuffer( std::move(Helper.m_pBuffer) ), m_pMappedData( std::move(Helper.m_pMappedData) ), - m_pContext( std::move(Helper.m_pContext) ) + m_pContext( std::move(Helper.m_pContext) ), + m_MapType( std::move(Helper.m_MapType) ) { - Helper.m_pBuffer.Release(); - Helper.m_pContext.Release(); + Helper.m_pBuffer = nullptr; + Helper.m_pContext = nullptr; Helper.m_pMappedData = nullptr; + Helper.m_MapType = static_cast(-1); } /// Move-assignement operator: takes over resource ownership from Helper @@ -79,9 +84,11 @@ public: m_pBuffer = std::move(Helper.m_pBuffer); m_pMappedData = std::move(Helper.m_pMappedData); m_pContext = std::move( Helper.m_pContext ); - Helper.m_pBuffer.Release(); - Helper.m_pContext.Release(); + m_MapType = std::move(Helper.m_MapType); + Helper.m_pBuffer = nullptr; + Helper.m_pContext = nullptr; Helper.m_pMappedData = nullptr; + Helper.m_MapType = static_cast(-1); return *this; } @@ -97,6 +104,7 @@ public: Unmap(); m_pContext = pContext; m_pBuffer = pBuffer; + m_MapType = MapType; m_pBuffer->Map(m_pContext, MapType, MapFlags, (PVoid&)m_pMappedData); VERIFY( m_pMappedData, "Map failed" ); } @@ -106,10 +114,11 @@ public: { if( m_pBuffer ) { - m_pBuffer->Unmap(m_pContext); - m_pBuffer.Release(); + m_pBuffer->Unmap(m_pContext, m_MapType); + m_pBuffer = nullptr; + m_MapType = static_cast(-1); } - m_pContext.Release(); + m_pContext = nullptr; m_pMappedData = nullptr; } @@ -135,14 +144,31 @@ private: MapHelper(const MapHelper&); MapHelper& operator=(const MapHelper&); - /// Strong auto pointer to the resource - RefCntAutoPtr m_pBuffer; + template + struct PtrTypeSelector{}; - /// Strong auto pointer to the context - RefCntAutoPtr m_pContext; + template + struct PtrTypeSelector + { + typedef RefCntAutoPtr Type; + }; + + template + struct PtrTypeSelector + { + typedef PtrType* Type; + }; + + /// Pointer / strong auto pointer to the resource + typename PtrTypeSelector::Type m_pBuffer; + + /// Pointer / strong auto pointer to the context + typename PtrTypeSelector::Type m_pContext; /// Pointer to the mapped data DataType *m_pMappedData; + + MAP_TYPE m_MapType; }; } diff --git a/Graphics/GraphicsEngine/interface/PipelineState.h b/Graphics/GraphicsEngine/interface/PipelineState.h new file mode 100644 index 00000000..34503ef9 --- /dev/null +++ b/Graphics/GraphicsEngine/interface/PipelineState.h @@ -0,0 +1,233 @@ +/* Copyright 2015-2016 Egor Yusov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#pragma once + +/// \file +/// Definition of the Diligent::IRenderDevice interface and related data structures + +#include "GraphicsTypes.h" +#include "Object.h" +#include "BlendState.h" +#include "RasterizerState.h" +#include "DepthStencilState.h" +#include "InputLayout.h" +#include "ShaderResourceBinding.h" + +namespace Diligent +{ + +/// Primitive topology type + +/// [D3D12_PRIMITIVE_TOPOLOGY_TYPE]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770385(v=vs.85).aspx +/// This enumeration describes primitive topology type. It generally mirrors [D3D12_PRIMITIVE_TOPOLOGY_TYPE] enumeration. +/// The enumeration is used by GraphicsPipelineDesc to describe how the pipeline interprets +/// geometry or hull shader input primitives +enum PRIMITIVE_TOPOLOGY_TYPE : Int32 +{ + /// Topology is not defined + PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED = 0, + + /// Interpret the input primitive as a point. + PRIMITIVE_TOPOLOGY_TYPE_POINT, + + /// Interpret the input primitive as a line. + PRIMITIVE_TOPOLOGY_TYPE_LINE, + + /// Interpret the input primitive as a triangle. + PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE, + + /// Interpret the input primitive as a control point patch. + PRIMITIVE_TOPOLOGY_TYPE_PATCH, + + /// Total number of topology types + PRIMITIVE_TOPOLOGY_TYPE_NUM_TYPES +}; + +/// Sample description + +/// This structure is used by GraphicsPipelineDesc to describe multisampling parameters +struct SampleDesc +{ + /// Sample count + Uint32 Count; + + /// Quality + Uint32 Quality; + + SampleDesc() : + Count(1), + Quality(0) + {} +}; + + +/// Graphics pipeline state description + +/// This structure describes the graphics pipeline state and is part of the PipelineStateDesc structure. +struct GraphicsPipelineDesc +{ + /// Vertex shader to be used with the pipeline + IShader *pVS; + + /// Pixel shader to be used with the pipeline + IShader *pPS; + + /// Domain shader to be used with the pipeline + IShader *pDS; + + /// Hull shader to be used with the pipeline + IShader *pHS; + + /// Geometry shader to be used with the pipeline + IShader *pGS; + + //D3D12_STREAM_OUTPUT_DESC StreamOutput; + + /// Blend state description + BlendStateDesc BlendDesc; + + /// 32-bit sample mask that determines which samples get updated + /// in all the active render targets. A sample mask is always applied; + /// it is independent of whether multisampling is enabled, and does not + /// depend on whether an application uses multisample render targets. + Uint32 SampleMask; + + /// Rasterizer state description + RasterizerStateDesc RasterizerDesc; + + /// Depth-stencil state description + DepthStencilStateDesc DepthStencilDesc; + + /// Input layout + InputLayoutDesc InputLayout; + //D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue; + + /// Primitive topology type + PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType; + + /// Number of render targets in the RTVFormats member + Uint32 NumRenderTargets; + + /// Render target formats + TEXTURE_FORMAT RTVFormats[8]; + + /// Depth-stencil format + TEXTURE_FORMAT DSVFormat; + + /// Multisampling parameters + SampleDesc SmplDesc; + + /// Node mask. + Uint32 NodeMask; + + //D3D12_CACHED_PIPELINE_STATE CachedPSO; + //D3D12_PIPELINE_STATE_FLAGS Flags; + + GraphicsPipelineDesc() : + pVS(nullptr), + pPS(nullptr), + pDS(nullptr), + pHS(nullptr), + pGS(nullptr), + PrimitiveTopologyType(PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE), + SampleMask(0xFFFFFFFF), + NumRenderTargets(0), + NodeMask(0) + { + for(size_t rt = 0; rt < _countof(RTVFormats); ++rt) + RTVFormats[rt] = TEX_FORMAT_UNKNOWN; + DSVFormat = TEX_FORMAT_UNKNOWN; + }; +}; + + +/// Compute pipeline state description + +/// This structure describes the compute pipeline state and is part of the PipelineStateDesc structure. +struct ComputePipelineDesc +{ + /// Compute shader to be used with the pipeline + IShader *pCS; + ComputePipelineDesc() : + pCS(nullptr) + {} +}; + +/// Pipeline state description +struct PipelineStateDesc : DeviceObjectAttribs +{ + /// Flag indicating if pipeline state is a compute pipeline state + bool IsComputePipeline; + + /// Graphics pipeline state description. This memeber is ignored if IsComputePipeline == True + GraphicsPipelineDesc GraphicsPipeline; + + /// Compute pipeline state description. This memeber is ignored if IsComputePipeline == False + ComputePipelineDesc ComputePipeline; + + /// Shader resource binding allocation granularity + + /// This member defines allocation granularity for internal resources required by the shader resource + /// binding object instances. + Uint32 SRBAllocationGranularity; + + PipelineStateDesc() : + IsComputePipeline(false), + SRBAllocationGranularity(1) + {} +}; + +// {06084AE5-6A71-4FE8-84B9-395DD489A28C} +static const Diligent::INTERFACE_ID IID_PipelineState = +{ 0x6084ae5, 0x6a71, 0x4fe8, { 0x84, 0xb9, 0x39, 0x5d, 0xd4, 0x89, 0xa2, 0x8c } }; + +/** + * Pipeline state interface + */ +class IPipelineState : public IDeviceObject +{ +public: + /// Queries the specific interface, see IObject::QueryInterface() for details + virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface ) = 0; + + /// Returns the blend state description used to create the object + virtual const PipelineStateDesc& GetDesc()const = 0; + + /// Binds resources for all shaders in the pipeline state + + /// \param [in] pResourceMapping - Pointer to the resource mapping interface. + /// \param [in] Flags - Additional flags. See Diligent::BIND_SHADER_RESOURCES_FLAGS. + /// \remarks For older OpenGL devices that do not support program pipelines + /// (OpenGL4.1-, OpenGLES3.0-). This function is the only way to bind + /// shader resources. + virtual void BindShaderResources( IResourceMapping *pResourceMapping, Uint32 Flags ) = 0; + + /// Creates a shader resource binding object + + /// \param [out] ppShaderResourceBinding - memory location where pointer to the new shader resource + /// binding object is written. + virtual void CreateShaderResourceBinding( IShaderResourceBinding **ppShaderResourceBinding ) = 0; +}; + +} diff --git a/Graphics/GraphicsEngine/interface/RasterizerState.h b/Graphics/GraphicsEngine/interface/RasterizerState.h index e69bf635..a475595d 100644 --- a/Graphics/GraphicsEngine/interface/RasterizerState.h +++ b/Graphics/GraphicsEngine/interface/RasterizerState.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,9 +24,9 @@ #pragma once /// \file -/// Definition of the Diligent::IRasterizerState interface and related data structures +/// Rasterizer state description -#include "DeviceObject.h" +#include "BasicTypes.h" namespace Diligent { @@ -34,19 +34,20 @@ namespace Diligent /// Fill mode /// [D3D11_FILL_MODE]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476131(v=vs.85).aspx -/// This enumeration determines the fill mode to use when rendering triangles and mirrows the -/// [D3D11_FILL_MODE][] enum. It is used by RasterizerStateDesc structure to define the fill mode. +/// [D3D12_FILL_MODE]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770366(v=vs.85).aspx +/// This enumeration determines the fill mode to use when rendering triangles and mirrors the +/// [D3D11_FILL_MODE][]/[D3D12_FILL_MODE][] enum. It is used by RasterizerStateDesc structure to define the fill mode. enum FILL_MODE : Int32 { /// Undefined fill mode. FILL_MODE_UNDEFINED = 0, /// Rasterize triangles using wireframe fill. \n - /// D3D11 counterpart: D3D11_FILL_WIREFRAME. OpenGL counterpart: GL_LINE. + /// Direct3D counterpart: D3D11_FILL_WIREFRAME/D3D12_FILL_MODE_WIREFRAME. OpenGL counterpart: GL_LINE. FILL_MODE_WIREFRAME, /// Rasterize triangles using solid fill. \n - /// D3D11 counterpart: D3D11_FILL_SOLID. OpenGL counterpart: GL_FILL. + /// Direct3D counterpart: D3D11_FILL_SOLID/D3D12_FILL_MODE_SOLID. OpenGL counterpart: GL_FILL. FILL_MODE_SOLID, /// Helper value that stores the total number of fill modes in the enumeration. @@ -56,40 +57,37 @@ enum FILL_MODE : Int32 /// Cull mode /// [D3D11_CULL_MODE]: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476108(v=vs.85).aspx -/// This enumeration defines which triangles are not drawn during the rasterization and mirrows -/// [D3D11_CULL_MODE][] enum. It is used by RasterizerStateDesc structure to define the polygin cull mode. +/// [D3D12_CULL_MODE]: https://msdn.microsoft.com/en-us/library/windows/desktop/dn770354(v=vs.85).aspx +/// This enumeration defines which triangles are not drawn during the rasterization and mirrors +/// [D3D11_CULL_MODE][]/[D3D12_CULL_MODE][] enum. It is used by RasterizerStateDesc structure to define the polygon cull mode. enum CULL_MODE : Int32 { /// Undefined cull mode. CULL_MODE_UNDEFINED = 0, /// Draw all triangles. \n - /// D3D11 counterpart: D3D11_CULL_NONE. OpenGL counterpart: glDisable( GL_CULL_FACE ). + /// Direct3D counterpart: D3D11_CULL_NONE/D3D12_CULL_MODE_NONE. OpenGL counterpart: glDisable( GL_CULL_FACE ). CULL_MODE_NONE, /// Do not draw triangles that are front-facing. Front- and back-facing triangles are determined /// by the RasterizerStateDesc::FrontCounterClockwise member. \n - /// D3D11 counterpart: D3D11_CULL_FRONT. OpenGL counterpart: GL_FRONT. + /// Direct3D counterpart: D3D11_CULL_FRONT/D3D12_CULL_MODE_FRONT. OpenGL counterpart: GL_FRONT. CULL_MODE_FRONT, /// Do not draw triangles that are back-facing. Front- and back-facing triangles are determined /// by the RasterizerStateDesc::FrontCounterClockwise member. \n - /// D3D11 counterpart: D3D11_CULL_BACK. OpenGL counterpart: GL_BACK. + /// Direct3D counterpart: D3D11_CULL_BACK/D3D12_CULL_MODE_BACK. OpenGL counterpart: GL_BACK. CULL_MODE_BACK, /// Helper value that stores the total number of cull modes in the enumeration. CULL_MODE_NUM_MODES }; -// {530A181E-2777-4DAA-B837-ED7D3C28418E} -static const Diligent::INTERFACE_ID IID_RasterizerState = -{ 0x530a181e, 0x2777, 0x4daa, { 0xb8, 0x37, 0xed, 0x7d, 0x3c, 0x28, 0x41, 0x8e } }; /// Rasterizer state description -/// This structure describes the rasterizer state which is used in a call to -/// IRenderDevice::CreateRasterizerState() to create a rasterizer state object -struct RasterizerStateDesc : DeviceObjectAttribs +/// This structure describes the rasterizer state and is part of the GraphicsPipelineDesc. +struct RasterizerStateDesc { /// Determines traingle fill mode, see Diligent::FILL_MODE for details. FILL_MODE FillMode; @@ -157,14 +155,9 @@ struct RasterizerStateDesc : DeviceObjectAttribs /// \return /// - True if all members of the two structures are equal. /// - False otherwise - /// The operator ignores DeviceObjectAttribs::Name field as it does not affect - /// the rasterizer state. bool operator == (const RasterizerStateDesc& RHS)const { - // Name is primarily used for debug purposes and does not affect the state. - // It is ignored in comparison operation. - return // strcmp(Name, RHS.Name) == 0 && - FillMode == RHS.FillMode && + return FillMode == RHS.FillMode && CullMode == RHS.CullMode && FrontCounterClockwise == RHS.FrontCounterClockwise && DepthBias == RHS.DepthBias && @@ -176,19 +169,4 @@ struct RasterizerStateDesc : DeviceObjectAttribs } }; -/// Rasterizer state interface - -/// The interface holds the rasterizer state object that can be bound to the pipeline by a call -/// to IDeviceContext::SetRasterizerState(). To create a rasterizer state, call -/// IRenderDevice::CreateRasterizerState(). -class IRasterizerState : public IDeviceObject -{ -public: - /// Queries the specific interface, see IObject::QueryInterface() for details - virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface ) = 0; - - /// Returns the rasterizer state description used to create the object - virtual const RasterizerStateDesc& GetDesc()const = 0; -}; - -} +} \ No newline at end of file diff --git a/Graphics/GraphicsEngine/interface/RenderDevice.h b/Graphics/GraphicsEngine/interface/RenderDevice.h index f8471e11..5a0ca892 100644 --- a/Graphics/GraphicsEngine/interface/RenderDevice.h +++ b/Graphics/GraphicsEngine/interface/RenderDevice.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,13 +31,15 @@ #include "DeviceCaps.h" #include "Constants.h" #include "Buffer.h" -#include "VertexDescription.h" +#include "InputLayout.h" #include "Shader.h" #include "Texture.h" #include "Sampler.h" #include "ResourceMapping.h" #include "TextureView.h" #include "BufferView.h" +#include "PipelineState.h" + #include "DepthStencilState.h" #include "RasterizerState.h" #include "BlendState.h" @@ -49,9 +51,7 @@ namespace Diligent static const Diligent::INTERFACE_ID IID_RenderDevice = { 0xf0e9b607, 0xae33, 0x4b2b, { 0xb1, 0xaf, 0xa8, 0xb2, 0xc3, 0x10, 0x40, 0x22 } }; -/** - * Render device interface - */ +/// Render device interface class IRenderDevice : public IObject { public: @@ -78,22 +78,6 @@ public: const BufferData& BuffData, IBuffer **ppBuffer) = 0; - /// Creates a new vertex description object. - - /// \param [in] LayoutDesc - Layout description, see GraphisEngine::LayoutDesc for details. - /// \param [in] pVertexShader - Pointer to the vertex shader which this input layout - /// will be used with. If layout description is not compatible - /// with the shader's input signature, the method fails. - /// \param [out] ppVertexDesc - Address of the memory location where the pointer to the - /// vertex description interface will be stored. - /// The function calls AddRef(), so that the new object will contain - /// one refernce. - /// \remark The same vertex description object can be used with all shaders that have - /// the same input semantic. - virtual void CreateVertexDescription( const LayoutDesc& LayoutDesc, - IShader *pVertexShader, - IVertexDescription **ppVertexDesc ) = 0; - /// Creates a new shader object /// \param [in] CreationAttribs - Shader creation attributes, see @@ -154,44 +138,16 @@ public: virtual void CreateResourceMapping( const ResourceMappingDesc &MappingDesc, IResourceMapping **ppMapping ) = 0; - /// Creates a new depth stencil state object - - /// \param [in] DSSDesc - Depth-stencil state description, see Diligent::DepthStencilStateDesc for details. - /// \param [out] ppDepthStencilState - Address of the memory location where the pointer to the - /// depth-stencil state interface will be stored. - /// The function calls AddRef(), so that the new object will contain - /// one refernce. - /// \remark If an application attempts to create a depth-stencil state interface with the same attributes - /// as an existing interface, the same interface will be returned. - /// \note In D3D11, 4096 unique depth-stencil state objects can be created on a device at a time. - virtual void CreateDepthStencilState( const DepthStencilStateDesc &DSSDesc, - IDepthStencilState **ppDepthStencilState ) = 0; - - /// Creates a rasterizer state object - - /// \param [in] RSDesc - Rasterizer state description, see Diligent::RasterizerStateDesc for details. - /// \param [out] ppRasterizerState - Address of the memory location where the pointer to the - /// rasterizer state interface will be stored. - /// The function calls AddRef(), so that the new object will contain - /// one refernce. - /// \remark If an application attempts to create a rasterizer state interface with the same attributes - /// as an existing interface, the same interface will be returned. - /// \note In D3D11, 4096 unique rasterizer state objects can be created on a device at a time. - virtual void CreateRasterizerState( const RasterizerStateDesc &RSDesc, - IRasterizerState **ppRasterizerState ) = 0; + /// Creates a new pipeline state object - /// Creates a blend state object + /// \param [in] PipelineDesc - Pipeline state description, see Diligent::PipelineStateDesc for details. + /// \param [out] ppPipelineState - Address of the memory location where the pointer to the + /// pipeline state interface will be stored. + /// The function calls AddRef(), so that the new object will contain + /// one refernce. + virtual void CreatePipelineState( const PipelineStateDesc &PipelineDesc, + IPipelineState **ppPipelineState ) = 0; - /// \param [in] BSDesc - Blend state description, see Diligent::BlendStateDesc for details. - /// \param [out] ppBlendState - Address of the memory location where the pointer to the - /// blend state interface will be stored. - /// The function calls AddRef(), so that the new object will contain - /// one refernce. - /// \remark If an application attempts to create a blend state interface with the same attributes - /// as an existing interface, the same interface will be returned. - /// \note In D3D11, 4096 unique blend state objects can be created on a device at a time. - virtual void CreateBlendState( const BlendStateDesc &BSDesc, - IBlendState **ppBlendState ) = 0; /// Gets the device capabilities, see Diligent::DeviceCaps for details virtual const DeviceCaps& GetDeviceCaps()const = 0; diff --git a/Graphics/GraphicsEngine/interface/ResourceMapping.h b/Graphics/GraphicsEngine/interface/ResourceMapping.h index f4ee7a17..191ae66f 100644 --- a/Graphics/GraphicsEngine/interface/ResourceMapping.h +++ b/Graphics/GraphicsEngine/interface/ResourceMapping.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,13 +43,16 @@ namespace Diligent /// Pointer to the object's interface IDeviceObject *pObject; + Uint32 ArrayIndex; /// Initializes the structure members - /// \param [in] InitName - Object name. Default value is nullptr - /// \param [in] pInitObject - Pointer to the object. Default value is nullptr - ResourceMappingEntry( const Char* InitName = nullptr, IDeviceObject *pInitObject = nullptr) : - Name( InitName ), - pObject( pInitObject ) + /// \param [in] _Name - Object name. Default value is nullptr + /// \param [in] _pObject - Pointer to the object. Default value is nullptr + /// \param [in] _ArrayIndex - For array resources, index in the array + ResourceMappingEntry( const Char* _Name = nullptr, IDeviceObject *_pObject = nullptr, Uint32 _ArrayIndex = 0) : + Name( _Name ), + pObject( _pObject ), + ArrayIndex(_ArrayIndex) {} }; @@ -92,25 +95,38 @@ namespace Diligent /// object will not be released as long as it is in the resource mapping. virtual void AddResource( const Char *Name, IDeviceObject *pObject, bool bIsUnique ) = 0; - /// Removes a resource from the mapping. - /// \param [in] pObject - Pointer to the object to remove. - virtual void RemoveResource( IDeviceObject *pObject ) = 0; + /// Adds resource array to the mapping. + + /// \param [in] Name - Resource array name. + /// \param [in] StartIndex - First index in the array, where the first element will be inserted + /// \param [in] ppObjects - Pointer to the array of objects. + /// \param [in] NumElements - Number of elements to add + /// \param [in] bIsUnique - Flag indicating if a resource with the same name + /// is allowed to be found in the mapping. In the latter + /// case, the new resource replaces the existing one. + /// + /// \remarks Resource mapping increases the reference counter for referenced objects. So an + /// object will not be released as long as it is in the resource mapping. + virtual void AddResourceArray( const Char *Name, Uint32 StartIndex, IDeviceObject* const* ppObjects, Uint32 NumElements, bool bIsUnique ) = 0; + /// Removes a resource from the mapping using its literal name. /// \param [in] Name - Name of the resource to remove. - virtual void RemoveResourceByName( const Char *Name ) = 0; + /// \param [in] ArrayIndex - For array resources, index in the array + virtual void RemoveResourceByName( const Char *Name, Uint32 ArrayIndex = 0 ) = 0; /// Finds a resource in the mapping. /// \param [in] Name - Resource name. + /// \param [in] ArrayIndex - for arrays, index of the array element. /// \param [out] ppResource - Address of the memory location where the pointer /// to the object with the given name will be written. /// If no object is found, nullptr will be written. /// \remarks The method increases the reference counter /// of the returned object, so Release() must be called. - virtual void GetResource( const Char *Name, IDeviceObject **ppResource ) = 0; + virtual void GetResource( const Char *Name, IDeviceObject **ppResource, Uint32 ArrayIndex = 0 ) = 0; /// Returns the size of the resource mapping, i.e. the number of objects. virtual size_t GetSize() = 0; diff --git a/Graphics/GraphicsEngine/interface/Sampler.h b/Graphics/GraphicsEngine/interface/Sampler.h index 52742b3c..1f3c82a2 100644 --- a/Graphics/GraphicsEngine/interface/Sampler.h +++ b/Graphics/GraphicsEngine/interface/Sampler.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Graphics/GraphicsEngine/interface/Shader.h b/Graphics/GraphicsEngine/interface/Shader.h index 61861648..15d81342 100644 --- a/Graphics/GraphicsEngine/interface/Shader.h +++ b/Graphics/GraphicsEngine/interface/Shader.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ #include "DeviceObject.h" #include "ResourceMapping.h" #include "FileStream.h" +#include "Sampler.h" namespace Diligent { @@ -58,13 +59,20 @@ enum SHADER_PROFILE : Int32 SHADER_PROFILE_DEFAULT = 0, SHADER_PROFILE_DX_4_0, SHADER_PROFILE_DX_5_0, + SHADER_PROFILE_DX_5_1, SHADER_PROFILE_GL_4_2 }; +/// Describes shader source code language enum SHADER_SOURCE_LANGUAGE : Int32 { + /// Default language (GLSL for OpenGL/OpenGLES devices, HLSL for Direct3D11/Direct3D12 devices) SHADER_SOURCE_LANGUAGE_DEFAULT = 0, + + /// The source language is HLSL SHADER_SOURCE_LANGUAGE_HLSL, + + /// The source language is GLSL SHADER_SOURCE_LANGUAGE_GLSL }; @@ -72,8 +80,8 @@ enum SHADER_SOURCE_LANGUAGE : Int32 /// and IDeviceContext::BindShaderResources(). enum BIND_SHADER_RESOURCES_FLAGS : Int32 { - /// Reset all bindings. If this specified, all existing bindings will be - /// broken. By default all existing bindings are presereved. + /// Reset all bindings. If this flag is specified, all existing bindings will be + /// broken. By default all existing bindings are preserved. BIND_SHADER_RESOURCES_RESET_BINDINGS = 0x01, /// If this flag is specified, only unresolved bindings will be updated. @@ -84,10 +92,56 @@ enum BIND_SHADER_RESOURCES_FLAGS : Int32 /// If this flag is specified, all shader bindings are expected /// to be resolved after the call. If this is not the case, debug error - /// will be output. + /// will be displayed. BIND_SHADER_RESOURCES_ALL_RESOLVED = 0x04 }; +/// Describes shader variable type that is used by ShaderVariableDesc +enum SHADER_VARIABLE_TYPE : Int32 +{ + /// Shader variable is constant across all shader instances. + /// It must be set *once* directly through IShader::BindResources() or through + /// the shader variable. + SHADER_VARIABLE_TYPE_STATIC = 0, + + /// Shader variable is constant across shader resource bindings instance (see IShaderResourceBinding). + /// It must be set *once* through IShaderResourceBinding::BindResources() or through + /// the shader variable. It cannot be set through IShader interface + SHADER_VARIABLE_TYPE_MUTABLE, + + /// Shader variable is dynamic. It can be set multiple times for every instance of shader resource + /// bindings (see IShaderResourceBinding). It cannot be set through IShader interface + SHADER_VARIABLE_TYPE_DYNAMIC, + + /// Total number of shader variable types + SHADER_VARIABLE_TYPE_NUM_TYPES +}; + +/// Describes shader variable +struct ShaderVariableDesc +{ + /// Shader variable name + const char *Name; + + /// Shader variable type. See Diligent::SHADER_VARIABLE_TYPE for a list of allowed types + SHADER_VARIABLE_TYPE Type; + ShaderVariableDesc(const char *_Name = nullptr, SHADER_VARIABLE_TYPE _Type = SHADER_VARIABLE_TYPE_STATIC) : + Name(_Name), + Type(_Type) + {} +}; + + +/// Static sampler description +struct StaticSamplerDesc +{ + /// Sampler description + SamplerDesc Desc; + + /// Name of the texture variable that static sampler will be assigned to + const char* TextureName = nullptr; +}; + /// Shader description struct ShaderDesc : DeviceObjectAttribs { @@ -97,10 +151,32 @@ struct ShaderDesc : DeviceObjectAttribs Bool bCacheCompiledShader; SHADER_PROFILE TargetProfile; + /// Default shader variable type. This type will be used if shader + /// variable description is not found in array VariableDesc points to + /// or if VariableDesc == nullptr + SHADER_VARIABLE_TYPE DefaultVariableType; + + /// Array of shader variable descriptions + const ShaderVariableDesc *VariableDesc; + + /// Number of elements in VariableDesc array + Uint32 NumVariables; + + /// Number of static samplers in StaticSamplers array + Uint32 NumStaticSamplers; + + /// Array of static sampler descriptions + StaticSamplerDesc *StaticSamplers; + ShaderDesc() : ShaderType(SHADER_TYPE_VERTEX), bCacheCompiledShader(False), - TargetProfile(SHADER_PROFILE_DEFAULT) + TargetProfile(SHADER_PROFILE_DEFAULT), + DefaultVariableType(SHADER_VARIABLE_TYPE_STATIC), + VariableDesc(nullptr), + NumVariables(0), + NumStaticSamplers(0), + StaticSamplers(nullptr) {} }; @@ -170,12 +246,7 @@ public: /// be assigned to a constant buffer variable. virtual void Set(IDeviceObject *pObject) = 0; - /// Returns the shader which this shader variable - /// belongs to - - /// \remark The method does not increment the reference counter - /// of the returned interface. - virtual class IShader* GetShader() = 0; + virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements) = 0; }; /// Shader interface diff --git a/Graphics/GraphicsEngine/interface/ShaderResourceBinding.h b/Graphics/GraphicsEngine/interface/ShaderResourceBinding.h new file mode 100644 index 00000000..7a757a3f --- /dev/null +++ b/Graphics/GraphicsEngine/interface/ShaderResourceBinding.h @@ -0,0 +1,68 @@ +/* Copyright 2015-2016 Egor Yusov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#pragma once + +/// \file +/// Definition of the Diligent::IShaderResourceBinding interface and related data structures + +#include "Object.h" + +namespace Diligent +{ + +// {061F8774-9A09-48E8-8411-B5BD20560104} +static const Diligent::INTERFACE_ID IID_ShaderResourceBinding = +{ 0x61f8774, 0x9a09, 0x48e8, { 0x84, 0x11, 0xb5, 0xbd, 0x20, 0x56, 0x1, 0x4 } }; + + +/// Shader resource binding interface +class IShaderResourceBinding : public IObject +{ +public: + /// Queries the specific interface, see IObject::QueryInterface() for details + virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface ) = 0; + + /// Returns pointer to the referenced buffer object. + + /// The method calls AddRef() on the returned interface, + /// so Release() must be called to avoid memory leaks. + virtual class IPipelineState* GetPipelineState() = 0; + + /// Binds all resource using the resource mapping + + /// \param [in] ShaderFlags - Flags for the shader stages, for which resources will be bound. + /// Any combination of Diligent::SHADER_TYPE may be specified. + /// \param [in] pResMapping - Shader resource mapping, where required resources will be looked up + /// \param [in] Flags - Additional flags. See Diligent::BIND_SHADER_RESOURCES_FLAGS. + virtual void BindResources(Uint32 ShaderFlags, IResourceMapping *pResMapping, Uint32 Flags) = 0; + + /// Returns variable + + /// \param [in] ShaderType - Type of the shader to look up the variable. + /// Must be one of Diligent::SHADER_TYPE. + /// \param Name - Variable name + virtual IShaderVariable *GetVariable(SHADER_TYPE ShaderType, const char *Name) = 0; +}; + +} diff --git a/Graphics/GraphicsEngine/interface/SwapChain.h b/Graphics/GraphicsEngine/interface/SwapChain.h index c451bbf6..aae576bb 100644 --- a/Graphics/GraphicsEngine/interface/SwapChain.h +++ b/Graphics/GraphicsEngine/interface/SwapChain.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/Graphics/GraphicsEngine/interface/Texture.h b/Graphics/GraphicsEngine/interface/Texture.h index de352a3c..0c3c2c1e 100644 --- a/Graphics/GraphicsEngine/interface/Texture.h +++ b/Graphics/GraphicsEngine/interface/Texture.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,11 +35,43 @@ namespace Diligent static const Diligent::INTERFACE_ID IID_Texture = { 0xa64b0e60, 0x1b5e, 0x4cfd, { 0xb8, 0x80, 0x66, 0x3a, 0x1a, 0xdc, 0xbe, 0x98 } }; +/// Defines optimized depth-stencil clear value. +struct DepthStencilClearValue +{ + /// Depth clear value + Float32 Depth; + /// Stencil clear value + Uint8 Stencil; + DepthStencilClearValue() : + Depth(1.f), + Stencil(0) + {} +}; + +/// Defines optimized clear value. +struct OptimizedClearValue +{ + /// Format + TEXTURE_FORMAT Format; + /// Render target clear value + Float32 Color[ 4 ]; + /// Depth stencil clear value + DepthStencilClearValue DepthStencil; + OptimizedClearValue() : + Format(TEX_FORMAT_UNKNOWN) + { + Color[0] = 0; + Color[1] = 0; + Color[2] = 0; + Color[3] = 0; + } +}; + /// Texture description struct TextureDesc : DeviceObjectAttribs { - /// Texture type. See Diligent::TEXTURE_TYPE for details. - TEXTURE_TYPE Type; + /// Texture type. See Diligent::RESOURCE_DIMENSION for details. + RESOURCE_DIMENSION Type; /// Texture width, in pixels. Uint32 Width; @@ -84,12 +116,15 @@ struct TextureDesc : DeviceObjectAttribs /// Miscellaneous flags, see Diligent::MISC_TEXTURE_FLAG for details. Uint32 MiscFlags; + /// Optimized clear value + OptimizedClearValue ClearValue; + /// Initializes the structure members with default values /// Default values: /// Member | Default value /// ----------------|-------------- - /// Type | TEXTURE_TYPE_UNDEFINED + /// Type | RESOURCE_DIM_UNDEFINED /// Width | 0 /// Height | 0 /// ArraySize | 1 @@ -101,7 +136,7 @@ struct TextureDesc : DeviceObjectAttribs /// CPUAccessFlags | 0 /// MiscFlags | 0 TextureDesc() : - Type(TEXTURE_TYPE_UNDEFINED), + Type(RESOURCE_DIM_UNDEFINED), Width(0), Height(0), ArraySize(1), @@ -142,6 +177,13 @@ struct TextureSubResData Stride(0), DepthStride(0) {} + + /// Initializes the structure members with provided values + TextureSubResData(void *_pData, Uint32 _Stride, Uint32 _DepthStride=0): + pData(_pData), + Stride(_Stride), + DepthStride(_DepthStride) + {} }; /// Describes the initial data to store in the texture @@ -248,7 +290,7 @@ public: /// Map the texture - not implemented yet virtual void Map( IDeviceContext *pContext, MAP_TYPE MapType, Uint32 MapFlags, PVoid &pMappedData ) = 0; /// Unmap the textute - not implemented yet - virtual void Unmap( IDeviceContext *pContext ) = 0; + virtual void Unmap( IDeviceContext *pContext, MAP_TYPE MapType ) = 0; }; } diff --git a/Graphics/GraphicsEngine/interface/TextureView.h b/Graphics/GraphicsEngine/interface/TextureView.h index b55e2f0e..63780f7d 100644 --- a/Graphics/GraphicsEngine/interface/TextureView.h +++ b/Graphics/GraphicsEngine/interface/TextureView.h @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,10 +59,10 @@ struct TextureViewDesc : DeviceObjectAttribs /// View interpretation of the original texture. For instance, /// one slice of a 2D texture array can be viewed as a 2D texture. - /// See Diligent::TEXTURE_TYPE for a list of texture types. - /// If default value Diligent::TEXTURE_TYPE_UNDEFINED is provided, + /// See Diligent::RESOURCE_DIMENSION for a list of texture types. + /// If default value Diligent::RESOURCE_DIM_UNDEFINED is provided, /// the view type will match the type of the referenced texture. - TEXTURE_TYPE TextureType; + RESOURCE_DIMENSION TextureDim; /// View format. If default value Diligent::TEX_FORMAT_UNKNOWN is provided, /// the view format will match the referenced texture format. @@ -109,7 +109,7 @@ struct TextureViewDesc : DeviceObjectAttribs /// Member | Default value /// --------------------|-------------- /// ViewType | TEXTURE_VIEW_UNDEFINED - /// TextureType | TEXTURE_TYPE_UNDEFINED + /// TextureDim | RESOURCE_DIM_UNDEFINED /// Format | TEX_FORMAT_UNKNOWN /// MostDetailedMip | 0 /// NumMipLevels | 0 @@ -118,7 +118,7 @@ struct TextureViewDesc : DeviceObjectAttribs /// AccessFlags | 0 TextureViewDesc() : ViewType( TEXTURE_VIEW_UNDEFINED ), - TextureType( TEXTURE_TYPE_UNDEFINED ), + TextureDim( RESOURCE_DIM_UNDEFINED ), Format(TEX_FORMAT_UNKNOWN), MostDetailedMip(0), NumMipLevels(0), @@ -140,7 +140,7 @@ struct TextureViewDesc : DeviceObjectAttribs // It is ignored in comparison operation. return //strcmp(Name, RHS.Name) == 0 && ViewType == RHS.ViewType && - TextureType == RHS.TextureType && + TextureDim == RHS.TextureDim && Format == RHS.Format && MostDetailedMip == RHS.MostDetailedMip && NumMipLevels == RHS.NumMipLevels && diff --git a/Graphics/GraphicsEngine/interface/VertexDescription.h b/Graphics/GraphicsEngine/interface/VertexDescription.h deleted file mode 100644 index 4883ab40..00000000 --- a/Graphics/GraphicsEngine/interface/VertexDescription.h +++ /dev/null @@ -1,140 +0,0 @@ -/* Copyright 2015 Egor Yusov - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. - * - * In no event and under no legal theory, whether in tort (including negligence), - * contract, or otherwise, unless required by applicable law (such as deliberate - * and grossly negligent acts) or agreed to in writing, shall any Contributor be - * liable for any damages, including any direct, indirect, special, incidental, - * or consequential damages of any character arising as a result of this License or - * out of the use or inability to use the software (including but not limited to damages - * for loss of goodwill, work stoppage, computer failure or malfunction, or any and - * all other commercial damages or losses), even if such Contributor has been advised - * of the possibility of such damages. - */ - -#pragma once - -/// \file -/// Definition of the Diligent::IVertexDescription interface and related data structures - -#include "DeviceObject.h" - -namespace Diligent -{ - -// {2D6915E5-003B-4C68-BDF0-8F93FA7AD4BC} -static const Diligent::INTERFACE_ID IID_VertexDescription = -{ 0x2d6915e5, 0x3b, 0x4c68, { 0xbd, 0xf0, 0x8f, 0x93, 0xfa, 0x7a, 0xd4, 0xbc } }; - -static const Uint32 iMaxLayoutElements = 16; - -/// Description of a single element of the input layout -struct LayoutElement -{ - /// Input index of the element, which is specified in the vertex shader. - Uint32 InputIndex; - - /// Buffer slot index that this element is read from. - Uint32 BufferSlot; - - /// Number of components in the element. Allowed values are 1, 2, 3, and 4. - Uint32 NumComponents; - - /// Type of the element components, see Diligent::VALUE_TYPE for details. - VALUE_TYPE ValueType; - - /// For signed and unsigned integer value types - /// (VT_INT8, VT_INT16, VT_INT32, VT_UINT8, VT_UINT16, VT_UINT32) - /// indicates if the value should be normalized to [-1,+1] or - /// [0, 1] range respectively. For floating point types - /// (VT_FLOAT16 and VT_FLOAT32), this member is ignored. - Bool IsNormalized; - - /// Relative offset, in bytes, to the element bits. - /// If this value is zero, the offset will be computed automatically - /// assuming that all previous elements in the same buffer slot a tightly packed. - /// Overlapping elements are not allowed. - Uint32 RelativeOffset; - - /// Input frequency - enum FREQUENCY : Int32 - { - /// Frequency is undefined. - FREQUENCY_UNDEFINED = 0, - - /// Input data is per-vertex data. - FREQUENCY_PER_VERTEX, - - /// Input data is per-instance data. - FREQUENCY_PER_INSTANCE, - - /// Helper value that stores the total number of frequencies in the enumeration. - FREQUENCY_NUM_FREQUENCIES - }Frequency; - - /// The number of instances to draw using the same per-instance data before advancing - /// in the buffer by one element. - Uint32 InstanceDataStepRate; - - /// Initializes the structure - LayoutElement(Uint32 _InputIndex = 0, - Uint32 _BufferSlot = 0, - Uint32 _NumComponents = 0, - VALUE_TYPE _ValueType = VT_FLOAT32, - Bool _IsNormalized = True, - Uint32 _RelativeOffset = 0, - FREQUENCY _Frequency = FREQUENCY_PER_VERTEX, - Uint32 _InstanceDataStepRate = 1) : - InputIndex(_InputIndex), - BufferSlot(_BufferSlot), - NumComponents(_NumComponents), - ValueType(_ValueType), - IsNormalized(_IsNormalized), - RelativeOffset(_RelativeOffset), - Frequency(_Frequency), - InstanceDataStepRate(_InstanceDataStepRate) - {} -}; - -/// Layout description - -/// This structure is used by IRenderDevice::CreateVertexDescription(). -struct LayoutDesc : DeviceObjectAttribs -{ - /// Array of layout elements - const LayoutElement *LayoutElements; - Uint32 NumElements; - LayoutDesc() : - LayoutElements(nullptr), - NumElements(0) - {} -}; - -/// Vertex description interface - -/// Vertex description is created by a call to IRenderDevice::CreateVertexDescription(). -/// To bind vertex descption, call IDeviceContext::SetVertexDescription(). -class IVertexDescription : public IDeviceObject -{ -public: - /// Queries the specific interface, see IObject::QueryInterface() for details - virtual void QueryInterface( const Diligent::INTERFACE_ID &IID, IObject **ppInterface ) = 0; - - /// Returns layout description used to create the object - virtual const LayoutDesc &GetDesc()const = 0; - - /// Returns tight strides for each input buffer slot. Tight strides are computed - /// assuming that all layout elements in the buffer are tightly packed. - virtual const Uint32* GetTightStrides() = 0; -}; - -} diff --git a/Graphics/GraphicsEngine/src/EngineMemory.cpp b/Graphics/GraphicsEngine/src/EngineMemory.cpp new file mode 100644 index 00000000..b981724f --- /dev/null +++ b/Graphics/GraphicsEngine/src/EngineMemory.cpp @@ -0,0 +1,73 @@ +/* Copyright 2015-2016 Egor Yusov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +// stdafx.cpp : source file that includes just the standard includes +// RenderEngine.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "pch.h" +#include "EngineMemory.h" +#include "DefaultRawMemoryAllocator.h" + +namespace Diligent +{ + +static IMemoryAllocator *g_pRawAllocator; +void SetRawAllocator(IMemoryAllocator *pRawAllocator) +{ + if (pRawAllocator == nullptr) + { + LOG_INFO_MESSAGE("User-defined allocator is not provided. Using default allocator.") + pRawAllocator = &DefaultRawMemoryAllocator::GetAllocator(); + } + g_pRawAllocator = pRawAllocator; +} + +IMemoryAllocator& GetRawAllocator() +{ + return *g_pRawAllocator; +} + +} +#if 0 + +void* operator new(size_t Size) +{ + return Diligent::GetRawAllocator().Allocate(Size, "", "", -1); +} + +void* operator new[](size_t Size) +{ + return Diligent::GetRawAllocator().Allocate(Size, "", "", -1); +} + +void operator delete(void* Ptr) +{ + Diligent::GetRawAllocator().Free(Ptr); +} + +void operator delete[](void* Ptr) +{ + Diligent::GetRawAllocator().Free(Ptr); +} +#endif diff --git a/Graphics/GraphicsEngine/src/ResourceMapping.cpp b/Graphics/GraphicsEngine/src/ResourceMapping.cpp index 47a54ed9..7bfb6ceb 100644 --- a/Graphics/GraphicsEngine/src/ResourceMapping.cpp +++ b/Graphics/GraphicsEngine/src/ResourceMapping.cpp @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,71 +33,62 @@ namespace Diligent { } - IMPLEMENT_QUERY_INTERFACE( ResourceMappingImpl, IID_ResourceMapping, ObjectBase ) + IMPLEMENT_QUERY_INTERFACE( ResourceMappingImpl, IID_ResourceMapping, TObjectBase ) ThreadingTools::LockHelper ResourceMappingImpl::Lock() { return std::move( ThreadingTools::LockHelper( m_LockFlag ) ); } - void ResourceMappingImpl::AddResource( const Char *Name, IDeviceObject *pObject, bool bIsUnique ) + void ResourceMappingImpl::AddResourceArray( const Char *Name, Uint32 StartIndex, IDeviceObject * const* ppObjects, Uint32 NumElements, bool bIsUnique ) { if( Name == nullptr || *Name == 0 ) return; auto LockHelper = Lock(); - // Try to construct new element in place - auto Elems = - m_HashTable.emplace( - make_pair( Diligent::HashMapStringKey(Name, true), // Make a copy of the source string - Diligent::RefCntAutoPtr(pObject) - ) - ); - // If there is already element with the same name, replace it - if( !Elems.second && Elems.first->second != pObject ) + for(Uint32 Elem = 0; Elem < NumElements; ++Elem) { - if( bIsUnique ) + auto *pObject = ppObjects[Elem]; + + // Try to construct new element in place + auto Elems = + m_HashTable.emplace( + make_pair( Diligent::ResMappingHashKey(Name, true, StartIndex+Elem), // Make a copy of the source string + Diligent::RefCntAutoPtr(pObject) + ) + ); + // If there is already element with the same name, replace it + if( !Elems.second && Elems.first->second != pObject ) { - UNEXPECTED( "Resource with the same name already exists" ); - LOG_WARNING_MESSAGE( - "Resource with name ", Name, " marked is unique, but already present in the hash.\n" - "New resource will be used\n." ); + if( bIsUnique ) + { + UNEXPECTED( "Resource with the same name already exists" ); + LOG_WARNING_MESSAGE( + "Resource with name ", Name, " marked is unique, but already present in the hash.\n" + "New resource will be used\n." ); + } + Elems.first->second = pObject; } - Elems.first->second = pObject; } } - void ResourceMappingImpl::RemoveResourceByName( const Char *Name ) + void ResourceMappingImpl::AddResource(const Char *Name, IDeviceObject *pObject, bool bIsUnique) { - if( *Name == 0 ) - return; - - auto LockHelper = Lock(); - // Remove object with the given name - // Name will be implicitly converted to HashMapStringKey without making a copy - auto It = m_HashTable.erase( Name ); + AddResourceArray( Name, 0, &pObject, 1, bIsUnique ); } - void ResourceMappingImpl::RemoveResource( IDeviceObject *pObject ) + void ResourceMappingImpl::RemoveResourceByName( const Char *Name, Uint32 ArrayIndex ) { - const auto *Name = pObject->GetDesc().Name; - VERIFY( Name, "Name is null" ); if( *Name == 0 ) return; auto LockHelper = Lock(); - - // Find active object with the same name + // Remove object with the given name // Name will be implicitly converted to HashMapStringKey without making a copy - auto It = m_HashTable.find( Name ); - // Check if the active object is in fact the object being removed - if( It != m_HashTable.end() && It->second == pObject ) - { - m_HashTable.erase( It ); - } + m_HashTable.erase( ResMappingHashKey(Name, false, ArrayIndex) ); } - void ResourceMappingImpl::GetResource( const Char *Name, IDeviceObject **ppResource ) + void ResourceMappingImpl::GetResource( const Char *Name, IDeviceObject **ppResource, Uint32 ArrayIndex ) { VERIFY(Name, "Name is null") if( *Name == 0 ) @@ -114,7 +105,7 @@ namespace Diligent // Find an object with the requested name // Name will be implicitly converted to HashMapStringKey without making a copy - auto It = m_HashTable.find( Name ); + auto It = m_HashTable.find( ResMappingHashKey(Name, false, ArrayIndex) ); if( It != m_HashTable.end() ) { *ppResource = It->second.RawPtr(); diff --git a/Graphics/GraphicsEngine/src/Texture.cpp b/Graphics/GraphicsEngine/src/Texture.cpp index 60440bdc..244e93b7 100644 --- a/Graphics/GraphicsEngine/src/Texture.cpp +++ b/Graphics/GraphicsEngine/src/Texture.cpp @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,30 +32,39 @@ void ValidateTextureDesc( const TextureDesc& Desc ) #define LOG_TEXTURE_ERROR_AND_THROW(...) LOG_ERROR_AND_THROW("Texture \"", Desc.Name ? Desc.Name : "", "\": ", ##__VA_ARGS__) // Perform some parameter correctness check - if( Desc.Type == TEXTURE_TYPE_1D || Desc.Type == TEXTURE_TYPE_1D_ARRAY ) + if( Desc.Type == RESOURCE_DIM_TEX_1D || Desc.Type == RESOURCE_DIM_TEX_1D_ARRAY ) { if( Desc.Height != 1 ) LOG_TEXTURE_ERROR_AND_THROW("Height (", Desc.Height,") of Texture 1D/Texture 1D Array must be 1"); } - if( Desc.Type == TEXTURE_TYPE_1D || Desc.Type == TEXTURE_TYPE_2D ) + if( Desc.Type == RESOURCE_DIM_TEX_1D || Desc.Type == RESOURCE_DIM_TEX_2D ) { if( Desc.ArraySize != 1 ) LOG_TEXTURE_ERROR_AND_THROW("Texture 1D/2D must have one array slice (", Desc.ArraySize, " provided). Use Texture 1D/2D array if you need more than one slice."); } + if( Desc.Type == RESOURCE_DIM_TEX_CUBE || Desc.Type == RESOURCE_DIM_TEX_CUBE_ARRAY ) + { + if( Desc.Width != Desc.Height ) + LOG_TEXTURE_ERROR_AND_THROW("For cube map textures, texture width (", Desc.Width," provided) must match texture height (", Desc.Height, " provided)"); + + if( Desc.ArraySize < 6 ) + LOG_TEXTURE_ERROR_AND_THROW("Texture cube/cube array must have at least 6 slices (", Desc.ArraySize, " provided)."); + } + Uint32 MaxDim = 0; - if( Desc.Type == TEXTURE_TYPE_1D || Desc.Type == TEXTURE_TYPE_1D_ARRAY ) + if( Desc.Type == RESOURCE_DIM_TEX_1D || Desc.Type == RESOURCE_DIM_TEX_1D_ARRAY ) MaxDim = Desc.Width; - else if( Desc.Type == TEXTURE_TYPE_2D || Desc.Type == TEXTURE_TYPE_2D_ARRAY ) + else if( Desc.Type == RESOURCE_DIM_TEX_2D || Desc.Type == RESOURCE_DIM_TEX_2D_ARRAY || Desc.Type == RESOURCE_DIM_TEX_CUBE || Desc.Type == RESOURCE_DIM_TEX_CUBE_ARRAY ) MaxDim = std::max(Desc.Width, Desc.Height); - else if( Desc.Type == TEXTURE_TYPE_3D ) + else if( Desc.Type == RESOURCE_DIM_TEX_3D ) MaxDim = std::max( std::max(Desc.Width, Desc.Height), Desc.Depth ); VERIFY( MaxDim >= (1U << (Desc.MipLevels-1)), "Texture \"", Desc.Name ? Desc.Name : "", "\": Incorrect number of Mip levels (", Desc.MipLevels, ")" ) if( Desc.SampleCount > 1 ) { - if( !(Desc.Type == TEXTURE_TYPE_2D || Desc.Type == TEXTURE_TYPE_2D_ARRAY) ) + if( !(Desc.Type == RESOURCE_DIM_TEX_2D || Desc.Type == RESOURCE_DIM_TEX_2D_ARRAY) ) LOG_TEXTURE_ERROR_AND_THROW("Only Texture 2D/Texture 2D Array can be multisampled"); if( Desc.MipLevels != 1 ) @@ -80,14 +89,16 @@ void ValidateTextureDesc( const TextureDesc& Desc ) void ValidateTextureRegion(const TextureDesc &TexDesc, Uint32 MipLevel, Uint32 Slice, const Box &Box) { #define VERIFY_TEX_PARAMS(Expr, ...) VERIFY(Expr, "Texture \"", TexDesc.Name ? TexDesc.Name : "", "\": ", ##__VA_ARGS__) - +#ifdef _DEBUG VERIFY_TEX_PARAMS( MipLevel < TexDesc.MipLevels, "Mip level (", MipLevel, ") is out of allowed range [0, ", TexDesc.MipLevels-1, "]" ); VERIFY_TEX_PARAMS( Box.MinX < Box.MaxX, "Incorrect X range [",Box.MinX, ", ", Box.MaxX, ")" ); VERIFY_TEX_PARAMS( Box.MinY < Box.MaxY, "Incorrect Y range [",Box.MinY, ", ", Box.MaxY, ")" ); VERIFY_TEX_PARAMS( Box.MinZ < Box.MaxZ, "Incorrect Z range [",Box.MinZ, ", ", Box.MaxZ, ")" ); - if( TexDesc.Type == TEXTURE_TYPE_1D_ARRAY || - TexDesc.Type == TEXTURE_TYPE_2D_ARRAY ) + if( TexDesc.Type == RESOURCE_DIM_TEX_1D_ARRAY || + TexDesc.Type == RESOURCE_DIM_TEX_2D_ARRAY || + TexDesc.Type == RESOURCE_DIM_TEX_CUBE || + TexDesc.Type == RESOURCE_DIM_TEX_CUBE_ARRAY) { VERIFY_TEX_PARAMS( Slice < TexDesc.ArraySize, "Array slice (", Slice, ") is out of range [0,", TexDesc.ArraySize-1, "]" ); } @@ -96,20 +107,22 @@ void ValidateTextureRegion(const TextureDesc &TexDesc, Uint32 MipLevel, Uint32 S VERIFY_TEX_PARAMS( Slice == 0, "Array slice (", Slice, ") must be 0 for non-array textures" ); } + Uint32 MipWidth = std::max(TexDesc.Width >> MipLevel, 1U); VERIFY_TEX_PARAMS( Box.MaxX <= MipWidth, "Region max X coordinate (", Box.MaxX, ") is out of allowed range [0, ", MipWidth, "]" ); - if( TexDesc.Type != TEXTURE_TYPE_1D && - TexDesc.Type != TEXTURE_TYPE_1D_ARRAY ) + if( TexDesc.Type != RESOURCE_DIM_TEX_1D && + TexDesc.Type != RESOURCE_DIM_TEX_1D_ARRAY ) { Uint32 MipHeight = std::max(TexDesc.Height >> MipLevel, 1U); VERIFY_TEX_PARAMS( Box.MaxY <= MipHeight, "Region max Y coordinate (", Box.MaxY, ") is out of allowed range [0, ", MipHeight, "]" ); } - if( TexDesc.Type == TEXTURE_TYPE_3D ) + if( TexDesc.Type == RESOURCE_DIM_TEX_3D ) { Uint32 MipDepth = std::max(TexDesc.Depth >> MipLevel, 1U); VERIFY_TEX_PARAMS( Box.MaxZ <= MipDepth, "Region max Z coordinate (", Box.MaxZ, ") is out of allowed range [0, ", MipDepth, "]" ); } +#endif } void ValidateUpdateDataParams( const TextureDesc &TexDesc, Uint32 MipLevel, Uint32 Slice, const Box &DstBox, const TextureSubResData &SubresData ) @@ -128,13 +141,13 @@ void VliadateCopyTextureDataParams( const TextureDesc &SrcTexDesc, Uint32 SrcMip if( pSrcBox == nullptr ) { SrcBox.MaxX = std::max( SrcTexDesc.Width >> SrcMipLevel, 1u ); - if( SrcTexDesc.Type == TEXTURE_TYPE_1D || - SrcTexDesc.Type == TEXTURE_TYPE_1D_ARRAY ) + if( SrcTexDesc.Type == RESOURCE_DIM_TEX_1D || + SrcTexDesc.Type == RESOURCE_DIM_TEX_1D_ARRAY ) SrcBox.MaxY = 1; else SrcBox.MaxY = std::max( SrcTexDesc.Height >> SrcMipLevel, 1u ); - if( SrcTexDesc.Type == TEXTURE_TYPE_3D ) + if( SrcTexDesc.Type == RESOURCE_DIM_TEX_3D ) SrcBox.MaxZ = std::max( SrcTexDesc.Depth >> SrcMipLevel, 1u ); else SrcBox.MaxZ = 1; diff --git a/Graphics/GraphicsEngine/src/pch.cpp b/Graphics/GraphicsEngine/src/pch.cpp index bf010b17..b2c201a7 100644 --- a/Graphics/GraphicsEngine/src/pch.cpp +++ b/Graphics/GraphicsEngine/src/pch.cpp @@ -1,4 +1,4 @@ -/* Copyright 2015 Egor Yusov +/* Copyright 2015-2016 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. -- cgit v1.2.3