apitrace: Changes to 'upstream'
.gitignore | 2
.travis.yml | 59
BUGS.markdown | 210
CMakeLists.txt | 402
DEVELOPMENT.markdown | 169
Dalvik.markdown | 55
INSTALL.markdown | 142
NEWS.markdown | 72
README.markdown | 524
TODO.markdown | 1
appveyor.yml | 38
cli/CMakeLists.txt | 23
cli/cli.hpp | 4
cli/cli_diff.cpp | 10
cli/cli_diff_images.cpp | 10
cli/cli_diff_state.cpp | 71
cli/cli_dump.cpp | 14
cli/cli_pager.cpp | 47
cli/cli_pager.hpp | 4
cli/cli_pickle.cpp | 30
cli/cli_resources.cpp | 7
cli/cli_resources.hpp | 4
cli/cli_retrace.hpp | 4
cli/cli_sed.cpp | 59
cli/cli_trace.cpp | 114
cli/pickle.hpp | 65
cmake/ConvenienceLibrary.cmake | 15
cmake/FindDirectX.cmake | 497
cmake/FindSNAPPY.cmake | 13
cmake/Findprocps.cmake | 16
cmake/InstallPDB.cmake | 17
cmake/toolchain/android.toolchain.cmake | 391
common/formatter.hpp | 225
common/highlight.cpp | 324
common/highlight.hpp | 86
common/os.hpp | 27
common/os_backtrace.hpp | 5
common/os_binary.hpp | 4
common/os_dl.hpp | 4
common/os_memory.hpp | 23
common/os_posix.cpp | 111
common/os_process.hpp | 4
common/os_string.hpp | 6
common/os_thread.hpp | 198
common/os_time.hpp | 4
common/os_version.hpp | 61
common/os_win32.cpp | 88
common/trace_api.hpp | 5
common/trace_callset.hpp | 4
common/trace_dump.cpp | 67
common/trace_dump.hpp | 16
common/trace_fast_callset.hpp | 4
common/trace_file.hpp | 5
common/trace_file_snappy.cpp | 28
common/trace_file_zlib.cpp | 42
common/trace_format.hpp | 109
common/trace_loader.hpp | 4
common/trace_lookup.hpp | 4
common/trace_model.cpp | 95
common/trace_model.hpp | 31
common/trace_option.cpp | 9
common/trace_option.hpp | 7
common/trace_parser.cpp | 28
common/trace_parser.hpp | 7
common/trace_parser_flags.cpp | 85
common/trace_profiler.cpp | 1
common/trace_profiler.hpp | 4
common/trace_writer.cpp | 32
common/trace_writer.hpp | 5
common/trace_writer_local.cpp | 51
common/trace_writer_local.hpp | 6
common/trace_writer_model.cpp | 4
common/ubjson.hpp | 111
dispatch/.gitignore | 1
dispatch/CMakeLists.txt | 36
dispatch/compat.h | 23
dispatch/d2dimports.hpp | 4
dispatch/d3d10_1imports.hpp | 48
dispatch/d3d10imports.hpp | 9
dispatch/d3d11imports.hpp | 6
dispatch/d3d8imports.hpp | 4
dispatch/d3d9imports.hpp | 4
dispatch/d3derr.hpp | 43
dispatch/d3dimports.hpp | 57
dispatch/dispatch.py | 73
dispatch/dlopen.hpp | 4
dispatch/dxgiint.h | 25
dispatch/eglimports.hpp | 4
dispatch/glimports.hpp | 59
dispatch/glproc.py | 152
dispatch/glproc_egl.cpp | 27
dispatch/glproc_gl.cpp | 57
docs/BUGS.markdown | 215
docs/Dalvik.markdown | 52
docs/FORMAT.markdown | 128
docs/HACKING.markdown | 244
docs/INSTALL.markdown | 174
docs/NEWS.markdown | 100
docs/TODO.markdown | 1
docs/USAGE.markdown | 551
docs/VMWX_map_buffer_debug.txt | 116
gui/.gitignore | 3
gui/CMakeLists.txt | 80
gui/androiddevicedialog.cpp | 556
gui/androiddevicedialog.h | 65
gui/androidfiledialog.cpp | 279
gui/androidfiledialog.h | 45
gui/androidretracer.cpp | 326
gui/androidretracer.h | 33
gui/androidutils.cpp | 185
gui/androidutils.h | 71
gui/apicalldelegate.cpp | 18
gui/apicalldelegate.h | 5
gui/apisurface.cpp | 17
gui/apisurface.h | 14
gui/apitrace.cpp | 106
gui/apitrace.h | 24
gui/apitracecall.cpp | 258
gui/apitracecall.h | 47
gui/apitracefilter.cpp | 17
gui/apitracefilter.h | 5
gui/apitracemodel.cpp | 1
gui/apitracemodel.h | 5
gui/argumentseditor.h | 5
gui/calldurationgraph.h | 4
gui/glsledit.cpp | 2
gui/graphing/frameaxiswidget.h | 5
gui/graphing/graphaxiswidget.h | 5
gui/graphing/graphing.h | 5
gui/graphing/graphlabelwidget.h | 5
gui/graphing/graphview.h | 5
gui/graphing/graphwidget.h | 5
gui/graphing/heatmapverticalaxiswidget.h | 5
gui/graphing/heatmapview.h | 5
gui/graphing/histogramview.h | 5
gui/graphing/timeaxiswidget.h | 5
gui/imageviewer.cpp | 8
gui/imageviewer.h | 9
gui/jumpwidget.h | 5
gui/main.cpp | 5
gui/mainwindow.cpp | 392
gui/mainwindow.h | 24
gui/pixelwidget.h | 6
gui/profiledialog.cpp | 2
gui/profiledialog.h | 5
gui/profileheatmap.h | 13
gui/profiletablemodel.h | 4
gui/profiling.h | 5
gui/qapitrace.qrc | 46
gui/qubjson.cpp | 298
gui/qubjson.h | 34
gui/qubjson_test.cpp | 157
gui/resources/android-setup.png |binary
gui/resources/android.png |binary
gui/resources/glreference-man.sh | 10
gui/resources/glreference-registry.sh | 6
gui/resources/glreference.tsv | 6498 +++++-----
gui/retracer.cpp | 183
gui/retracer.h | 22
gui/saverthread.cpp | 11
gui/saverthread.h | 6
gui/searchwidget.h | 5
gui/settingsdialog.cpp | 60
gui/settingsdialog.h | 11
gui/shaderssourcewidget.h | 5
gui/thumbnail.h | 5
gui/tracedialog.h | 5
gui/traceloader.cpp | 296
gui/traceloader.h | 34
gui/traceprocess.h | 5
gui/trimprocess.h | 6
gui/ui/androiddevicedialog.ui | 132
gui/ui/androidfiledialog.ui | 149
gui/ui/imageviewer.ui | 18
gui/ui/mainwindow.ui | 133
gui/ui/profilereplaydialog.ui | 12
gui/ui/settings.ui | 136
gui/vertexdatainterpreter.h | 5
helpers/CMakeLists.txt | 18
helpers/com_ptr.hpp | 87
helpers/d3d10size.hpp | 44
helpers/d3d11size.hpp | 44
helpers/d3d7size.hpp | 105
helpers/d3d8size.hpp | 4
helpers/d3d9size.hpp | 4
helpers/d3dcommonsize.hpp | 4
helpers/d3dshader.cpp | 4
helpers/d3dshader.hpp | 4
helpers/dxgisize.hpp | 4
helpers/eglsize.hpp | 5
helpers/glprofile.cpp | 325
helpers/glprofile.hpp | 143
helpers/glsize.hpp | 245
image/image.hpp | 13
image/image_md5.cpp | 6
image/image_png.cpp | 75
image/image_pnm.cpp | 11
inject/CMakeLists.txt | 11
inject/inject.h | 112
inject/injectee.cpp | 974 +
inject/injector.cpp | 500
retrace/.gitignore | 2
retrace/CMakeLists.txt | 284
retrace/android/AndroidManifest.xml | 23
retrace/android/build.gradle | 46
retrace/android/java/apitrace/github/io/eglretrace/AbstractServer.java | 31
retrace/android/java/apitrace/github/io/eglretrace/QtCreatorDebugger.java | 242
retrace/android/java/apitrace/github/io/eglretrace/RetraceActivity.java | 114
retrace/android/java/apitrace/github/io/eglretrace/Servers.java | 54
retrace/android/local.properties.in | 7
retrace/android/res/drawable-hdpi/ic_launcher.png |binary
retrace/android/res/drawable-mdpi/ic_launcher.png |binary
retrace/android/res/drawable-xhdpi/ic_launcher.png |binary
retrace/android/res/drawable-xxhdpi/ic_launcher.png |binary
retrace/android/res/values/strings.xml | 4
retrace/d3d10state.cpp | 110
retrace/d3d10state.hpp | 89
retrace/d3d10state_images.cpp | 373
retrace/d3d11state.cpp | 137
retrace/d3d11state.hpp | 47
retrace/d3d11state_images.cpp | 435
retrace/d3d7state.cpp | 62
retrace/d3d7state_images.cpp | 216
retrace/d3d8state.cpp | 53
retrace/d3d8state_images.cpp | 231
retrace/d3d9retrace.py | 74
retrace/d3d9state.cpp | 52
retrace/d3d9state.hpp | 57
retrace/d3d9state_formats.cpp | 259
retrace/d3d9state_images.cpp | 191
retrace/d3dretrace.hpp | 18
retrace/d3dretrace_dxgi.hpp | 210
retrace/d3dretrace_dxgi_priv.cpp | 283
retrace/d3dretrace_main.cpp | 3
retrace/d3dstate.hpp | 70
retrace/ddrawretrace.py | 136
retrace/dllretrace.py | 1
retrace/dxgiretrace.py | 303
retrace/dxgistate.cpp | 348
retrace/dxgistate.hpp | 11
retrace/dxgistate_so.hpp | 116
retrace/dxgistate_so.py | 275
retrace/glretrace.hpp | 21
retrace/glretrace.py | 405
retrace/glretrace_cgl.cpp | 165
retrace/glretrace_egl.cpp | 102
retrace/glretrace_glx.cpp | 87
retrace/glretrace_main.cpp | 308
retrace/glretrace_wgl.cpp | 201
retrace/glretrace_ws.cpp | 84
retrace/glstate.cpp | 417
retrace/glstate.hpp | 12
retrace/glstate_formats.cpp | 662 +
retrace/glstate_images.cpp | 667 -
retrace/glstate_internal.hpp | 150
retrace/glstate_params.py | 369
retrace/glstate_shaders.cpp | 730 -
retrace/glws.cpp | 55
retrace/glws.hpp | 37
retrace/glws_cocoa.mm | 42
retrace/glws_egl_android.cpp | 723 +
retrace/glws_egl_xlib.cpp | 408
retrace/glws_glx.cpp | 340
retrace/glws_waffle.cpp | 90
retrace/glws_wgl.cpp | 197
retrace/glws_xlib.cpp | 245
retrace/glws_xlib.hpp | 69
retrace/json.cpp | 39
retrace/json.hpp | 49
retrace/retrace.cpp | 42
retrace/retrace.hpp | 49
retrace/retrace.py | 109
retrace/retrace_main.cpp | 149
retrace/retrace_stdc.cpp | 30
retrace/retrace_swizzle.cpp | 87
retrace/retrace_swizzle.hpp | 15
retrace/scoped_allocator.hpp | 9
retrace/state_writer.cpp | 81
retrace/state_writer.hpp | 182
retrace/state_writer_json.cpp | 126
retrace/state_writer_ubjson.cpp | 220
scripts/convert.py | 161
scripts/highlight.py | 4
scripts/jsondiff.py | 20
scripts/jsonextractimages.py | 21
scripts/retracediff.py | 1
scripts/tracediff.py | 87
scripts/unpickle.py | 57
specs/cglapi.py | 49
specs/d2d1.py | 5
specs/d3d.py | 116
specs/d3d10.py | 158
specs/d3d10_1.py | 119
specs/d3d10misc.py | 55
specs/d3d10sdklayers.py | 11
specs/d3d11.py | 369
specs/d3d11_1.py | 177
specs/d3d11sdklayers.py | 8
specs/d3d11shader.py | 186
specs/d3d8.py | 16
specs/d3d8types.py | 2
specs/d3d9.py | 33
specs/d3d9types.py | 2
specs/d3dcommon.py | 1
specs/d3dtypes.py | 4
specs/ddraw.py | 567
specs/dxgi.py | 584
specs/dxgi1_2.py | 52
specs/dxgiformat.py | 132
specs/dxgitype.py | 115
specs/eglapi.py | 40
specs/eglenum.py | 166
specs/glapi.py | 4217 +++---
specs/glesapi.py | 261
specs/glparams.py | 373
specs/gltypes.py | 8
specs/glxapi.py | 488
specs/scripts/.gitignore | 6
specs/scripts/Makefile | 46
specs/scripts/README.markdown | 8
specs/scripts/c2api.py | 442
specs/scripts/cdecl.py | 442
specs/scripts/eglenum.sh | 3
specs/scripts/glspec.py | 293
specs/scripts/gltxt.py | 244
specs/scripts/sort.sh | 2
specs/scripts/spec2api.py | 293
specs/scripts/txt2api.py | 244
specs/scripts/wglenum.sh | 5
specs/scripts/xml2api.py | 197
specs/scripts/xml2enum.py | 65
specs/scripts/xml2glparams.py | 43
specs/stdapi.py | 28
specs/wglapi.py | 84
specs/wglenum.py | 13
specs/winapi.py | 50
thirdparty/khronos/EGL/egl.h | 562
thirdparty/khronos/EGL/eglext.h | 292
thirdparty/khronos/EGL/eglplatform.h | 4
thirdparty/khronos/GL/glext.h | 1035 +
thirdparty/khronos/GL/glxext.h | 102
thirdparty/khronos/GL/wglext.h | 13
thirdparty/khronos/GLES2/gl2.h | 154
thirdparty/khronos/GLES2/gl2ext.h | 1334 ++
thirdparty/khronos/Makefile | 14
thirdparty/snappy/CMakeLists.txt | 11
thirdparty/snappy/COPYING | 26
thirdparty/snappy/ChangeLog | 699 +
thirdparty/snappy/NEWS | 39
thirdparty/snappy/config.h | 68
thirdparty/snappy/framing_format.txt | 35
thirdparty/snappy/snappy-c.h | 2
thirdparty/snappy/snappy-internal.h | 4
thirdparty/snappy/snappy-stubs-internal.h | 84
thirdparty/snappy/snappy-stubs-public.h | 17
thirdparty/snappy/snappy-stubs-public.h.in | 13
thirdparty/snappy/snappy-test.cc | 50
thirdparty/snappy/snappy-test.h | 99
thirdparty/snappy/snappy.cc | 347
thirdparty/snappy/snappy.h | 47
thirdparty/snappy/snappy_unittest.cc | 270
wrappers/.gitignore | 1
wrappers/CMakeLists.txt | 268
wrappers/assert.cpp | 65
wrappers/cgltrace.py | 24
wrappers/config.cpp | 448
wrappers/config.hpp | 74
wrappers/d2d1.def | 10
wrappers/d2d1trace.def | 8
wrappers/d3d10.def | 31
wrappers/d3d10_1.def | 32
wrappers/d3d10stubs.cpp | 522
wrappers/d3d11.def | 44
wrappers/d3d11stubs.cpp | 121
wrappers/d3d8trace.py | 2
wrappers/d3d9shader.hpp | 4
wrappers/d3d9trace.py | 54
wrappers/d3dcommonshader.hpp | 4
wrappers/d3dkmtstubs.cpp | 713 -
wrappers/ddraw.def | 2
wrappers/ddrawtrace.py | 34
wrappers/dlltrace.py | 3
wrappers/dlsym.cpp | 79
wrappers/dwrite.def | 4
wrappers/dwritetrace.cpp | 6
wrappers/dxgi.def | 47
wrappers/dxgistubs.cpp | 114
wrappers/dxgitrace.def | 16
wrappers/dxgitrace.py | 73
wrappers/egltrace.py | 53
wrappers/egltrace.version | 10
wrappers/glcaps.cpp | 117
wrappers/gltrace.hpp | 23
wrappers/gltrace.py | 474
wrappers/gltrace_state.cpp | 9
wrappers/glxtrace.py | 2
wrappers/glxtrace.version | 9
wrappers/trace.py | 264
wrappers/wgltrace.py | 29
399 files changed, 35506 insertions(+), 18490 deletions(-)
New commits:
commit 62ad71c6b6f770cd4ecc96f3a842cbf63c8bdc6c
Author: Seth Berrier <berriers@uwstout.edu>
Date: Fri Jun 26 07:20:04 2015 +0100
glretrace: Don't force GPU durations to zero.
Fixes #359.
diff --git a/common/trace_profiler.cpp b/common/trace_profiler.cpp
index b765340..65c91aa 100644
--- a/common/trace_profiler.cpp
+++ b/common/trace_profiler.cpp
@@ -116,7 +116,6 @@ void Profiler::addCall(unsigned no,
gpuStart -= baseGpuTime;
} else {
gpuStart = 0;
- gpuDuration = 0;
}
if (cpuTimes && cpuStart) {
commit 0a749b6475889d1f7db8da4385c77aadfe5b06d5
Author: Jose Fonseca <jfonseca@vmware.com>
Date: Thu Jun 25 15:52:05 2015 +0100
glretrace: Workaround unusable GL_TIMESTAMP on Mac.
Fixes #359.
diff --git a/retrace/glretrace_main.cpp b/retrace/glretrace_main.cpp
index b02864f..ddb647e 100755
--- a/retrace/glretrace_main.cpp
+++ b/retrace/glretrace_main.cpp
@@ -374,6 +374,12 @@ initContext() {
supportsDebugOutput = currentContext->hasExtension("GL_ARB_debug_output");
supportsARBShaderObjects = currentContext->hasExtension("GL_ARB_shader_objects");
+#ifdef __APPLE__
+ // GL_TIMESTAMP doesn't work on Apple. GL_TIME_ELAPSED still does however.
+ // http://lists.apple.com/archives/mac-opengl/2014/Nov/threads.html#00001
+ supportsTimestamp = false;
+#endif
+
/* Check for timer query support */
if (retrace::profilingGpuTimes) {
if (!supportsTimestamp && !supportsElapsed) {
commit 04036909c0b0ffe0f49b1127e9d3693b4431eca7
Author: Jose Fonseca <jfonseca@vmware.com>
Date: Thu Jun 25 15:51:04 2015 +0100
specs: Add type info for GL_TIMESTAMP.
diff --git a/specs/glparams.py b/specs/glparams.py
index 4636083..ad48a83 100644
--- a/specs/glparams.py
+++ b/specs/glparams.py
@@ -2802,7 +2802,7 @@ parameters = [
("glGet", I, 1, "GL_TRANSFORM_FEEDBACK_BINDING"), # 0x8E25
("", X, 1, "GL_FRAME_NV"), # 0x8E26
("", X, 1, "GL_FIELDS_NV"), # 0x8E27
- ("", X, 1, "GL_TIMESTAMP"), # 0x8E28
+ ("_glGet", I64, 1, "GL_TIMESTAMP"), # 0x8E28
("", X, 1, "GL_NUM_FILL_STREAMS_NV"), # 0x8E29
("", X, 1, "GL_PRESENT_TIME_NV"), # 0x8E2A
("", X, 1, "GL_PRESENT_DURATION_NV"), # 0x8E2B
commit 5cd0ac50972bc8be658bb5315ff191afccb65aea
Author: Jose Fonseca <jfonseca@vmware.com>
Date: Thu Jun 25 14:36:10 2015 +0100
glretrace: Improve GL_ARB_timer_query support detection.
Was part of core in GL_ARB_timer_query.
diff --git a/retrace/glretrace_main.cpp b/retrace/glretrace_main.cpp
index 48c214a..b02864f 100755
--- a/retrace/glretrace_main.cpp
+++ b/retrace/glretrace_main.cpp
@@ -367,7 +367,8 @@ initContext() {
}
/* Ensure we have adequate extension support */
- supportsTimestamp = currentContext->hasExtension("GL_ARB_timer_query");
+ supportsTimestamp = currentProfile.versionGreaterOrEqual(glprofile::API_GL, 3, 3) ||
+ currentContext->hasExtension("GL_ARB_timer_query");
supportsElapsed = currentContext->hasExtension("GL_EXT_timer_query") || supportsTimestamp;
supportsOcclusion = currentProfile.versionGreaterOrEqual(glprofile::API_GL, 1, 5);
supportsDebugOutput = currentContext->hasExtension("GL_ARB_debug_output");
commit 1b685b0bb3a33b7b9eac254b4c4172903ef2eb38
Author: Jose Fonseca <jfonseca@vmware.com>
Date: Wed Jun 17 21:57:41 2015 +0100
common: Use GetModuleHandle to detect WINE.
Simpler and safer.
diff --git a/common/highlight.cpp b/common/highlight.cpp
index 6a1e783..334ba57 100644
--- a/common/highlight.cpp
+++ b/common/highlight.cpp
@@ -254,10 +254,9 @@ haveAnsi(void)
}
// http://wiki.winehq.org/DeveloperFaq#detect-wine
- HMODULE hNtDll = LoadLibraryA("ntdll");
+ HMODULE hNtDll = GetModuleHandleA("ntdll");
if (hNtDll) {
result = GetProcAddress(hNtDll, "wine_get_version") != NULL;
- FreeLibrary(hNtDll);
}
checked = true;
commit 1d46c903de4562a9b24a602ac7b6d3ef281e28d6
Author: Jose Fonseca <jfonseca@vmware.com>
Date: Tue Jun 16 15:51:53 2015 +0100
retrace: Remove duplicate "warning: " from warning message.
diff --git a/retrace/retrace_swizzle.cpp b/retrace/retrace_swizzle.cpp
index 1a3544f..ce89276 100644
--- a/retrace/retrace_swizzle.cpp
+++ b/retrace/retrace_swizzle.cpp
@@ -133,7 +133,7 @@ addRegion(trace::Call &call, unsigned long long address, void *buffer, unsigned
regionMap.erase(start, stop);
} else {
for (RegionMap::iterator it = start; it != stop; ++it) {
- warning(call) << "warning: " << std::hex <<
+ warning(call) << std::hex <<
"region 0x" << address << "-0x" << (address + size) << " "
"intersects existing region 0x" << it->first << "-0x" << (it->first + it->second.size) << "\n" << std::dec;
assert(intersects(it, address, size));
commit 53ea8108dd795a58b3a147e56a92afd21dc145f1
Author: Jose Fonseca <jfonseca@vmware.com>
Date: Thu Jun 25 14:28:09 2015 +0100
glretrace: Fix occlusion query support detection.
GL_ARB_occlusion_query was made part of core OpenGL 1.5. Furthermore we
don't use the *ARB entry-points, so we really rely on the core support.
Futhermore, on Mac OS, core 3.2+ profiles do not list core extensions,
so we were wrongly assuming it was missing.
Fixes #358.
diff --git a/helpers/glprofile.hpp b/helpers/glprofile.hpp
index be2a111..397777d 100644
--- a/helpers/glprofile.hpp
+++ b/helpers/glprofile.hpp
@@ -84,6 +84,11 @@ struct Profile {
(major == refMajor && minor >= refMinor);
}
+ inline bool
+ versionGreaterOrEqual(Api refApi, unsigned refMajor, unsigned refMinor) const {
+ return api == refApi && versionGreaterOrEqual(refMajor, refMinor);
+ }
+
bool
matches(const Profile expected) const;
diff --git a/retrace/glretrace_main.cpp b/retrace/glretrace_main.cpp
index 599ebed..48c214a 100755
--- a/retrace/glretrace_main.cpp
+++ b/retrace/glretrace_main.cpp
@@ -369,7 +369,7 @@ initContext() {
/* Ensure we have adequate extension support */
supportsTimestamp = currentContext->hasExtension("GL_ARB_timer_query");
supportsElapsed = currentContext->hasExtension("GL_EXT_timer_query") || supportsTimestamp;
- supportsOcclusion = currentContext->hasExtension("GL_ARB_occlusion_query");
+ supportsOcclusion = currentProfile.versionGreaterOrEqual(glprofile::API_GL, 1, 5);
supportsDebugOutput = currentContext->hasExtension("GL_ARB_debug_output");
supportsARBShaderObjects = currentContext->hasExtension("GL_ARB_shader_objects");
commit d1f3582d14a1a496c248262ed873de34ab47bb58
Author: Jose Fonseca <jfonseca@vmware.com>
Date: Thu Jun 25 13:31:09 2015 +0100
glstate: Support more texture buffer formats.
diff --git a/retrace/glstate_formats.cpp b/retrace/glstate_formats.cpp
index b784b8c..b07bd68 100644
--- a/retrace/glstate_formats.cpp
+++ b/retrace/glstate_formats.cpp
@@ -29,6 +29,8 @@
#include <assert.h>
#include <iostream>
+#include <limits>
+#include <type_traits>
#include "glsize.hpp"
#include "glstate.hpp"
@@ -65,6 +67,7 @@ formatToString(GLenum internalFormat) {
static const InternalFormatDesc
internalFormatDescs[] = {
+ // GLenum internalFormat, GLenum format, GLenum type, GLenum readType
// Unsized UNORM
{ 1, GL_RED, GL_NONE, GL_UNSIGNED_BYTE },
@@ -416,4 +419,244 @@ getImageFormat(GLenum format, GLenum type,
}
+// Macros for describing arbitrary swizzles
+
+#define SWIZZLE_X 0
+#define SWIZZLE_Y 1
+#define SWIZZLE_Z 2
+#define SWIZZLE_W 3
+#define SWIZZLE_0 4
+#define SWIZZLE_1 5
+#define SWIZZLE_COUNT 6
+
+#define SWIZZLE_BITS 4
+#define SWIZZLE_MASK ((1 << SWIZZLE_BITS) - 1)
+
+#define SWIZZLE(x, y, z, w) \
+ (((SWIZZLE_##x) << (SWIZZLE_BITS*0)) | \
+ ((SWIZZLE_##y) << (SWIZZLE_BITS*1)) | \
+ ((SWIZZLE_##z) << (SWIZZLE_BITS*2)) | \
+ ((SWIZZLE_##w) << (SWIZZLE_BITS*3)))
+
+#define SWIZZLE_RGBA SWIZZLE(X,Y,Z,W)
+#define SWIZZLE_RGB SWIZZLE(X,Y,Z,1)
+#define SWIZZLE_RG SWIZZLE(X,Y,0,1)
+#define SWIZZLE_R SWIZZLE(X,0,0,1)
+#define SWIZZLE_LA SWIZZLE(X,X,X,Y)
+#define SWIZZLE_L SWIZZLE(X,X,X,1)
+#define SWIZZLE_A SWIZZLE(0,0,0,X)
+#define SWIZZLE_I SWIZZLE(X,X,X,X)
+
+#define SWIZZLE_EXTRACT(swizzle, channel) \
+ ((swizzle) >> (SWIZZLE_BITS * (channel)) & SWIZZLE_MASK)
+
+
+// Template that can describe all regular array-based pixel formats
+template< typename Type, unsigned components, bool normalized, uint16_t swizzle >
+class PixelTemplate : public PixelFormat
+{
+protected:
+
+ static_assert( 1 <= components && components <= 4, "invalid number of components" );
+
+ static const unsigned swizzle_r = SWIZZLE_EXTRACT(swizzle, 0);
+ static const unsigned swizzle_g = SWIZZLE_EXTRACT(swizzle, 1);
+ static const unsigned swizzle_b = SWIZZLE_EXTRACT(swizzle, 2);
+ static const unsigned swizzle_a = SWIZZLE_EXTRACT(swizzle, 3);
+
+ static_assert( swizzle_r < components || swizzle_r == SWIZZLE_0 || swizzle_r == SWIZZLE_1, "invalid R swizzle" );
+ static_assert( swizzle_g < components || swizzle_g == SWIZZLE_0 || swizzle_g == SWIZZLE_1, "invalid G swizzle" );
+ static_assert( swizzle_b < components || swizzle_b == SWIZZLE_0 || swizzle_b == SWIZZLE_1, "invalid B swizzle" );
+ static_assert( swizzle_a < components || swizzle_a == SWIZZLE_0 || swizzle_a == SWIZZLE_1, "invalid A swizzle" );
+
+ // We must use double precision intermediate values when normalizing 32bits integers.
+ typedef typename std::conditional< normalized && sizeof(Type) >= 4 , double , float >::type Scale;
+
+ // Scale normalized types
+ template<typename T = void>
+ static inline Scale
+ scale(Scale value, typename std::enable_if<normalized, T>::type* = 0)
+ {
+ static_assert( normalized, "should only be instantiated for normalized types" );
+#ifndef _MSC_VER
+ static constexpr Type typeMax = std::numeric_limits<Type>::max();
+ static_assert( static_cast<Type>(static_cast<Scale>(typeMax)) == typeMax,
+ "intermediate type cannot represent maximum value without loss of precission" );
+ static constexpr Scale scaleFactor = Scale(1) / Scale(typeMax);
+ static_assert( Scale(typeMax) * scaleFactor == Scale(1), "cannot represent unity" );
+ static_assert( Scale(0) * scaleFactor == Scale(0), "cannot represent zero" );
+#else
+ // XXX: MSCV doesn't support constexpr yet
+ static const Type typeMax = std::numeric_limits<Type>::max();
+ assert( static_cast<Type>(static_cast<Scale>(typeMax)) == typeMax );
+ static const Scale scaleFactor = Scale(1) / Scale(typeMax);
+ assert( Scale(typeMax) * scaleFactor == Scale(1) );
+ assert( Scale(0) * scaleFactor == Scale(0) );
+#endif
+ return value * scaleFactor;
+ }
+
+ // No-op for unormalized types
+ template<typename T = void>
+ static inline Scale
+ scale(Scale value, typename std::enable_if<!normalized, T>::type* = 0)
+ {
+ static_assert( !normalized, "should only be instantiated for non-normalized types" );
+ return value;
+ }
+
+ // Unpack a single pixel
+ static inline void
+ unpackPixel(const Type *inPixel, float outPixel[4])
+ {
+ float scaledComponents[SWIZZLE_COUNT];
+ for (unsigned component = 0; component < components; ++component) {
+ Scale scaledComponent = scale(static_cast<Scale>(inPixel[component]));
+ scaledComponents[component] = static_cast<float>(scaledComponent);
+ }
+ scaledComponents[SWIZZLE_0] = 0.0f;
+ scaledComponents[SWIZZLE_1] = 1.0f;
+
+ outPixel[0] = scaledComponents[swizzle_r];
+ outPixel[1] = scaledComponents[swizzle_g];
+ outPixel[2] = scaledComponents[swizzle_b];
+ outPixel[3] = scaledComponents[swizzle_a];
+ }
+
+public:
+
+ inline
+ PixelTemplate(void) {
+ }
+
+ size_t
+ size(void) const {
+ return sizeof(Type) * components;
+ }
+
+ void
+ unpackSpan(const uint8_t *inSpan, float *outSpan, unsigned width) const
+ {
+ const Type *inPixel = reinterpret_cast<const Type *>(inSpan);
+
+ for (unsigned x = 0; x < width; ++x) {
+ unpackPixel(inPixel, outSpan);
+ inPixel += components;
+ outSpan += 4;
+ }
+ }
+};
+
+
+const PixelFormat *
+getPixelFormat(GLenum internalFormat)
+{
+ static const bool Y = true;
+ static const bool N = false;
+
+#define CASE(internalFormat, type, components, norm, swizzle) \
+ case GL_##internalFormat: \
+ { \
+ static const PixelTemplate< GL##type, components, norm, SWIZZLE_##swizzle > pixel; \
+ return &pixel; \
+ }
+
+ switch (internalFormat) {
+
+ CASE(ALPHA8, ubyte, 1, Y, A);
+ CASE(ALPHA16, ushort, 1, Y, A);
+ CASE(ALPHA16F_ARB, half, 1, N, A);
+ CASE(ALPHA32F_ARB, float, 1, N, A);
+ CASE(ALPHA8I_EXT, byte, 1, N, A);
+ CASE(ALPHA16I_EXT, short, 1, N, A);
+ CASE(ALPHA32I_EXT, int, 1, N, A);
+ CASE(ALPHA8UI_EXT, ubyte, 1, N, A);
+ CASE(ALPHA16UI_EXT, ushort, 1, N, A);
+ CASE(ALPHA32UI_EXT, uint, 1, N, A);
+
+ CASE(LUMINANCE8, ubyte, 1, Y, L);
+ CASE(LUMINANCE16, ushort, 1, Y, L);
+ CASE(LUMINANCE16F_ARB, half, 1, N, L);
+ CASE(LUMINANCE32F_ARB, float, 1, N, L);
+ CASE(LUMINANCE8I_EXT, byte, 1, N, L);
+ CASE(LUMINANCE16I_EXT, short, 1, N, L);
+ CASE(LUMINANCE32I_EXT, int, 1, N, L);
+ CASE(LUMINANCE8UI_EXT, ubyte, 1, N, L);
+ CASE(LUMINANCE16UI_EXT, ushort, 1, N, L);
+ CASE(LUMINANCE32UI_EXT, uint, 1, N, L);
+
+ CASE(LUMINANCE8_ALPHA8, ubyte, 2, Y, LA);
+ CASE(LUMINANCE16_ALPHA16, ushort, 2, Y, LA);
+ CASE(LUMINANCE_ALPHA16F_ARB, half, 2, N, LA);
+ CASE(LUMINANCE_ALPHA32F_ARB, float, 2, N, LA);
+ CASE(LUMINANCE_ALPHA8I_EXT, byte, 2, N, LA);
+ CASE(LUMINANCE_ALPHA16I_EXT, short, 2, N, LA);
+ CASE(LUMINANCE_ALPHA32I_EXT, int, 2, N, LA);
+ CASE(LUMINANCE_ALPHA8UI_EXT, ubyte, 2, N, LA);
+ CASE(LUMINANCE_ALPHA16UI_EXT, ushort, 2, N, LA);
+ CASE(LUMINANCE_ALPHA32UI_EXT, uint, 2, N, LA);
+
+ CASE(INTENSITY8, ubyte, 1, Y, I);
+ CASE(INTENSITY16, ushort, 1, Y, I);
+ CASE(INTENSITY16F_ARB, half, 1, N, I);
+ CASE(INTENSITY32F_ARB, float, 1, N, I);
+ CASE(INTENSITY8I_EXT, byte, 1, N, I);
+ CASE(INTENSITY16I_EXT, short, 1, N, I);
+ CASE(INTENSITY32I_EXT, int, 1, N, I);
+ CASE(INTENSITY8UI_EXT, ubyte, 1, N, I);
+ CASE(INTENSITY16UI_EXT, ushort, 1, N, I);
+ CASE(INTENSITY32UI_EXT, uint, 1, N, I);
+
+ CASE(RGBA8, ubyte, 4, Y, RGBA);
+ CASE(RGBA16, ushort, 4, Y, RGBA);
+ CASE(RGBA16F, half, 4, N, RGBA);
+ CASE(RGBA32F, float, 4, N, RGBA);
+ CASE(RGBA8I, byte, 4, N, RGBA);
+ CASE(RGBA16I, short, 4, N, RGBA);
+ CASE(RGBA32I, int, 4, N, RGBA);
+ CASE(RGBA8UI, ubyte, 4, N, RGBA);
+ CASE(RGBA16UI, ushort, 4, N, RGBA);
+ CASE(RGBA32UI, uint, 4, N, RGBA);
+
+ CASE(RGB8, ubyte, 3, Y, RGB);
+ CASE(RGB16, ushort, 3, Y, RGB);
+ CASE(RGB16F, half, 3, N, RGB);
+ CASE(RGB32F, float, 3, N, RGB);
+ CASE(RGB8I, byte, 3, N, RGB);
+ CASE(RGB16I, short, 3, N, RGB);
+ CASE(RGB32I, int, 3, N, RGB);
+ CASE(RGB8UI, ubyte, 3, N, RGB);
+ CASE(RGB16UI, ushort, 3, N, RGB);
+ CASE(RGB32UI, uint, 3, N, RGB);
+
+ CASE(RG8, ubyte, 2, Y, RG);
+ CASE(RG16, ushort, 2, Y, RG);
+ CASE(RG16F, half, 2, N, RG);
+ CASE(RG32F, float, 2, N, RG);
+ CASE(RG8I, byte, 2, N, RG);
+ CASE(RG16I, short, 2, N, RG);
+ CASE(RG32I, int, 2, N, RG);
+ CASE(RG8UI, ubyte, 2, N, RG);
+ CASE(RG16UI, ushort, 2, N, RG);
+ CASE(RG32UI, uint, 2, N, RG);
+
+ CASE(R8, ubyte, 1, Y, R);
+ CASE(R16, ushort, 1, Y, R);
+ CASE(R16F, half, 1, N, R);
+ CASE(R32F, float, 1, N, R);
+ CASE(R8I, byte, 1, N, R);
+ CASE(R16I, short, 1, N, R);
+ CASE(R32I, int, 1, N, R);
+ CASE(R8UI, ubyte, 1, N, R);
+ CASE(R16UI, ushort, 1, N, R);
+ CASE(R32UI, uint, 1, N, R);
+
+ default:
+ return nullptr;
+ }
+
+#undef CASE
+}
+
+
} /* namespace glstate */
diff --git a/retrace/glstate_images.cpp b/retrace/glstate_images.cpp
index 19ff35f..c111efa 100644
--- a/retrace/glstate_images.cpp
+++ b/retrace/glstate_images.cpp
@@ -441,15 +441,21 @@ dumpActiveTextureLevel(StateWriter &writer, Context &context,
const InternalFormatDesc &formatDesc = getInternalFormatDesc(desc.internalFormat);
- if (target == GL_TEXTURE_BUFFER && formatDesc.type != GL_UNSIGNED_BYTE) {
- // FIXME: We rely on glGetTexImage to convert the pixels, but we can't use it with texture buffers.
- std::cerr << "warning: unsupported texture buffer internal format " << formatToString(desc.internalFormat) << "\n";
- return;
- }
-
GLenum format;
GLenum type;
- chooseReadBackFormat(formatDesc, format, type);
+ const PixelFormat *pixelFormat = nullptr;
+
+ if (target == GL_TEXTURE_BUFFER) {
+ pixelFormat = getPixelFormat(desc.internalFormat);
+ if (!pixelFormat) {
+ std::cerr << "warning: unsupported texture buffer internal format " << formatToString(desc.internalFormat) << "\n";
+ return;
+ }
+ format = GL_RGBA;
+ type = GL_FLOAT;
+ } else {
+ chooseReadBackFormat(formatDesc, format, type);
+ }
writer.beginMember(label);
@@ -473,7 +479,11 @@ dumpActiveTextureLevel(StateWriter &writer, Context &context,
if (target == GL_TEXTURE_BUFFER) {
assert(desc.height == 1);
- assert(type == GL_UNSIGNED_BYTE);
+ assert(desc.depth == 1);
+ assert(pixelFormat);
+ assert(format == GL_RGBA);
+ assert(type == GL_FLOAT);
+ assert(image->bytesPerPixel == sizeof(float[4]));
GLint buffer = 0;
glGetIntegerv(GL_TEXTURE_BUFFER_DATA_STORE_BINDING, &buffer);
@@ -483,7 +493,8 @@ dumpActiveTextureLevel(StateWriter &writer, Context &context,
const GLvoid *map = bm.map(GL_TEXTURE_BUFFER, buffer);
if (map) {
- memcpy(image->pixels, map, image->width * image->bytesPerPixel);
+ pixelFormat->unpackSpan(static_cast<const uint8_t *>(map),
+ reinterpret_cast<float *>(image->pixels), image->width);
}
} else {
if (context.ES) {
diff --git a/retrace/glstate_internal.hpp b/retrace/glstate_internal.hpp
index 18c7147..3302a81 100644
--- a/retrace/glstate_internal.hpp
+++ b/retrace/glstate_internal.hpp
@@ -26,6 +26,8 @@
#pragma once
+#include <stdint.h>
+
#include "glimports.hpp"
#include "glproc.hpp"
#include "image.hpp"
@@ -110,6 +112,26 @@ getImageFormat(GLenum format, GLenum type,
GLuint &channels, image::ChannelType &channelType);
+// Abstract base class for pixel format conversion
+class PixelFormat
+{
+public:
+ virtual ~PixelFormat() {}
+
+ // Size in bytes
+ virtual size_t
+ size(void) const = 0;
+
+ // Unpack a span of pixels
+ virtual void
+ unpackSpan(const uint8_t *inSpan, float *outSpan, unsigned width) const = 0;
+};
+
+
+const PixelFormat *
+getPixelFormat(GLenum internalFormat);
+
+
/**
* Helper class to temporarily bind a buffer to the specified target until
* control leaves the declaration scope.
commit 84eac2523370fab8f92beef21cf9f2743060c85e
Author: Jose Fonseca <jfonseca@vmware.com>
Date: Thu Jun 25 12:34:43 2015 +0100
d3dretrace: Dont retrace GetDC/ReleaseDC.
diff --git a/specs/d3d9.py b/specs/d3d9.py
index c98c7f2..2101514 100644
--- a/specs/d3d9.py
+++ b/specs/d3d9.py
@@ -363,8 +363,8 @@ IDirect3DSurface9.methods += [
StdMethod(HRESULT, "GetDesc", [Out(Pointer(D3DSURFACE_DESC), "pDesc")], sideeffects=False),
StdMethod(HRESULT, "LockRect", [Out(Pointer(D3DLOCKED_RECT), "pLockedRect"), (ConstPointer(RECT), "pRect"), (D3DLOCK, "Flags")]),
StdMethod(HRESULT, "UnlockRect", []),
- StdMethod(HRESULT, "GetDC", [Out(Pointer(HDC), "phdc")]),
- StdMethod(HRESULT, "ReleaseDC", [(HDC, "hdc")]),
+ StdMethod(HRESULT, "GetDC", [Out(Pointer(HDC), "phdc")], sideeffects=False),
+ StdMethod(HRESULT, "ReleaseDC", [(HDC, "hdc")], sideeffects=False),
]
IDirect3DVolume9.methods += [
commit 5642f6578ec8ebcc73e1b9aa3826d37010a5b7ce
Author: Jose Fonseca <jfonseca@vmware.com>
Date: Wed Jun 24 11:33:26 2015 +0100
cli/sed: Avoid strcpy.
diff --git a/cli/cli_sed.cpp b/cli/cli_sed.cpp
index 1ad035b..401b7a6 100644
--- a/cli/cli_sed.cpp
+++ b/cli/cli_sed.cpp
@@ -108,9 +108,10 @@ public:
void visit(String *node) {
if (!searchName.compare(node->value)) {
+ size_t len = replaceName.length() + 1;
delete [] node->value;
- char *str = new char [replaceName.length() + 1];
- strcpy(str, replaceName.c_str());
+ char *str = new char [len];
+ memcpy(str, replaceName.c_str(), len);
node->value = str;
}
}
commit 8b0807fc98700fdaf69ed880eab416e43194f219
Author: Jose Fonseca <jfonseca@vmware.com>
Date: Wed Jun 24 11:29:01 2015 +0100
Reply to: