Commit Graph

7624 Commits

Author SHA1 Message Date
baldurk d0ca83bf6c Support creating OpenGL ES contexts via WGL/GLX. Closes #1009 2018-07-06 22:44:22 +01:00
baldurk 4299c29c8b Print message when registering library hooks 2018-07-06 22:44:22 +01:00
baldurk 9999ec25b8 Remove temporary compatibility hook helpers 2018-07-06 22:44:22 +01:00
baldurk a504389bd1 Add new cleaned up GL hooks
* This code was significantly different from the old code, enough that it made
  more sense to re-implement from scratch than modify the old code.
* Note it doesn't compile yet and is not included in any projects.
* We have a hookset per GL interface - WGL, GLX, and stubbed out CGL for mac. In
  addition we have EGL which can be compiled in at the same time as the others.
  Each interface has a dispatch table similar to GL for handling its hooks all
  together.
* The platform hooksets hook their platform-specific functions like
  createcontext, swapbuffers, and makecurrent. For getprocaddress they can call
  into a common function that looks up general GL hooks.
* EGL and GLX can populate the GL hooks using eglGetProcAddress /
  glXGetProcAddress as soon as the library is loaded, but for WGL we must wait
  until the first time a context becomes current.
* We also have an implementation of GLPlatform per type. This takes care of work
  that is platform specific - mostly during replay but also somewhat during
  capture. This is kept separate from the actual hooks.
* On replay we have a platform-specific replay create entry point which
  populuates the relevant dispatch table and calls into a general replay create.
  This will do most common work together but calls out to the GLPlatform
  implementation to do actual initialisation of the API.
2018-07-06 22:44:21 +01:00
baldurk ee853f7f33 Move CheckConstParam into common code 2018-07-06 22:44:21 +01:00
baldurk 426a6cf3ac Add a log print when a new context is created 2018-07-06 22:44:21 +01:00
baldurk d9f439fbbe Add python script to replace bash/perl scripts generating GL hooks 2018-07-06 22:44:21 +01:00
baldurk 28ec4e4fb8 Remove bool returns from GL hook functions that cannot meaningfully fail
* In particular, populating hooks can't fail because we're just fetching as many
  function pointers as we can. Any missing functions have to be handled
  elsewhere.
* This simplifies codepaths and makes it easier to track what's going on without
  needing to thinkg about failure conditions that can never happen.
2018-07-06 22:44:20 +01:00
baldurk c70c116bd7 Refactor hooks towards more unified/clean approach
* Hooking is now done the same way across platform, with different OS
  implementations.
* Regardless of how exactly hooks are implemented, we register libraries to hook
  and functions to hook within those libraries, and provide a location to store
  the original/onwards function pointer. This allows hooking to work whether
  it's done using import hooking that doesn't modify target libraries (so using
  dlsym or GetProcAddress will return the same value for the onwards function
  pointer) or whether it's implemented with prologue patching and trampolines,
  where we'd create an infinite loop if we did that.
* We also provide stronger guarantees - the original function pointers will
  _always_ be made available as soon as the library is loaded, whether hooked or
  not, no exceptions. This means less uncertainty in hooking code about when or
  how onward functions will be available.
* OS-specific hook functions are changed to just be implementations of
  LibraryHooks functions rather than indirected through macros and pre-processor
  definitions.
* In this commit we provide some temporary functions providing the old interface
  to reduce churn - the library-specific hook code will be updated shortly after
2018-07-06 22:44:20 +01:00
baldurk edd6ab4faa Hook initialisation can't fail, because it's just a registration
* Hooking no longer does anything active immediately when initialised, it just
  registers a function to be hooked, which is then deferred and/or continually
  re-hooked depending on platform-specific functionality.
2018-07-06 22:44:20 +01:00
baldurk 6a30e63a46 LibraryHook classes self-register, without library name
* The libName parameter to CreateHooks isn't yet deleted since it's used as a
  hack in the GL hooks to have multiple paths through a function.
2018-07-06 22:44:19 +01:00
baldurk 9ecad14932 Provide default implementation for LibraryHook::OptionsUpdated 2018-07-06 22:44:19 +01:00
baldurk 75623b4487 Clean up D3D/DXGI hooks. Reduce duplication and separate replay code
* Previously we were going through the hooks for device/factory creation, which
  did barely anything actually useful. Instead we can call directly to the real
  function and wrap the result manually.
2018-07-06 22:44:19 +01:00
baldurk b47ce7d413 Remove the ability to enable/disable hooks
* This wasn't very well supported after D3D11 anyway, and modern tools
  (VSGD/PIX/etc) don't respect D3DPERF_SetOptions which was the only route that
  actually needed to globally enable/disable hooks.
* D3D11CreateDevices's flag still works to prevent hooking.
2018-07-06 22:44:19 +01:00
baldurk 73e1f7e770 Refactor GL hookset to only a single shared hookset
* Rather than having a hookset created within the different bits of platform
  hooking code and then passed around everywhere, we just make a single global
  hookset object that's shared.
* There's no risk of conflict because our GL object handles all possible
  contexts, there's no separate instancing or anything.
* We also have places like the GL emulation or unsupported function hooks that
  do not handle two separate onward functions, and we undoubtedly have many
  assumptions that only one copy of RenderDoc will hook any given API. If we
  needed multiple hooksets within the same library a huge amount would need to
  change.
2018-07-06 22:44:18 +01:00
baldurk f849952ce9 Move global GL lock into common code 2018-07-06 22:44:18 +01:00
baldurk a7509dadb6 Remove Pre/Post Init/Shutdown of counters. Inline into normal flow 2018-07-06 22:44:18 +01:00
baldurk 152ebc2e2e Add handling for D3D12.1 - D3D12.3 interface UUIDs in queries 2018-07-06 22:44:18 +01:00
baldurk 02f3196935 Support integer and 16/32-bit alpha/intensity/luminance textures 2018-07-06 22:44:17 +01:00
baldurk 06d14ff62b Define safe comparisons for python bindings
* In particular this means that it's safe to compare a ResourceId or similar
  against None. It is always not-equal but it's useful to have the comparison
  work and return the expected result instead of throwing a null reference
  exception.
2018-07-06 22:44:17 +01:00
baldurk b873728d49 Copy trailing null byte to keep GCC warnings happy. Closes #1028 2018-07-06 22:44:17 +01:00
baldurk b8e3fe5f31 Don't unnecessarily require indexed functions - check for extensions
* For indexed viewports or blends, we make sure we have fallback code in case
  the extensions aren't present.
2018-07-06 22:44:17 +01:00
baldurk 96d53c162c Prefer glFramebufferTexture2D over glFramebufferTexture
* The former is just as good for our purposes (we almost always bind 2D
  textures) and is more portable/widely available.
2018-07-06 22:44:16 +01:00
baldurk ff619c8014 Ensure that vendor checks don't pollute global state
* In particular don't leave a VAO bound, even after deleting it.
2018-07-06 22:44:16 +01:00
baldurk edbfdfb779 Ensure that local EGL headers include our platform headers, not system 2018-07-06 22:44:16 +01:00
baldurk 573ab82fbf Match varying names in case some GL driver doesn't link by location 2018-07-06 22:44:16 +01:00
baldurk 487ac04d83 When generating GLES shaders without uniforms, declare precision
* This usually comes from debuguniforms.h, but if we exclude it we still need to
  declare the precision.
2018-07-06 22:44:10 +01:00
baldurk 5477b289ac Only warn if glBindFragDataLocation is not supported
* This becomes very spammy and there's not much that can be done - we just have
  to hope the program bindings are not variable and end up the same on replay as
  they were on capture.
2018-07-06 20:44:30 +01:00
baldurk db551cd23d Fix missing apply of blend state when indexed blending is not available 2018-07-06 20:44:30 +01:00
baldurk dcfe93d5c6 EXT_draw_buffers2 equivalent isn't available until GLES 3.2 2018-07-06 20:44:30 +01:00
Dzmitry Malyshau 9c9e61a95e Remove unused this in lambdas of ShaderViewer 2018-07-03 22:08:28 +01:00
baldurk 6e8218d0e0 When applying render state, don't assume UAVStartSlot == NumRTVs
* On D3D11.1 the UAV slots can be greater than 8 which is the maximum value for
  NumRTVs.
2018-06-28 18:25:20 +01:00
baldurk 08e7eecd3b Cache EvaluateAttribute* per-sample data for debugging. Closes #1025 2018-06-28 18:25:20 +01:00
baldurk 56c55da9f5 Bypass wrapper for a couple of buffer operations
* This prevents our wrapper from serialising internal operations in the capture.
2018-06-28 18:25:20 +01:00
baldurk bcafe108f6 Make it clear that GL 3.2 and up are supported 2018-06-28 18:25:20 +01:00
baldurk 66946f1b3b Fix handling of sample_info/sample_pos for non-MSAA rasterizer
* Refs #1025 but is not a complete fix as sample evaluation is still not
  working.
2018-06-28 18:25:20 +01:00
baldurk e08f1a4d2e Set proper loader dispatch table while allocating external queue cmd buf 2018-06-28 18:25:20 +01:00
baldurk e16d06960c Thread ID should be read from XML as uint64_t 2018-06-27 20:24:07 +01:00
baldurk 6785272944 Copy stored compressed data on GLES in glCopyImageSubData
* Could be a common pattern with texture streaming to copy a smaller texture's
  mips into the mip-tail of a larger texture, then only provide data for higher
  mips.
2018-06-27 20:24:07 +01:00
baldurk 001c07e079 Serialise glFlush and glFinish 2018-06-27 20:24:07 +01:00
baldurk 2a2ac0624d Handle unsized depth/stencil formats correctly 2018-06-27 20:24:06 +01:00
baldurk 7338316a40 Remove vrapi hooks. Closes #1011
* Unfortunately even with recent fixes, some devices still break when vrapi is
  hooked.
2018-06-26 18:54:29 +01:00
baldurk 34d689b809 Include fetch_counters example in index 2018-06-25 21:58:02 +01:00
baldurk 5e81319424 When replaying a single multidraw draw, ensure the draw index is correct
* We accomplish this by doing a 'multidraw' for even the single draw case, but
  set the parameters for all prior draws to 0 so nothing happens.
2018-06-25 18:14:05 +01:00
baldurk faacec5e96 Read indirect draw count from parameter buffer, not draw indirect buffer 2018-06-25 18:14:05 +01:00
baldurk 43d9a35c45 Specialise stringifaction of glClear bitfield mask 2018-06-25 18:14:05 +01:00
baldurk 87ff61169f Take IDs of input variables from SPIR-V patch data
* If we try and match up input variables by location, and the shader has
  multiple variables mapped to a single location, we end up leaving one variable
  unmapped. We already have the information so we don't have to do this
  inaccurate lookup.
2018-06-25 18:14:05 +01:00
baldurk 0604d037e6 Fix incorrect allocation not allowing space for pathname 2018-06-25 18:14:05 +01:00
baldurk 34e174179a Fix FindDiffRange() check of final non-vector-sized bytes 2018-06-25 18:14:05 +01:00
baldurk 2476474ca9 Add python sample for fetching counters 2018-06-25 18:14:04 +01:00