Category Archives: API

Auto Added by WPeMatico

Windows 10 SDK Preview Build 17046 now available

Today, we released a new Windows 10 Preview Build of the SDK to be used in conjunction with Windows 10 Insider Preview (Build 17046 or greater). The Preview SDK Build 17046 contains bug fixes and under development changes to the API surface area.
The Preview SDK can be downloaded from developer section on Windows Insider.
For feedback and updates to the known issues, please see the developer forum. For new developer feature requests, head over to our Windows Platform UserVoice.
Things to note:
This build works in conjunction with previously released SDKs and Visual Studio 2017. You can install this SDK and still also continue to submit your apps that target Windows 10 Creators build or earlier to the store.
The Windows SDK will now formally only be supported by Visual Studio 2017 and greater. You can download the Visual Studio 2017 here.
Known Issues
“All tests run with Windows App Certification Kit will fail. During installation, please uncheck Windows App Certification Kit”

Installation on an operating system that is not a Windows 10 Insider Preview build is not supported and may fail.
What’s New:
C++/WinRT Now Available:
The C++/WinRT headers and cppwinrt compiler (cppwinrt.exe) are now included in the Windows SDK. The compiler comes in handy if you need to consume a third-party WinRT component or if you need to author your own WinRT components with C++/WinRT. The easiest way to get working with it after installing the Windows Insider Preview SDK is to start the Visual Studio Developer Command Prompt and run the compiler in that environment. Authoring support is currently experimental and subject to change. Stay tuned as we will publish more detailed instructions on how to use the compiler in the coming week.The ModernCPP blog has a deeper dive into the CppWinRT compiler. Please give us feedback by creating an issue at: https://github.com/microsoft/cppwinrt.
Breaking Changes
New MIDL key words.
As a part of the “modernizing IDL” effort, several new keywords are added to the midlrt tool. These new keywords will cause build breaks if they are encountered in IDL files.
The new keywords are:
event
set
get
partial
unsealed
overridable
protected
importwinmd
If any of these keywords is used as an identifier, it will generate a build failure indicating a syntax error.
The error will be similar to:
1 >d:ossrconecorecomcombaseunittestastatestserverstestserver6idlremreleasetest.idl(12) : error MIDL2025 : [msg]syntax error [context]: expecting a declarator or * near “)”
To fix this, modify the identifier in error to an “@” prefix in front of the identifier. That will cause MIDL to treat the offending element as an identifier instead of a keyword.
API Updates and Additions
When targeting new APIs, consider writing your app to be adaptive in order to run correctly on the widest number of Windows 10 devices. Please see Dynamically detecting features with API contracts (10 by 10) for more information.
The following APIs have been added to the platform since the release of 16299.

namespace Windows.ApplicationModel {
public enum StartupTaskState {
EnabledByPolicy = 4,
}
}
namespace Windows.ApplicationModel.Background {
public sealed class MobileBroadbandPcoDataChangeTrigger : IBackgroundTrigger
public sealed class TetheringEntitlementCheckTrigger : IBackgroundTrigger
}
namespace Windows.ApplicationModel.Calls {
public enum PhoneCallMedia {
AudioAndRealTimeText = 2,
}
public sealed class VoipCallCoordinator {
VoipPhoneCall RequestNewAppInitiatedCall(string context, string contactName, string contactNumber, string serviceName, VoipPhoneCallMedia media);
VoipPhoneCall RequestNewIncomingCall(string context, string contactName, string contactNumber, Uri contactImage, string serviceName, Uri brandingImage, string callDetails, Uri ringtone, VoipPhoneCallMedia media, TimeSpan ringTimeout, string contactRemoteId);
}
public sealed class VoipPhoneCall {
void NotifyCallAccepted(VoipPhoneCallMedia media);
}
}
namespace Windows.ApplicationModel.Chat {
public sealed class RcsManagerChangedEventArgs
public enum RcsManagerChangeType
public sealed class RcsNotificationManager
}
namespace Windows.ApplicationModel.Store.Preview.InstallControl {
public sealed class AppInstallManager {
IAsyncOperation<IVectorView<AppInstallItem>> SearchForAllUpdatesAsync(string correlationVector, string clientId, AppUpdateOptions updateOptions);
IAsyncOperation<IVectorView<AppInstallItem>> SearchForAllUpdatesForUserAsync(User user, string correlationVector, string clientId, AppUpdateOptions updateOptions);
IAsyncOperation<AppInstallItem> SearchForUpdatesAsync(string productId, string skuId, string correlationVector, string clientId, AppUpdateOptions updateOptions);
IAsyncOperation<AppInstallItem> SearchForUpdatesForUserAsync(User user, string productId, string skuId, string correlationVector, string clientId, AppUpdateOptions updateOptions);
IAsyncOperation<IVectorView<AppInstallItem>> StartProductInstallAsync(string productId, string flightId, string clientId, string correlationVector, AppInstallOptions installOptions);
IAsyncOperation<IVectorView<AppInstallItem>> StartProductInstallForUserAsync(User user, string productId, string flightId, string clientId, string correlationVector, AppInstallOptions installOptions);
}
public sealed class AppInstallOptions
public sealed class AppInstallStatus {
bool IsStaged { get; }
}
public sealed class AppUpdateOptions
}
namespace Windows.ApplicationModel.UserActivities {
public sealed class UserActivity {
public UserActivity(string activityId);
}
public sealed class UserActivityChannel {
public static void DisableAutoSessionCreation();
}
public sealed class UserActivityVisualElements {
string AttributionDisplayText { get; set; }
}
}
namespace Windows.Devices.PointOfService {
public sealed class BarcodeScannerReport {
public BarcodeScannerReport(uint scanDataType, IBuffer scanData, IBuffer scanDataLabel);
}
public sealed class ClaimedBarcodeScanner : IClosable {
bool IsVideoPreviewShownOnEnable { get; set; }
void HideVideoPreview();
IAsyncOperation<bool> ShowVideoPreviewAsync();
}
public sealed class UnifiedPosErrorData {
public UnifiedPosErrorData(string message, UnifiedPosErrorSeverity severity, UnifiedPosErrorReason reason, uint extendedReason);
}
}
namespace Windows.Devices.PointOfService.Provider {
public sealed class BarcodeScannerDisableScannerRequest
public sealed class BarcodeScannerDisableScannerRequestEventArgs
public sealed class BarcodeScannerEnableScannerRequest
public sealed class BarcodeScannerEnableScannerRequestEventArgs
public sealed class BarcodeScannerGetSymbologyAttributesRequest
public sealed class BarcodeScannerGetSymbologyAttributesRequestEventArgs
public sealed class BarcodeScannerHideVideoPreviewRequest
public sealed class BarcodeScannerHideVideoPreviewRequestEventArgs
public sealed class BarcodeScannerProviderConnection : IClosable
public sealed class BarcodeScannerProviderTriggerDetails
public sealed class BarcodeScannerSetActiveSymbologiesRequest
public sealed class BarcodeScannerSetActiveSymbologiesRequestEventArgs
public sealed class BarcodeScannerSetSymbologyAttributesRequest
public sealed class BarcodeScannerSetSymbologyAttributesRequestEventArgs
public sealed class BarcodeScannerStartSoftwareTriggerRequest
public sealed class BarcodeScannerStartSoftwareTriggerRequestEventArgs
public sealed class BarcodeScannerStopSoftwareTriggerRequest
public sealed class BarcodeScannerStopSoftwareTriggerRequestEventArgs
public enum BarcodeScannerTriggerState
public sealed class BarcodeSymbologyAttributesBuilder
}
namespace Windows.Globalization {
public static class ApplicationLanguages {
public static IVectorView<string> GetLanguagesForUser(User user);
}
public sealed class Language {
LanguageLayoutDirection LayoutDirection { get; }
}
public enum LanguageLayoutDirection
}
namespace Windows.Graphics.Imaging {
public enum BitmapPixelFormat {
P010 = 104,
}
}
namespace Windows.Management.Deployment {
public sealed class PackageManager {
IAsyncOperationWithProgress<DeploymentResult, DeploymentProgress> RequestAddPackageAsync(Uri packageUri, IIterable<Uri> dependencyPackageUris, DeploymentOptions deploymentOptions, PackageVolume targetVolume, IIterable<string> optionalPackageFamilyNames, IIterable<Uri> relatedPackageUris, IIterable<Uri> packageUrisToInstall);
}
}
namespace Windows.Media.Audio {
public sealed class AudioGraph : IClosable {
IAsyncOperation<CreateMediaSourceAudioInputNodeResult> CreateMediaSourceAudioInputNodeAsync(MediaSource mediaSource);
IAsyncOperation<CreateMediaSourceAudioInputNodeResult> CreateMediaSourceAudioInputNodeAsync(MediaSource mediaSource, AudioNodeEmitter emitter);
}
public sealed class AudioGraphSettings {
double MaxPlaybackSpeedFactor { get; set; }
}
public sealed class AudioStateMonitor
public sealed class CreateMediaSourceAudioInputNodeResult
public sealed class MediaSourceAudioInputNode : IAudioInputNode, IAudioInputNode2, IAudioNode, IClosable
public enum MediaSourceAudioInputNodeCreationStatus
}
namespace Windows.Media.Capture {
public sealed class CapturedFrame : IClosable, IContentTypeProvider, IInputStream, IOutputStream, IRandomAccessStream, IRandomAccessStreamWithContentType {
BitmapPropertySet BitmapProperties { get; }
CapturedFrameControlValues ControlValues { get; }
}
public enum KnownVideoProfile {
HdrWithWcgPhoto = 8,
HdrWithWcgVideo = 7,
HighFrameRate = 5,
VariablePhotoSequence = 6,
VideoHdr8 = 9,
}
public sealed class MediaCaptureSettings {
IDirect3DDevice Direct3D11Device { get; }
}
public sealed class MediaCaptureVideoProfile {
IVectorView<MediaFrameSourceInfo> FrameSourceInfos { get; }
IMapView<Guid, object> Properties { get; }
}
public sealed class MediaCaptureVideoProfileMediaDescription {
IMapView<Guid, object> Properties { get; }
string Subtype { get; }
}
}
namespace Windows.Media.Capture.Frames {
public sealed class AudioMediaFrame
public sealed class MediaFrameFormat {
AudioEncodingProperties AudioEncodingProperties { get; }
}
public sealed class MediaFrameReference : IClosable {
AudioMediaFrame AudioMediaFrame { get; }
}
public sealed class MediaFrameSourceController {
AudioDeviceController AudioDeviceController { get; }
}
public sealed class MediaFrameSourceInfo {
string ProfileId { get; }
IVectorView<MediaCaptureVideoProfileMediaDescription> VideoProfileMediaDescription { get; }
}
public enum MediaFrameSourceKind {
Audio = 4,
Image = 5,
}
}
namespace Windows.Media.Core {
public sealed class MediaBindingEventArgs {
void SetDownloadOperation(DownloadOperation downloadOperation);
}
public sealed class MediaSource : IClosable, IMediaPlaybackSource {
DownloadOperation DownloadOperation { get; }
public static MediaSource CreateFromDownloadOperation(DownloadOperation downloadOperation);
}
}
namespace Windows.Media.Devices {
public sealed class VideoDeviceController : IMediaDeviceController {
VideoTemporalDenoisingControl VideoTemporalDenoisingControl { get; }
}
public sealed class VideoTemporalDenoisingControl
public enum VideoTemporalDenoisingMode
}
namespace Windows.Media.DialProtocol {
public sealed class DialReceiverApp {
IAsyncOperation<string> GetUniqueDeviceNameAsync();
}
}
namespace Windows.Media.MediaProperties {
public static class MediaEncodingSubtypes {
public static string P010 { get; }
}
public enum MediaPixelFormat {
P010 = 2,
}
}
namespace Windows.Media.Playback {
public sealed class MediaPlaybackSession {
MediaRotation PlaybackRotation { get; set; }
MediaPlaybackSessionOutputDegradationPolicyState GetOutputDegradationPolicyState();
}
public sealed class MediaPlaybackSessionOutputDegradationPolicyState
public enum MediaPlaybackSessionVideoConstrictionReason
}
namespace Windows.Media.Streaming.Adaptive {
public sealed class AdaptiveMediaSourceDiagnosticAvailableEventArgs {
string ResourceContentType { get; }
IReference<TimeSpan> ResourceDuration { get; }
}
public sealed class AdaptiveMediaSourceDownloadCompletedEventArgs {
string ResourceContentType { get; }
IReference<TimeSpan> ResourceDuration { get; }
}
public sealed class AdaptiveMediaSourceDownloadFailedEventArgs {
string ResourceContentType { get; }
IReference<TimeSpan> ResourceDuration { get; }
}
public sealed class AdaptiveMediaSourceDownloadRequestedEventArgs {
string ResourceContentType { get; }
IReference<TimeSpan> ResourceDuration { get; }
}
}
namespace Windows.Networking.BackgroundTransfer {
public sealed class DownloadOperation : IBackgroundTransferOperation, IBackgroundTransferOperationPriority {
void MakeCurrentInTransferGroup();
}
public sealed class UploadOperation : IBackgroundTransferOperation, IBackgroundTransferOperationPriority {
void MakeCurrentInTransferGroup();
}
}
namespace Windows.Networking.Connectivity {
public sealed class CellularApnContext {
string ProfileName { get; set; }
}
public sealed class ConnectionProfileFilter {
IReference<Guid> PurposeGuid { get; set; }
}
public sealed class WwanConnectionProfileDetails {
WwanNetworkIPKind IPKind { get; }
IVectorView<Guid> PurposeGuids { get; }
}
public enum WwanNetworkIPKind
}
namespace Windows.Networking.NetworkOperators {
public sealed class MobileBroadbandAntennaSar {
public MobileBroadbandAntennaSar(int antennaIndex, int sarBackoffIndex);
}
public sealed class MobileBroadbandModem {
IAsyncOperation<MobileBroadbandPco> TryGetPcoAsync();
}
public sealed class MobileBroadbandModemIsolation
public sealed class MobileBroadbandPco
public sealed class MobileBroadbandPcoDataChangeTriggerDetails
public sealed class TetheringEntitlementCheckTriggerDetails
}
namespace Windows.Networking.Sockets {
public sealed class ServerMessageWebSocket : IClosable
public sealed class ServerMessageWebSocketControl
public sealed class ServerMessageWebSocketInformation
public sealed class ServerStreamWebSocket : IClosable
public sealed class ServerStreamWebSocketInformation
}
namespace Windows.Networking.Vpn {
public sealed class VpnNativeProfile : IVpnProfile {
string IDi { get; set; }
VpnPayloadIdType IdiType { get; set; }
string IDr { get; set; }
VpnPayloadIdType IdrType { get; set; }
bool IsImsConfig { get; set; }
string PCscf { get; }
}
public enum VpnPayloadIdType
}
namespace Windows.Security.Authentication.Identity.Provider {
public enum SecondaryAuthenticationFactorAuthenticationMessage {
CanceledByUser = 22,
CenterHand = 23,
ConnectionRequired = 20,
DeviceUnavaliable = 28,
MoveHandCloser = 24,
MoveHandFarther = 25,
PlaceHandAbove = 26,
RecognitionFailed = 27,
TimeLimitExceeded = 21,
}
}
namespace Windows.Services.Maps {
public sealed class MapRouteDrivingOptions {
IReference<DateTime> DepartureTime { get; set; }
}
public sealed class PlaceInfo {
public static PlaceInfo CreateFromAddress(string displayAddress);
public static PlaceInfo CreateFromAddress(string displayAddress, string displayName);
}
}
namespace Windows.Services.Store {
public sealed class StoreCanAcquireLicenseResult
public enum StoreCanLicenseStatus
public sealed class StoreContext {
bool CanSilentlyDownloadStorePackageUpdates { get; }
IAsyncOperation<StoreCanAcquireLicenseResult> CanAcquireStoreLicenseForOptionalPackageAsync(Package optionalPackage);
IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> TrySilentDownloadAndInstallStorePackageUpdatesAsync(IIterable<StorePackageUpdate> storePackageUpdates);
IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> TrySilentDownloadStorePackageUpdatesAsync(IIterable<StorePackageUpdate> storePackageUpdates);
}
}
namespace Windows.Storage.Provider {
public interface IStorageProviderUriSource
public enum StorageProviderResolveContentUriResult
}
namespace Windows.System {
public sealed class AppActivationResult
public sealed class AppDiagnosticInfo {
IAsyncOperation<AppActivationResult> ActivateAsync();
}
public sealed class AppResourceGroupInfo {
IAsyncOperation<bool> TryResumeAsync();
IAsyncOperation<bool> TrySuspendAsync();
IAsyncOperation<bool> TryTerminateAsync();
}
public sealed class User {
public static User GetDefault();
}
public enum UserType {
SystemManaged = 4,
}
}
namespace Windows.System.Diagnostics {
public sealed class DiagnosticInvoker {
IAsyncOperationWithProgress<DiagnosticActionResult, DiagnosticActionState> RunDiagnosticActionFromStringAsync(string context);
}
}
namespace Windows.System.Diagnostics.DevicePortal {
public sealed class DevicePortalConnection {
ServerMessageWebSocket GetServerMessageWebSocketForRequest(HttpRequestMessage request);
ServerMessageWebSocket GetServerMessageWebSocketForRequest(HttpRequestMessage request, SocketMessageType messageType, string protocol);
ServerMessageWebSocket GetServerMessageWebSocketForRequest(HttpRequestMessage request, SocketMessageType messageType, string protocol, uint outboundBufferSizeInBytes, uint maxMessageSize, MessageWebSocketReceiveMode receiveMode);
ServerStreamWebSocket GetServerStreamWebSocketForRequest(HttpRequestMessage request);
ServerStreamWebSocket GetServerStreamWebSocketForRequest(HttpRequestMessage request, string protocol, uint outboundBufferSizeInBytes, bool noDelay);
}
public sealed class DevicePortalConnectionRequestReceivedEventArgs {
bool IsWebSocketUpgradeRequest { get; }
IVectorView<string> WebSocketProtocolsRequested { get; }
Deferral GetDeferral();
}
}
namespace Windows.System.RemoteSystems {
public static class KnownRemoteSystemCapabilities {
public static string NearShare { get; }
}
}
namespace Windows.System.UserProfile {
public static class GlobalizationPreferences {
public static GlobalizationPreferencesForUser GetForUser(User user);
}
public sealed class GlobalizationPreferencesForUser
}
namespace Windows.UI.ApplicationSettings {
public sealed class AccountsSettingsPane {
public static IAsyncAction ShowAddAccountForUserAsync(User user);
public static IAsyncAction ShowManageAccountsForUserAsync(User user);
}
public sealed class AccountsSettingsPaneCommandsRequestedEventArgs {
User User { get; }
}
}
namespace Windows.UI.Composition {
public sealed class BounceScalarNaturalMotionAnimation : ScalarNaturalMotionAnimation
public sealed class BounceVector2NaturalMotionAnimation : Vector2NaturalMotionAnimation
public sealed class BounceVector3NaturalMotionAnimation : Vector3NaturalMotionAnimation
public class CompositionLight : CompositionObject {
bool IsEnabled { get; set; }
}
public sealed class Compositor : IClosable {
string Comment { get; set; }
BounceScalarNaturalMotionAnimation CreateBounceScalarAnimation();
BounceVector2NaturalMotionAnimation CreateBounceVector2Animation();
BounceVector3NaturalMotionAnimation CreateBounceVector3Animation();
}
public sealed class PointLight : CompositionLight {
Vector2 AttenuationCutoff { get; set; }
}
public sealed class SpotLight : CompositionLight {
Vector2 AttenuationCutoff { get; set; }
}
}
namespace Windows.UI.Composition.Core {
public sealed class CompositorController : IClosable
}
namespace Windows.UI.Composition.Desktop {
public sealed class HwndTarget : CompositionTarget
}
namespace Windows.UI.Input.Spatial {
public sealed class SpatialInteractionController {
BatteryReport TryGetBatteryReport();
}
}
namespace Windows.UI.Xaml {
public sealed class BringIntoViewOptions {
double HorizontalAlignmentRatio { get; set; }
double HorizontalOffset { get; set; }
double VerticalAlignmentRatio { get; set; }
double VerticalOffset { get; set; }
}
public sealed class BringIntoViewRequestedEventArgs : RoutedEventArgs
public sealed class EffectiveViewportChangedEventArgs
public enum FocusVisualKind {
Reveal = 2,
}
public class FrameworkElement : UIElement {
event TypedEventHandler<FrameworkElement, EffectiveViewportChangedEventArgs> EffectiveViewportChanged;
void InvalidateViewport();
virtual bool IsViewport();
}
public class UIElement : DependencyObject {
public static RoutedEvent BringIntoViewRequestedEvent { get; }
public static RoutedEvent ContextRequestedEvent { get; }
KeyboardAcceleratorPlacementMode KeyboardAcceleratorPlacementMode { get; set; }
public static DependencyProperty KeyboardAcceleratorPlacementModeProperty { get; }
DependencyObject KeyboardAcceleratorToolTipTarget { get; set; }
public static DependencyProperty KeyboardAcceleratorToolTipTargetProperty { get; }
DependencyObject KeyTipTarget { get; set; }
public static DependencyProperty KeyTipTargetProperty { get; }
event TypedEventHandler<UIElement, BringIntoViewRequestedEventArgs> BringIntoViewRequested;
virtual void OnBringIntoViewRequested(BringIntoViewRequestedEventArgs e);
virtual void OnKeyboardAcceleratorInvoked(KeyboardAcceleratorInvokedEventArgs args);
}
}
namespace Windows.UI.Xaml.Automation.Peers {
public sealed class AutoSuggestBoxAutomationPeer : FrameworkElementAutomationPeer, IInvokeProvider {
void Invoke();
}
public class CalendarDatePickerAutomationPeer : FrameworkElementAutomationPeer, IInvokeProvider, IValueProvider
}
namespace Windows.UI.Xaml.Controls {
public class AppBarButton : Button, ICommandBarElement, ICommandBarElement2 {
string KeyboardAcceleratorText { get; set; }
public static DependencyProperty KeyboardAcceleratorTextProperty { get; }
AppBarButtonTemplateSettings TemplateSettings { get; }
}
public class AppBarToggleButton : ToggleButton, ICommandBarElement, ICommandBarElement2 {
string KeyboardAcceleratorText { get; set; }
public static DependencyProperty KeyboardAcceleratorTextProperty { get; }
AppBarToggleButtonTemplateSettings TemplateSettings { get; }
}
public class MenuFlyoutItem : MenuFlyoutItemBase {
string KeyboardAcceleratorText { get; set; }
public static DependencyProperty KeyboardAcceleratorTextProperty { get; }
MenuFlyoutItemTemplateSettings TemplateSettings { get; }
}
public class NavigationView : ContentControl {
string PaneTitle { get; set; }
public static DependencyProperty PaneTitleProperty { get; }
event TypedEventHandler<NavigationView, object> PaneClosed;
event TypedEventHandler<NavigationView, NavigationViewPaneClosingEventArgs> PaneClosing;
event TypedEventHandler<NavigationView, object> PaneOpened;
event TypedEventHandler<NavigationView, object> PaneOpening;
}
public sealed class NavigationViewPaneClosingEventArgs
public sealed class ScrollViewer : ContentControl {
bool IsResponsiveToOcclusions { get; set; }
public static DependencyProperty IsResponsiveToOcclusionsProperty { get; }
}
public enum WebViewPermissionType {
Screen = 5,
}
}
namespace Windows.UI.Xaml.Controls.Maps {
public sealed class MapControl : Control {
string Region { get; set; }
public static DependencyProperty RegionProperty { get; }
}
public class MapElement : DependencyObject {
bool IsEnabled { get; set; }
public static DependencyProperty IsEnabledProperty { get; }
}
}
namespace Windows.UI.Xaml.Controls.Primitives {
public sealed class AppBarButtonTemplateSettings : DependencyObject
public sealed class AppBarToggleButtonTemplateSettings : DependencyObject
public class ListViewItemPresenter : ContentPresenter {
bool DisableTilt { get; set; }
public static DependencyProperty DisableTiltProperty { get; }
}
public sealed class MenuFlyoutItemTemplateSettings : DependencyObject
}
namespace Windows.UI.Xaml.Input {
public sealed class GettingFocusEventArgs : RoutedEventArgs {
bool TryCancel();
bool TrySetNewFocusedElement(DependencyObject element);
}
public sealed class KeyboardAcceleratorInvokedEventArgs {
KeyboardAccelerator KeyboardAccelerator { get; }
}
public enum KeyboardAcceleratorPlacementMode
public sealed class LosingFocusEventArgs : RoutedEventArgs {
bool TryCancel();
bool TrySetNewFocusedElement(DependencyObject element);
}
}

New DirectX 12 features in Windows 10 Fall Creators Update

We’ve come a long way since we launched DirectX 12 with Windows 10 on July 29, 2015. Since then, we’ve heard every bit of feedback and improved the API to enhance stability and offer more versatility. Today, developers using DirectX 12 can build games that have better graphics, run faster and that are more stable than ever before. Many games now run on the latest version of our groundbreaking API and we’re confident that even more anticipated, high-end AAA titles will take advantage of DirectX 12.
DirectX 12 is ideal for powering the games that run on PC and Xbox, which is the most powerful console on the market. Simply put, our consoles work best with our software: DirectX 12 is perfectly suited for native 4K games on the Xbox One X.
In the Windows 10 Fall Creators Update, we’ve added features that make it easier for developers to debug their code. In this article, we’ll explore how these features work and offer a recap of what we added in Windows 10 Creators Update.
But first, let’s cover how debugging a game or a program utilizing the GPU is different from debugging other programs.
As covered previously, DirectX 12 offers developers unprecedented low-level access to the GPU (check out Matt Sandy’s detailed post for more info). But even though this enables developers to write code that’s substantially faster and more efficient, this comes at a cost: the API is more complicated, which means that there are more opportunities for mistakes.
Many of these mistakes happen GPU-side, which means they are a lot more difficult to fix. When the GPU crashes, it can be difficult to determine exactly what went wrong. After a crash, we’re often left with little information besides a cryptic error message. The reason why these error messages can be vague is because of the inherent differences between CPUs and GPUs. Readers familiar with how GPUs work should feel free to skip the next section.
The CPU-GPU Divide
Most of the processing that happens in your machine happens in the CPU, as it’s a component that’s designed to resolve almost any computation it it’s given. It does many things, and for some operations, foregoes efficiency for versatility. This is the entire reason that GPUs exist: to perform better than the CPU at the kinds of calculations that power the graphically intensive applications of today. Basically, rendering calculations (i.e. the math behind generating images from 2D or 3D objects) are small and many: performing them in parallel makes a lot more sense than doing them consecutively. The GPU excels at these kinds of calculations. This is why game logic, which often involves long, varied and complicated computations, happens on the CPU, while the rendering happens GPU-side.
Even though applications run on the CPU, many modern-day applications require a lot of GPU support. These applications send instructions to the GPU, and then receive processed work back. For example, an application that uses 3D graphics will tell the GPU the positions of every object that needs to be drawn. The GPU will then move each object to its correct position in the 3D world, taking into account things like lighting conditions and the position of the camera, and then does the math to work out what all of this should look like from the perspective of the user. The GPU then sends back the image that should be displayed on system’s monitor.

To the left, we see a camera, three objects and a light source in Unity, a game development engine. To the right, we see how the GPU renders these 3-dimensional objects onto a 2-dimensional screen, given the camera position and light source. 
For high-end games with thousands of objects in every scene, this process of turning complicated 3-dimensional scenes into 2-dimensional images happens at least 60 times a second and would be impossible to do using the CPU alone!
Because of hardware differences, the CPU can’t talk to the GPU directly: when GPU work needs to be done, CPU-side orders need to be translated into native machine instructions that our system’s GPU can understand. This work is done by hardwire drivers, but because each GPU model is different, this means that the instructions delivered by each driver is different! Don’t worry though, here at Microsoft, we devote a substantial amount of time to make sure that GPU manufacturers (AMD, Nvidia and Intel) provide drivers that DirectX can communicate with across devices. This is one of the things that our API does; we can see DirectX as the software layer between the CPU and GPU hardware drivers.
Device Removed Errors
When games run error-free, DirectX simply sends orders (commands) from the CPU via hardware drivers to the GPU. The GPU then sends processed images back. After commands are translated and sent to the GPU, the CPU cannot track them anymore, which means that when the GPU crashes, it’s really difficult to find out what happened. Finding out which command caused it to crash used to be almost impossible, but we’re in the process of changing this, with two awesome new features that will help developers figure out what exactly happened when things go wrong in their programs.
One kind of error happens when the GPU becomes temporarily unavailable to the application, known as device removed or device lost errors. Most of these errors happen when a driver update occurs in the middle of a game. But sometimes, these errors happen because of mistakes in the programming of the game itself. Once the device has been logically removed, communication between the GPU and the application is terminated and access to GPU data is lost.
Improved Debugging: Data
During the rendering process, the GPU writes to and reads from data structures called resources. Because it takes time to do translation work between the CPU and GPU, if we already know that the GPU is going to use the same data repeatedly, we might as well just put that data straight into the GPU. In a racing game, a developer will likely want to do this for all the cars, and the track that they’re going to be racing on. All this data will then be put into resources. To draw just a single frame, the GPU will write to and read from many thousands of resources.
Before the Fall Creators Update, applications had no direct control over the underlying resource memory. However, there are rare but important cases where applications may need to access resource memory contents, such as right after device removed errors.
We’ve implemented a tool that does exactly this. Developers with access to the contents of resource memory now have substantially more useful information to help them determine exactly where an error occurred. Developers can now optimize time spent trying to determine the causes of errors, offering them more time to fix them across systems.
For technical details, see the OpenExistingHeapFromAddress documentation.
Improved Debugging: Commands
We’ve implemented another tool to be used alongside the previous one. Essentially, it can be used to create markers that record which commands sent from the CPU have already been executed and which ones are in the process of executing. Right after a crash, even a device removed crash, this information remains behind, which means we can quickly figure out which commands might have caused it—information that can significantly reduce the time needed for game development and bug fixing.
For technical details, see the WriteBufferImmediate documentation.
What does this mean for gamers? Having these tools offers direct ways to detect and inform around the root causes of what’s going on inside your machine. It’s like the difference between trying to figure out what’s wrong with your pickup truck based on hot smoke coming from the front versus having your Tesla’s internal computer system telling you exactly which part failed and needs to be replaced.
Developers using these tools will have more time to build high-performance, reliable games instead of continuously searching for the root causes of a particular bug.
Recap of Windows 10 Creators Update
In the Creators Update, we introduced two new features: Depth Bounds Testing and Programmable MSAA. Where the features we rolled out for the Windows 10 Fall Creators Update were mainly for making it easier for developers to fix crashes, Depth Bounds Testing and Programmable MSAA are focused on making it easier to program games that run faster with better visuals. These features can be seen as additional tools that have been added to a DirectX developer’s already extensive tool belt.
Depth Bounds Testing
Assigning depth values to pixels is a technique with a variety of applications: once we know how far away pixels are from a camera, we can throw away the ones too close or too far away. The same can be done to figure out which pixels fall inside and outside a light’s influence (in a 3D environment), which means that we can darken and lighten parts of the scene accordingly. We can also assign depth values to pixels to help us figure out where shadows are. These are only some of the applications of assigning depth values to pixels; it’s a versatile technique!
We now enable developers to specify a pixel’s minimum and maximum depth value; pixels outside of this range get discarded. Because doing this is now an integral part of the API and because the API is closer to the hardware than any software written on top of it, discarding pixels that don’t meet depth requirements is now something that can happen faster and more efficiently than before.
Simply put, developers will now be able to make better use of depth values in their code and can free GPU resources to perform other tasks on pixels or parts of the image that aren’t going to be thrown away.
Now that developers have another tool at their disposal, for gamers, this means that games will be able to do more for every scene.
For technical details, see the OMSetDepthBounds documentation.
Programmable MSAA
Before we explore this feature, let’s first discuss anti-aliasing.
Aliasing refers to the unwanted distortions that happen during the rendering of a scene in a game. There are two kinds of aliasing that happen in games: spatial and temporal.
Spatial aliasing refers to the visual distortions that happen when an image is represented digitally. Because pixels in a monitor/television screen are not infinitely small, there isn’t a way of representing lines that aren’t perfectly vertical or horizontal on a monitor. This means that most lines, instead of being straight lines on our screen, are not straight but rather approximations of straight lines. Sometimes the illusion of straight lines is broken: this may appear as stair-like rough edges, or ‘jaggies’, and spatial anti-aliasing refers to the techniques that programmers use to make these kinds edges smoother and less noticeable. The solution to these distortions is baked into the API, with hardware-accelerated MSAA (Multi-Sample Anti-Aliasing), an efficient anti-aliasing technique that combines quality with speed. Before the Creators Update, developers already had the tools to enable MSAA and specify its granularity (the amount of anti-aliasing done per scene) with DirectX.

Side-by-side comparison of the same scene with spatial aliasing (left) and without (right). Notice in particular the jagged outlines of the building and sides of the road in the aliased image. This still was taken from Forza Motorsport 6: Apex.
But what about temporal aliasing? Temporal aliasing refers to the aliasing that happens over time and is caused by the sampling rate (or number of frames drawn a second) being slower than the movement that happens in scene. To the user, things in the scene jump around instead of moving smoothly. This YouTube video does an excellent job showing what temporal aliasing looks like in a game.
In the Creators Update, we offer developers more control of MSAA, by making it a lot more programmable. At each frame, developers can specify how MSAA works on a sub-pixel level. By alternating MSAA on each frame, the effects of temporal aliasing become significantly less noticeable.
Programmable MSAA means that developers have a useful tool in their belt. Our API not only has native spatial anti-aliasing but now also has a feature that makes temporal anti-aliasing a lot easier. With DirectX 12 on Windows 10, PC gamers can expect upcoming games to look better than before.
For technical details, see the SetSamplePositions documentation.
Other Changes
Besides several bugfixes, we’ve also updated our graphics debugging software, PIX, every month to help developers optimize their games. Check out the PIX blog for more details.
Once again, we appreciate the feedback shared on DirectX 12 to date, and look forward to delivering even more tools, enhancements and support in the future.
Happy developing and gaming!

Windows 10 SDK Preview Build 16278 and Mobile Emulator Build 15240 Released

Today, we released a new Windows 10 Preview Build of the SDK and the Mobile Emulator to be used in conjunction with Windows 10 Insider Preview (Build 16278 or greater). The Preview SDK Build 16278 contains bug fixes and under development changes to the API surface area.
The Preview SDK and Mobile Emulator can be downloaded from developer section on Windows Insider.
For feedback and updates to the known issues, please see the developer forum. For new developer feature requests, head over to our Windows Platform UserVoice.
Things to note:
This build works in conjunction with previously released SDKs and Visual Studio 2017. You can install this SDK and still also continue to submit your apps that target Windows 10 Creators build or earlier to the Windows Store.
The Windows SDK will now formally only be supported by Visual Studio 2017 and greater. You can download the Visual Studio 2017 here.
Known Issues:
Compilation fails on non-Windows 10 platforms
When building apps with the minimum target platform version set to 10.0.16278.0 you get the build error:
“The program can’t start because api-ms-win-eventing-classicprovider-l1-1-0.dll is missing from your computer. Try reinstalling the program to fix the problem.”
This will occur if the minimum target platform version is set to 10.0.16278.0. To work around this, edit your project file and change the version to a previous released SDK. For example:

&lt;WindowsTargetPlatformMinVersion&gt;10.0.10586.0&lt;/WindowsTargetPlatformMinVersion&gt;

Breaking Changes
ecmangen.exe removal from the SDK: Ecmangen.exe will no longer ship with the Windows SDK. Developers who rely on ecmangen for event manifest creation are advised to install the Windows Creators Edition of the SDK to obtain the file. Developers may also use notepad or other XML editor of choice for manifest creation. A schema file is available on MSDN to aid in manifest creation, for tools that support it.
API Updates and Additions
When targeting new APIs, consider writing your app to be adaptive in order to run correctly on the widest number of Windows 10 devices. Please see Dynamically detecting features with API contracts (10 by 10) for more information.
The following are the API changes since the 16267 Preview SDK, please reference that list.
Additions APIs since Preview SDK 16267

namespace Windows.Storage.Provider {
public enum StorageProviderHardlinkPolicy : uint
public enum StorageProviderHydrationPolicy
public enum StorageProviderHydrationPolicyModifier : uint
public enum StorageProviderInSyncPolicy : uint
public enum StorageProviderPopulationPolicy
public enum StorageProviderProtectionMode
public sealed class StorageProviderSyncRootInfo {
StorageProviderHardlinkPolicy HardlinkPolicy { get; set; }
StorageProviderHydrationPolicy HydrationPolicy { get; set; }
StorageProviderHydrationPolicyModifier HydrationPolicyModifier { get; set; }
StorageProviderInSyncPolicy InSyncPolicy { get; set; }
StorageProviderPopulationPolicy PopulationPolicy { get; set; }
StorageProviderProtectionMode ProtectionMode { get; set; }
}
}

