842 Commits

Author SHA1 Message Date
baldurk fc831982eb Add a 'garbage collection' for cached state objects
* In extreme cases a program can create lots and lots of unique short-
  lived state objects, we cache them all and run out of the 4096 state
  objects that can be around, then further creates fail out.
* To handle this, if we have 4000 total state objects, we release any
  that are purely being held by us (not the program). This isn't an
  ideal solution but it's quite simple and non-invasive, and only has
  a slight impact on rare Create calls.
* Most programs will either create a few up-front (as intended), or at
  worst create a few dozen or even few hundred then re-use them as they
  are cached.
2015-04-28 13:42:50 +02:00
baldurk c58c406b20 Mark subresources with data as having data in serialiser
* This means that Map() calls won't redundantly generate more data on
  top of the data serialised with the texture creation chunk.
2015-04-28 12:17:02 +02:00
baldurk 6ce04a391e Fix comparisons being wrong in previous commit 9273a5b. Refs #123
* Thanks to @loosche for catching this mistake!
2015-04-28 10:34:11 +02:00
baldurk 88da82baa7 Actually handle serialised case of program=0 on replay 2015-04-26 21:04:49 +02:00
baldurk ab876ad78f Allow glUseProgramStages program parameter to be 0, unbinding program(s) 2015-04-26 20:17:16 +02:00
baldurk 5392fc5c4b Make sure buffer alignment happens everywhere serialising needs to match 2015-04-25 13:44:32 +02:00
baldurk 2558b2cdea Add ways to detect RenderDoc being injected in D3D11 and OpenGL
* D3D11 you query for interface with UUID of
  {A7AA6116-9C8D-4BBA-9083-B4D816B71B78}. It's just IUnknown*
* GL implements GL_EXT_debug_tool with spec here:
  https://renderdoc.org/debug_tool.txt
  with DEBUG_TOOL_EXT #define'd to 0x6789, DEBUG_TOOL_NAME_EXT to 0x678A
  and DEBUG_TOOL_PURPOSE_EXT to 0x678B. For now, reporting this ext is
  enough to identify RenderDoc.
2015-04-24 22:12:30 +02:00
baldurk f576a80cf7 Update Khronos GL header files, change function signatures to match 2015-04-24 22:12:29 +02:00
baldurk 584d439620 Add util function to align serialised buffers in chunks. Refs #133
* To align a buffer inside a chunk to a wider boundary like 32-bytes in
  this case, the chunk needs to be aligned and the buffer within it also
  needs to be aligned.
* The utility function accounts for the buffer serialised having a
  uint32 length in front of it, so it pads out until that will be at
  the desired boundary. This is a bit of a messy solution, but the
  easiest way to ensure the padding is there while being easily
  backwards compatible with old logs without the padding.
* D3D11 and GL serialise versions are bumped, D3D11 version is backwards
  compatible, GL breaks compatibility.
2015-04-24 11:07:02 +02:00
baldurk 3701b46611 Handle glGetIntermalformativ being missing
* Fixes a reported crash.
* This function was only core in 4.2 so it's perfectly valid for it to
  be missing - if so then we just skip using it to determine the size of
  a format and default to 8-bit colour or 32-bit depth/stencil formats.
2015-04-21 21:00:50 +02:00
baldurk 49b2cfc8f6 Compile fix for 53a6a94 2015-04-21 21:00:37 +02:00
baldurk 53a6a94af4 Ensure that texture Map() pointers are aligned to 32 bytes. Refs #133 2015-04-21 20:22:03 +02:00
valeriog@crytek.com 218f893be1 Clean up pointers to a GL resource record on buffer destruction.
Fixes potential access violation when glMemoryBarrier is called after a persistently mapped buffer is destroyed.
2015-04-20 16:49:32 +02:00
valeriog@crytek.com e989d50a99 Do not treat output window contexts as legacy.
Avoids using GL_LUMINANCE instead of GL_R8 for glyph texture.
2015-04-20 16:49:31 +02:00
baldurk 7245e9a606 Report WGL_EXT_swap_control in the normal GL extension string 2015-04-20 14:05:31 +02:00
baldurk 8b773afe71 Align D3D buffer memory to 32-byte boundary, for AVX instrs. Refs #133 2015-04-20 13:46:27 +02:00
baldurk 6993052c31 Linux compile fixes 2015-04-14 08:05:13 +01:00
baldurk b41b5242d1 Support switching between multiple APIs in the same program. Closes #124
* The core class is now responsible for tracking the active window and
  cycling through, so it can cycle through multiple APIs.
* For GL we only set up associations for capturable windows, and only
  those that present (since helper windows are often created). Since
  GL doesn't really have a 'this window is done rendering' call, we just
  decay old windows that haven't presented in >5 seconds.
* Also on GL, legacy/uncapturable windows aren't associated so they will
  not cycle to at all.
* The embedding API now expects a device pointer and window handle to
  set active window or start/end a capture. You can still pass NULLs if
  there is only one API active.
2015-04-13 11:31:30 +01:00
baldurk d91f36281b Make sure only to delete GL objects that were created in the first place 2015-04-13 10:57:05 +01:00
baldurk 54b2ba86a3 Change function to take const ref instead of copying whole vector 2015-04-11 17:52:08 +01:00
baldurk a5cc19ccc6 Implement replay-side resource tracking for OpenGL
* This means that the timeline bar will show use as read/write/clear etc
  and that right clicking on textures in the texture viewer will show
  the events where that texture is used for rendering, for reading, and
  so on.
2015-04-11 11:03:19 +01:00
baldurk e0e345abd7 Bump GL file serialise version for previous commit 2015-04-11 01:09:28 +01:00
baldurk 3ca65bd632 Allow glDrawElements and friends to pass indices as memory. Closes #127
* This is a concession towards non-core capturing, as it's fairly easy
  to support this fallback case without having a negative effect on the
  proper path.
* We serialise out whether an index buffer was bound, and if it wasn't
  we serialise the array passed as a parameter, and upload it into a
  temporary index buffer we generate (so that the replay is correct at
  least).
* I think technically the indirect parameter for glDrawElementsIndirect
  can point to client memory, and the elements array-of-arrays in
  glMultiDrawElements can definitely point to client memory, but I'm
  assuming that no-one would do that. I certainly hope they wouldn't!
2015-04-10 19:05:21 +01:00
baldurk 35fa1ce2bf Refuse to capture on old contexts, warn on compat profiles. Closes #125
* If CreateContextAttribs is not used to create the context, the overlay
  will run in super-duper old mode using immediate mode calls and fixed
  function pipeline. This way it should display on (in theory) any GL
  app. Capturing will be prevented.
* Compatibility profile contexts are still allowed, but a warning is
  displayed in the overlay.