Removal of APIs since Preview SDK 16267

namespace Windows.Storage.Provider {
public enum HardlinkPolicy : uint
public enum HydrationPolicy
public enum HydrationPolicyModifier : uint
public enum InSyncPolicy : uint
public enum PopulationPolicy
public enum ProtectionMode
public sealed class StorageProviderSyncRootInfo {
HardlinkPolicy HardlinkPolicy { get; set; }
HydrationPolicy HydrationPolicy { get; set; }
HydrationPolicyModifier HydrationPolicyModifier { get; set; }
InSyncPolicy InSyncPolicy { get; set; }
PopulationPolicy PopulationPolicy { get; set; }
ProtectionMode ProtectionMode { get; set; }
}
}

Windows 10 SDK Preview Build 16257 and Mobile Emulator Build 15235 Released

Today, we released a new Windows 10 Preview Build of the SDK and the Mobile Emulator to be used in conjunction with Windows 10 Insider Preview (Build 16257 or greater). The Preview SDK Build 16257 contains bug fixes and under development changes to the API surface area.
The Preview SDK and Mobile Emulator can be downloaded from developer section on Windows Insider.
For feedback and updates to the known issues, please see the developer forum.  For new feature requests, head over to our Windows Platform UserVoice.
Things to note:
This build works in conjunction with previously released SDKs and Visual Studio 2017.  You can install this SDK and still also continue to submit your apps that target Windows 10 Creators build or earlier to the store.
The Windows SDK will now formally only be supported by Visual Studio 2017 and greater. You can download the Visual Studio 2017 here.
Known Issues
Designer fails to render: When viewing the XAML in the Designer Window in Visual Studio, the controls fail to render.  This can be resolved by using Visual Studio 2017.3 Preview.
Compilation fails on non-Windows 10 platforms  (need to see if fixed)When building apps on previous platforms, you may get a build error:
C:program files (x86)Windows Kits10bin10.0.16232.0x86genxbf.dll:C:program files (x860Windows Kits10bin10.0.16232.0x86genxbf.dll(0,0): Error WMC0621: Cannot resolve ‘GenXbf.dll’ under path ‘C:program files (x860Windows Kits10bin10.0.16232.0x86genxbf.dll’. Please install the latest version of the Windows 10 Software Development Kit.
Process ‘msbuild.exe’ exited with code ‘1’.
This will occur if the minimum target platform version is set to 10.0.16225.0.  To work around this, right click on your project file and choose properties or open your project file in your favorite editor, and change the version to a previous released SDK.  For example:

&lt;WindowsTargetPlatformVersion&gt;10.0.15063.0&lt;/WindowsTargetPlatformVersion&gt;

WRL projects fail to compile with MIDLRT error: When building my WRL project that contains a WinRT Component, the project no longer compiles.  I get the following errors:
midlrt : command line error MIDL1012: [msg]argument illegal for switch / [context]ns_prefix
midlrt : command line error MIDL1000: [msg]missing source-file name
To work around this temporarily you will need to use the previous version of the MidlRT.exe tool.  You can do this by changing your changing your Target Platform Version to a currently installed previous SDK.

&lt;WindowsTargetPlatformVersion&gt;10.0.15063&lt;/WindowsTargetPlatofrmVersion&gt;

Breaking Changes
ecmangen.exe removal from the SDK: ecmangen.exe will no longer ship with the Windows SDK. Developers who rely on ecmangen for event manifest creation are advised to install the Windows Creator Edition of the SDK to obtain the file. Developers may also use notepad or other XML editor of choice for manifest creation. A schema file is available on MSDN to aid in manifest creation, for tools that support it.
API Updates and Additions
When targeting new APIs, consider writing your app to be adaptive in order to run correctly on the widest number of Windows 10 devices. Please see Dynamically detecting features with API contracts (10 by 10) for more information.
The following are the API changes since the 16232 Preview SDK, please reference that list. The TreeView control has been removed, but will be back soon in the next release of Windows and the Preview SDK.
Addition from Preview SDK 16232

namespace Windows.Storage {
public sealed class AppDataPaths
public sealed class SystemDataPaths
public sealed class UserDataPaths
}

Removals from Preview SDK 16232

namespace Windows.UI.Xaml.Automation.Peers {
public class TreeViewItemAutomationPeer : ListViewItemAutomationPeer
public class TreeViewListAutomationPeer : SelectorAutomationPeer
}
namespace Windows.UI.Xaml.Controls {
public class TreeView : Control
public sealed class TreeViewExpandingEventArgs
public class TreeViewItem : ListViewItem
public sealed class TreeViewItemClickEventArgs
public class TreeViewList : ListView
public class TreeViewNode : DependencyObject, IBindableIterable, IBindableObservableVector, IBindableVector
public enum TreeViewSelectionMode
public sealed class XamlBooleanToVisibilityConverter : IValueConverter
public sealed class XamlIntegerToIndentationConverter : IValueConverter
}