* If CreateContextAttribs is used to create a < 3.2 version context, we
  go down the same path as for legacy contexts, except with an accurate
  overlay message (just that the version isn't supported).
2015-04-08 21:43:04 +01:00
baldurk a4c705288c Return a wrapped ID3D11Debug interface when requested
* This prevents the app requesting an ID3D11Debug, getting the *real*
  one, and then escaping our little jail of QueryInterface interfaces.
  In particular, an app is likely to ask for ID3D11Debug then ask for
  ID3D11InfoQueue and we want to control use of that ourselves,
  particularly when we're tracking debug device messages.
2015-04-05 17:33:24 +01:00
baldurk 741d061985 Make sure texture is mipmap complete for min/max and histogram fetch
* If the app hasn't set max level appropriately, we will need to, to be
  sure that filtering doesn't come back just with black.
2015-04-02 17:40:26 +01:00
baldurk 8e7d5382c4 Linux compile fix 2015-04-02 09:41:35 +01:00
baldurk 4f8544e7c6 Handle matrices as shader outputs in GL
* We handle them mostly as a series of rows, adding only the first row
  as a varying name, but incrementing the stride for each to account for
  the space taken up by a matrix.
2015-04-02 00:05:37 +01:00
baldurk eed377c23d Make sure adding both gl_in and gl_out redeclares to same string works
* For everything but vertex shaders to make a separable program we need
  to redeclare gl_in and gl_out. If both of these end up in the same
  string the second insertion was trampling the first one - now they
  will both go in properly.
2015-04-01 23:26:31 +01:00
baldurk 9d74612079 Error check that printed string is a valid length, check for Map failure 2015-04-01 18:02:34 +01:00
baldurk c0be5552e8 Extract command line #defines to fxc, roll them in when editing shaders 2015-03-29 18:29:20 +01:00
baldurk 9273a5bdb3 Make sure assignments into scalar destinations are correct. Refs #123
* SetDst called into a scalar destination operand expect the source to
  be in .x of the parameter, regardless of mask. So in a couple of cases
  where we're assigning from a vector we need to do the mask apply
  by hand. Bit messy, but there are only a couple of exceptions
2015-03-29 17:43:05 +01:00
baldurk 68bf87d68f Make sure to match to right declaration type when looking for stride
* ld_structured was just looking for UAVs before, but this opcode is
  also used for SRVs and we need to find the right declaration to get
  the stride correctly (otherwise we'll either get 0 if there are no
  UAVs, or pick a UAV incorrectly!)
2015-03-27 01:15:15 +00:00
baldurk 47737d4192 Remove assert since we handle the asserted case, it's not unexpected
* It's reasonably common to get mismatched begin/end events especially
  around frame boundaries.
2015-03-26 17:55:52 +00:00
baldurk 490dbea556 A couple of fixes to not index in invalid ways into vectors/strings 2015-03-25 20:18:30 +00:00
baldurk d2a1d2950a Allow predicate to be NULL without skipping the SetPredication() call
* Call to HasLiveResource needs to make sure to account for a NULL
  parameter that ends up with Resource ID 0. Bug introduced in 7aee40f.
2015-03-20 19:20:33 +00:00
Vladimir Vukicevic c6e8f0d708 Use DXGI 1.2 to call Present1(), not 1.3 2015-03-16 12:11:29 -04:00
baldurk 0aa5dc2e66 Fix check for over-sized depthtargets with rendertargets
* Was causing some valid output mergers to not be tracked correctly.
2015-03-13 11:29:42 +00:00
baldurk c962fbb043 Allow more queries in the initial wrapped pool
* The Talos Principle allocs more than 8192
2015-03-13 11:28:56 +00:00
baldurk 6cd1f70bb6 Fix several warnings for compiling on VS2015
* Note at the time of committing there are still some warnings in MS
  headers that you might need to suppress in a couple of files.
* 3rd party code just has the warnings suppressed for ease of merging.
* The majority of warning fixes were for local variables shadowing
  other locals, function parameters, or members. In most cases they
  weren't a problem, but in some cases it was potentially dangerous!
2015-03-13 10:16:19 +00:00
baldurk 0475408d7e Use the source resource's length, not destination's, when box is NULL
* Thanks to @bkaradzic for finding this one!
2015-03-12 23:42:48 +00:00
baldurk af97e30376 Linux compile fix, and include copies/generatemips in pixel history
* We treat them the same as UAV writes where we just list them in case
  the pixel is modified without checking.
2015-03-12 10:25:32 +00:00
baldurk 5bcbb47203 List GenerateMips, Copy and Resolve calls in event browser with draws
* What gets listed as a 'drawcall' is a bit fuzzy - previously it was
  drawing calls, dispatches and clears, but you could make a good
  argument for these to be included as well. As a semi-experiment, these
  calls are now included and will be listed in the event browser.
* Other calls can change resources like direct buffer or texture uploads
  and Map() type calls, but these remain as API calls listed between
  draw calls. Again this is mostly an arbitrary distinction.
* D3D11 logs are backwards compatible, GL logs are not (although it'd
  be relatively simple, GL logs will likely break backwards compat soon
  anyway, so not worth supporting it now only to break it soon).
2015-03-11 13:13:41 +00:00
baldurk c3e381a76a Remap entire index buffer for post-vs data, instead of just shifting
* Previously for post VS data we could maintain the index buffer by just
  doing the stream-out/transform feedback for a point list with each
  unique index. To maintain the index buffer we padded out any gaps in
  the indices with a single value, so that we could just shift the
  indices. This causes severe problems though if the indices start at 0
  and contain an invalid value like 0xcccccccc - we'd allocate a huge
  array and perform a massively wasteful streamout.
* Instead, we just stream out on the tightly packed list of unique
  indices, then remap each 'real' index to where it is in the tightly
  packed output buffer.
2015-03-10 21:05:59 +00:00
baldurk f46e31c4ba Only account for mip in slice/face index for 3D textures.
* This prevents arrays or cubemaps from having the slice or face index
  be incorrectly modified by the mip being displayed. Thanks Xavyiy on
  twitter for the report.
  https://twitter.com/Xavyiy/status/574352181190594560
2015-03-07 23:58:37 +00:00
baldurk 05fd8374a6 Fix a couple of D3D11 overlays not setting up tess/gs & IA correctly 2015-03-02 16:15:56 +00:00
baldurk e2f7afc3a2 Make sure Fullscreen VS is also created in capturing program
* This shader is necessary for the MSAA-to-array copying functionality
  used, and without it we bind a NULL vertex shader and can end up with
  driver crashes.
2015-03-02 11:45:38 +00:00
baldurk 954da5c0e4 Compile fix - uninitialised variable 2015-02-27 09:18:55 +00:00
baldurk f8e8ae1391 Add in gl_PerVertex redeclarations individually
* This means the redeclarations are a bit more flexible if a shader
  (like a geometry shader) redeclares one already, but not the other,
  we'll only substitute in the missing one.
* Note this code is still a bit flakey e.g. in edge cases like if
  someone puts "in gl_PerVertex" in a comment, then it will fail.
  I want to avoid putting a full parser in, but perhaps stripping the
  source of any comments is a reasonable future step.
2015-02-26 17:58:41 +00:00
baldurk 43d4fff314 Fix typo when fetching shader subroutine values 2015-02-26 17:40:16 +00:00