Implement STFT Decomposition transformer (#19725)

Implement STFT Decomposition transformer.

Certain hardware does not support DXIL, and therefore existing operator
should be mapped to hardware supported functions.
Optimized convolution can be used to implement STFT.

---------

Co-authored-by: Sheil Kumar <sheilk@microsoft.com>
This commit is contained in:
Sheil Kumar 2024-03-08 15:02:58 -08:00 committed by GitHub
parent 069d2d6f54
commit 7deee944c0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 882 additions and 452 deletions

View file

@ -0,0 +1,381 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#include <limits>
#include "core/optimizer/stft_decomposition.h"
#include "core/optimizer/initializer.h"
#include "core/optimizer/utils.h"
#include "core/graph/graph_utils.h"
#include "core/optimizer/optimizer_execution_frame.h"
#include "core/optimizer/utils.h"
#include "core/framework/op_kernel.h"
#include "core/framework/tensorprotoutils.h"
using namespace onnxruntime::common;
namespace onnxruntime {
STFTDecomposition::STFTDecomposition(const InlinedHashSet<std::string_view>& compatible_execution_providers) noexcept
: GraphTransformer("STFTDecomposition", compatible_execution_providers) {
}
template <typename T>
constexpr static ONNX_NAMESPACE::TensorProto_DataType GetDataType() {
if constexpr (std::is_same<T, float>::value) {
return ONNX_NAMESPACE::TensorProto_DataType_FLOAT;
} else if constexpr (std::is_same<T, MLFloat16>::value) {
return ONNX_NAMESPACE::TensorProto_DataType_FLOAT16;
} else if constexpr (std::is_same<T, double>::value) {
return ONNX_NAMESPACE::TensorProto_DataType_DOUBLE;
} else if constexpr (std::is_same<T, int64_t>::value) {
return ONNX_NAMESPACE::TensorProto_DataType_INT64;
} else {
throw std::logic_error("Invalid data type requested for STFT decomposition");
}
}
template <typename TDataType, size_t TDims>
NodeArg* AddInitializer(Graph& graph, const char* name, const int64_t (&shape)[TDims], const TDataType* begin) {
ONNX_NAMESPACE::TensorProto proto;
proto.set_name(graph.GenerateNodeArgName(name));
proto.set_data_type(GetDataType<TDataType>());
int64_t element_count = 1;
for (size_t i = 0; i < TDims; i++) {
element_count *= shape[i];
proto.add_dims(shape[i]);
}
proto.set_raw_data(begin, element_count * sizeof(TDataType));
return &graph_utils::AddInitializer(graph, proto);
}
template <size_t TDims>
NodeArg* AddShapeInitializer(Graph& graph, const char* name, const int64_t (&shape)[TDims]) {
int64_t shape_shape[] = {TDims};
return AddInitializer<int64_t>(graph, name, shape_shape, shape);
}
std::pair<Node*, NodeArg*> AddNode(Graph& graph,
const char* op_type,
ProviderType execution_provider_type,
gsl::span<NodeArg*> inputs) {
auto def_name = graph.GenerateNodeArgName(op_type);
auto node_arg = &graph.GetOrCreateNodeArg(def_name, nullptr);
Node& node = graph.AddNode(graph.GenerateNodeName(op_type),
op_type,
"",
inputs,
{node_arg});
node.SetExecutionProviderType(execution_provider_type);
return std::make_pair(&node, node_arg);
}
std::pair<Node*, NodeArg*> AddNodeCast(Graph& graph, NodeArg* in,
ONNX_NAMESPACE::TensorProto_DataType data_type) {
auto def_name = graph.GenerateNodeArgName("Cast");
auto node_arg = &graph.GetOrCreateNodeArg(def_name, nullptr);
Node& node = graph.AddNode(graph.GenerateNodeName("Cast"),
"Cast",
"",
{in},
{node_arg});
node.AddAttribute("to", static_cast<int64_t>(data_type));
node.SetExecutionProviderType(kCpuExecutionProvider);
return std::make_pair(&node, node_arg);
}
#define CONTINUE_IF_NO_DIM_VALUE(dim) \
if (!dim.has_dim_value()) { \
continue; \
}
#define CONTINUE_IF_NULL(x) \
if (x == nullptr) { \
continue; \
}
/*
This function decomposes a STFT node into a subgraph.
The decomposition requires that:
1) The signal input is real valued and not complex valued!
2) Both (frame_step) *and* either (window or frame_length) inputs must be constant.
Otherwise the transform will not be applied.
Subgraph pattern 1: STFT with optional Window parameter set
[root]--(signal)--------------------+
[root]--(frame_step)---------------+|
[root]--(window)------------------+||
[root]--(frame_length) ----------+|||
||||
vvvv
[STFT]--(output)-->
After Fusion:
[root]--(signal)-------------------------+
[root] |
[root]--(window)--+ |
[root] | |
v v
(only for non-fp32) [Cast] +--[Reshape]
| | |
v | v
[Reshape]-->[Mul]---|-->[Conv]-------+
| | |
| +-----| |
| v v
+------>[Mul]------>[Conv]-->[Concat]-->[Reshape]-->[Transpose]--(output)-->
Subgraph pattern 2: STFT without optional Window parameter set
[root]--(signal)-------------------+
[root]--(frame_step)--------------+|
[root] |
[root]--(frame_length) ----------+||
|||
vvv
[STFT]--(output)-->
After Fusion:
[root]--(signal)-->[Reshape]-->[Conv]
[root] | |
[root] | v
[root] +------>[Conv]-->[Concat]-->[Reshape]-->[Transpose]--(output)-->
*/
Status STFTDecomposition::ApplyImpl(Graph& graph, bool& modified, int graph_level, const logging::Logger& logger) const {
GraphViewer graph_viewer(graph);
auto& order = graph_viewer.GetNodesInTopologicalOrder();
for (NodeIndex i : order) {
auto node = graph.GetNode(i);
CONTINUE_IF_NULL(node);
ORT_RETURN_IF_ERROR(Recurse(*node, modified, graph_level, logger));
if (node->OpType() != "STFT") {
continue;
}
Node& stft = *node;
auto signal = stft.MutableInputDefs()[0];
auto frame_step = stft.MutableInputDefs()[1];
auto window = stft.MutableInputDefs()[2];
auto frame_length = stft.MutableInputDefs()[3];
// If the signal has free dimensions, do not transform...
auto batch_size_dim = signal->Shape()->dim(0);
auto signal_length_dim = signal->Shape()->dim(1);
auto signal_components_dim = signal->Shape()->dim(2);
CONTINUE_IF_NO_DIM_VALUE(signal_length_dim);
CONTINUE_IF_NO_DIM_VALUE(signal_components_dim);
auto batch_size = batch_size_dim.has_dim_value() ? batch_size_dim.dim_value() : static_cast<int64_t>(-1);
auto signal_length = signal_length_dim.dim_value();
auto is_real = signal_components_dim.dim_value() == 1;
auto data_type = static_cast<ONNX_NAMESPACE::TensorProto_DataType>(signal->TypeAsProto()->tensor_type().elem_type());
auto frame_step_initializer = graph_utils::GetConstantInitializer(graph, frame_step->Name());
auto window_initializer = graph_utils::GetConstantInitializer(graph, window->Name());
auto frame_length_initializer = graph_utils::GetConstantInitializer(graph, frame_length->Name());
CONTINUE_IF_NULL(frame_step_initializer);
if (!frame_length_initializer && !window_initializer) {
continue;
}
auto read_int64_initializer = [](Graph& graph, const ONNX_NAMESPACE::TensorProto* initializer) {
return *Initializer(*initializer, graph.ModelPath()).data<int64_t>();
};
auto frame_step_value = read_int64_initializer(graph, frame_step_initializer);
// Get DFT Size
int64_t dft_size = 0;
if (frame_length_initializer) {
dft_size = read_int64_initializer(graph, frame_length_initializer);
}
if (dft_size == 0 && window_initializer) {
auto window_length_dim = window->Shape()->dim(0);
CONTINUE_IF_NO_DIM_VALUE(window_length_dim);
dft_size = window_length_dim.dim_value();
}
bool is_onesided = true;
auto& attrs = stft.GetAttributes();
if (attrs.find("onesided") != attrs.end()) {
auto& onesided_attr = attrs.at("onesided");
if (utils::HasInt(onesided_attr)) {
is_onesided = static_cast<bool>(onesided_attr.i());
}
}
auto dft_unique_bins = is_onesided ? ((dft_size >> 1) + 1) : dft_size;
Node* signal_recipient = nullptr;
Node* window_recipient = nullptr;
Node* stft_producer = nullptr;
if (is_real) {
auto output_num_frames = stft.MutableOutputDefs()[0]->Shape()->dim(1).dim_value();
auto output_frame_length = stft.MutableOutputDefs()[0]->Shape()->dim(2).dim_value();
auto weight_size = static_cast<size_t>(dft_unique_bins * dft_size);
auto real_weights_data = std::vector<float>(weight_size);
auto imag_weights_data = std::vector<float>(weight_size);
// Populate weights
for (size_t k = 0; k < static_cast<size_t>(dft_unique_bins); k++) {
for (size_t n = 0; n < static_cast<size_t>(dft_size); n++) {
auto index = static_cast<size_t>(k * dft_size + n);
auto theta = -2 * M_PI * k * n / static_cast<float>(dft_size);
real_weights_data[index] = static_cast<float>(cos(theta));
imag_weights_data[index] = static_cast<float>(sin(theta));
}
}
const int64_t weight_shape[] = {dft_unique_bins, 1, 1, dft_size};
auto real_weights = AddInitializer<float>(graph, "stft_real_conv_weights", weight_shape, real_weights_data.data());
auto imaginary_weights = AddInitializer<float>(graph, "stft_imaginary_conv_weights", weight_shape, imag_weights_data.data());
const int64_t signal_reshaped[] = {batch_size, 1, 1, signal_length};
auto signal_shape = AddShapeInitializer(graph, "stft_signal_shape", signal_reshaped);
const int64_t unsqueezed_output_shape[] = {2, batch_size, output_frame_length, output_num_frames};
auto unsqueezed_shape = AddShapeInitializer(graph, "stft_output_reshaped", unsqueezed_output_shape);
NodeArg* signal_reshaped_inputs[] = {signal, signal_shape};
Node* reshape_signal_node = nullptr;
NodeArg* reshape_output = nullptr;
std::tie(reshape_signal_node, reshape_output) =
AddNode(graph, "Reshape", stft.GetExecutionProviderType(), signal_reshaped_inputs);
NodeArg* real_weights_final = real_weights;
NodeArg* imag_weights_final = imaginary_weights;
if (!window->Exists()) {
// When we are missing a window function
if (real_weights_final->TypeAsProto()->tensor_type().elem_type() != data_type) {
std::tie(std::ignore, real_weights_final) =
AddNodeCast(graph, real_weights_final, data_type);
}
if (imag_weights_final->TypeAsProto()->tensor_type().elem_type() != data_type) {
std::tie(std::ignore, imag_weights_final) =
AddNodeCast(graph, imag_weights_final, data_type);
}
} else {
// When we have a window function
const int64_t window_reshaped_shape[] = {1, 1, 1, dft_size};
auto window_shape = AddShapeInitializer(graph, "stft_window_shape", window_reshaped_shape);
auto window_final = window;
if (window->TypeAsProto()->tensor_type().elem_type() != GetDataType<float>()) {
Node* window_cast_node = nullptr;
std::tie(window_cast_node, window_final) =
AddNodeCast(graph, window, GetDataType<float>());
window_recipient = window_cast_node;
}
NodeArg* window_reshaped_inputs[] = {window_final, window_shape};
Node* window_reshape_node;
NodeArg* window_reshaped = nullptr;
std::tie(window_reshape_node, window_reshaped) =
AddNode(graph, "Reshape", kCpuExecutionProvider, window_reshaped_inputs);
if (!window_recipient) {
window_recipient = window_reshape_node;
}
NodeArg* scale_real_weights_inputs[] = {real_weights, window_reshaped};
NodeArg* windowed_real_weights_output = nullptr;
std::tie(std::ignore, windowed_real_weights_output) =
AddNode(graph, "Mul", kCpuExecutionProvider, scale_real_weights_inputs);
NodeArg* scale_imag_weights_inputs[] = {imaginary_weights, window_reshaped};
NodeArg* windowed_imag_weights_output = nullptr;
std::tie(std::ignore, windowed_imag_weights_output) =
AddNode(graph, "Mul", kCpuExecutionProvider, scale_imag_weights_inputs);
std::tie(std::ignore, real_weights_final) =
AddNodeCast(graph, windowed_real_weights_output, data_type);
std::tie(std::ignore, imag_weights_final) =
AddNodeCast(graph, windowed_imag_weights_output, data_type);
}
// Add Convolution (reals)
NodeArg* conv_real_inputs[] = {reshape_output, real_weights_final};
Node* real_conv_node = nullptr;
NodeArg* real_conv_output = nullptr;
std::tie(real_conv_node, real_conv_output) =
AddNode(graph, "Conv", stft.GetExecutionProviderType(), conv_real_inputs);
real_conv_node->AddAttribute("strides", std::vector<int64_t>{1, frame_step_value});
// Add Convolution (imaginary)
NodeArg* conv_imag_inputs[] = {reshape_output, imag_weights_final};
Node* imag_conv_node = nullptr;
NodeArg* imag_conv_output = nullptr;
std::tie(imag_conv_node, imag_conv_output) =
AddNode(graph, "Conv", stft.GetExecutionProviderType(), conv_imag_inputs);
imag_conv_node->AddAttribute("strides", std::vector<int64_t>{1, frame_step_value});
// Concatenate
NodeArg* concatenate_inputs[] = {real_conv_output, imag_conv_output};
Node* concat_node = nullptr;
NodeArg* concatenated_conv_output = nullptr;
std::tie(concat_node, concatenated_conv_output) =
AddNode(graph, "Concat", stft.GetExecutionProviderType(), concatenate_inputs);
concat_node->AddAttribute("axis", static_cast<int64_t>(0));
// Unsqueeze Reshape
NodeArg* unsqueeze_reshape_inputs[] = {concatenated_conv_output, unsqueezed_shape};
NodeArg* unsqueezed_output = nullptr;
std::tie(std::ignore, unsqueezed_output) =
AddNode(graph, "Reshape", stft.GetExecutionProviderType(), unsqueeze_reshape_inputs);
// Transpose
NodeArg* transpose_inputs[] = {unsqueezed_output};
Node* transpose_node = nullptr;
NodeArg* transpose_output = nullptr;
std::tie(transpose_node, transpose_output) =
AddNode(graph, "Transpose", stft.GetExecutionProviderType(), transpose_inputs);
transpose_node->AddAttribute("perm", std::vector<int64_t>{1, 3, 2, 0});
signal_recipient = reshape_signal_node;
stft_producer = transpose_node;
} else {
continue;
}
auto input_edges = graph_utils::GraphEdge::GetNodeInputEdges(stft);
auto output_edges = graph_utils::GraphEdge::GetNodeOutputEdges(stft);
// Copy inputs
auto signal_target_idx = signal_recipient->Index();
auto window_target_idx = window_recipient->Index();
for (auto cur = input_edges.cbegin(), end = input_edges.cend(); cur != end; ++cur) {
const graph_utils::GraphEdge& edge = *cur;
NodeIndex target_idx = 0;
Node* recipient = nullptr;
switch (cur->dst_arg_index) {
case 0:
target_idx = signal_target_idx;
recipient = signal_recipient;
break;
case 2:
target_idx = window_target_idx;
recipient = window_recipient;
break;
}
if (!recipient) {
continue;
}
auto arg_index = graph_utils::GetNodeInputIndexFromInputName(*recipient, edge.arg_name);
graph.AddEdge(edge.src_node, target_idx, edge.src_arg_index, arg_index);
}
// Copy STFT outputs to stft_producer
stft_producer->MutableOutputDefs() = stft.MutableOutputDefs();
auto stft_producer_target_idx = stft_producer->Index();
for (auto cur = output_edges.cbegin(), end = output_edges.cend(); cur != end; ++cur) {
graph.AddEdge(stft_producer_target_idx, cur->dst_node, cur->src_arg_index, cur->dst_arg_index);
}
graph_utils::GraphEdge::RemoveGraphEdges(graph, input_edges);
graph_utils::GraphEdge::RemoveGraphEdges(graph, output_edges);
graph.RemoveNode(stft.Index());
modified = true;
}
return Status::OK();
}
} // namespace onnxruntime

View file

@ -0,0 +1,30 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#pragma once
#include "core/optimizer/graph_transformer.h"
#include "core/framework/ort_value.h"
#include <memory>
#include "core/framework/execution_provider.h"
namespace onnxruntime {
/**
@class STFTDecomposition
Transformer that traverses the graph top-down and decomposes
STFT into convolution.
*/
class STFTDecomposition : public GraphTransformer {
public:
/*! STFT decomposition .
\param execution_provider Execution provider instance to execute constant folding.
*/
STFTDecomposition(const InlinedHashSet<std::string_view>& compatible_execution_providers = {}) noexcept;
private:
Status ApplyImpl(Graph& graph, bool& modified, int graph_level, const logging::Logger& logger) const override;
};
} // namespace onnxruntime

View file

@ -506,7 +506,7 @@ static Status short_time_fourier_transform(OpKernelContext* ctx, bool is_oneside
// Calculate the window size with preference to the window input.
const auto window_size = window ? window->Shape()[0] : frame_length;
ORT_ENFORCE(window_size < signal_size, "Ensure that the dft size is smaller than the signal.");
ORT_ENFORCE(window_size <= signal_size, "Ensure that the dft size is smaller than the signal.");
// Calculate the number of dfts to run
const auto n_dfts =

View file

@ -771,8 +771,14 @@ namespace Dml
!native16BitShaderOpsSupported &&
IsCustomOpShader(node))
{
nodeContainsSupportedDataTypes = false;
return;
// STFT is a special case since it has a dml ep registered
// graph transformation that will decompose fp16 STFT into convolution
// and so it is OK to register for fp16.
if (strcmp("STFT", node.OpType().c_str()) != 0)
{
nodeContainsSupportedDataTypes = false;
return;
}
}
// Allow nodeArgs that are SequenceTensor when they are actually implemented by CPU Kernels.

View file

@ -21,7 +21,7 @@ dcl_uav_structured u0, 4
dcl_uav_structured u1, 4
dcl_uav_structured u2, 4
dcl_input vThreadID.x
dcl_temps 6
dcl_temps 5
dcl_thread_group 64, 1, 1
iadd r0.x, vThreadID.x, cb0[0].x
ult r0.y, r0.x, cb0[0].y
@ -40,66 +40,57 @@ if_nz r0.y
ieq r1.y, cb0[7].x, l(1)
ult r1.z, r0.w, cb0[5].z
and r1.z, r1.z, r1.y
if_nz r1.z
imul null, r1.z, r0.w, cb0[6].z
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r4.x, r1.z, l(0), u2.xxxx
imad r1.z, r0.w, cb0[6].z, cb0[6].w
ieq r1.w, cb0[5].w, l(2)
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r1.z, r1.z, l(0), u2.xxxx
and r4.y, r1.z, r1.w
imul null, r1.w, r0.w, cb0[6].z
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r4.x, r1.w, l(0), u2.xxxx
ieq r1.w, cb0[5].w, l(2)
if_nz r1.w
imad r2.y, r0.w, cb0[6].z, cb0[6].w
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r4.y, r2.y, l(0), u2.xxxx
else
mov r4.xy, l(1.000000,0,0,0)
mov r4.y, l(0)
endif
movc r2.yz, r1.zzzz, r4.yyxy, l(0,0,1.000000,0)
ult r1.z, r0.w, cb0[1].y
if_nz r1.z
imul null, r0.w, r0.w, cb0[2].y
imad r0.w, r1.x, cb0[2].x, r0.w
imad r0.w, r3.x, cb0[2].z, r0.w
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r5.x, r0.w, l(0), u0.xxxx
ieq r1.z, cb0[1].w, l(2)
if_nz r1.z
iadd r0.w, r0.w, cb0[2].w
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r5.y, r0.w, l(0), u0.xxxx
else
mov r5.y, l(0)
endif
imul null, r1.x, r1.x, cb0[2].x
imad r0.w, r0.w, cb0[2].y, r1.x
imad r0.w, r3.x, cb0[2].z, r0.w
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r4.x, r0.w, l(0), u0.xxxx
ieq r2.w, cb0[1].w, l(2)
if_nz r2.w
iadd r0.w, r0.w, cb0[2].w
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r4.y, r0.w, l(0), u0.xxxx
else
mov r5.xy, l(0,0,0,0)
mov r4.y, l(0)
endif
mul r0.w, r4.y, r5.y
mad r0.w, r5.x, r4.x, -r0.w
dp2 r1.z, r5.yxyy, r4.xyxx
ult r1.w, r0.y, cb0[5].z
and r1.y, r1.w, r1.y
if_nz r1.y
imul null, r1.y, r0.y, cb0[6].z
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r4.x, r1.y, l(0), u2.xxxx
imad r1.y, r0.y, cb0[6].z, cb0[6].w
ieq r1.w, cb0[5].w, l(2)
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r1.y, r1.y, l(0), u2.xxxx
and r4.y, r1.y, r1.w
and r3.yz, r1.zzzz, r4.xxyx
mul r0.w, r2.y, r3.z
mad r0.w, r3.y, r2.z, -r0.w
dp2 r1.z, r3.yzyy, r2.yzyy
ult r2.y, r0.y, cb0[5].z
and r1.y, r1.y, r2.y
imul null, r2.y, r0.y, cb0[6].z
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r4.x, r2.y, l(0), u2.xxxx
if_nz r1.w
imad r1.w, r0.y, cb0[6].z, cb0[6].w
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r4.y, r1.w, l(0), u2.xxxx
else
mov r4.xy, l(1.000000,0,0,0)
mov r4.y, l(0)
endif
ult r1.y, r0.y, cb0[1].y
if_nz r1.y
imul null, r0.y, r0.y, cb0[2].y
imad r0.y, r1.x, cb0[2].x, r0.y
imad r0.y, r3.x, cb0[2].z, r0.y
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r1.x, r0.y, l(0), u0.xxxx
ieq r1.w, cb0[1].w, l(2)
if_nz r1.w
iadd r0.y, r0.y, cb0[2].w
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r1.y, r0.y, l(0), u0.xxxx
else
mov r1.y, l(0)
endif
movc r1.yw, r1.yyyy, r4.yyyx, l(0,0,0,1.000000)
ult r2.y, r0.y, cb0[1].y
imad r0.y, r0.y, cb0[2].y, r1.x
imad r0.y, r3.x, cb0[2].z, r0.y
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r3.x, r0.y, l(0), u0.xxxx
if_nz r2.w
iadd r0.y, r0.y, cb0[2].w
ld_structured_indexable(structured_buffer, stride=4)(mixed,mixed,mixed,mixed) r3.y, r0.y, l(0), u0.xxxx
else
mov r1.xy, l(0,0,0,0)
mov r3.y, l(0)
endif
mul r0.y, r4.y, r1.y
mad r0.y, r1.x, r4.x, -r0.y
dp2 r1.x, r1.yxyy, r4.xyxx
and r2.yz, r2.yyyy, r3.xxyx
mul r0.y, r1.y, r2.z
mad r0.y, r2.y, r1.w, -r0.y
dp2 r1.x, r2.yzyy, r1.ywyy
udiv null, r1.y, r2.x, r0.z
ieq r1.w, cb0[0].w, l(1)
movc r1.w, r1.w, l(6.283185), l(-6.283185)
@ -117,17 +108,22 @@ if_nz r0.y
mad r0.y, r3.x, r1.x, r0.y
add r0.y, r0.y, r1.z
mul r0.yw, r0.yyyw, cb0[7].zzzz
ne r1.x, cb0[7].y, l(0.000000)
mul r1.y, r1.y, r1.y
mul r1.y, r1.y, l(3.141593)
div r1.y, r1.y, cb0[7].y
sincos r2.x, r3.x, r1.y
mov r2.y, r3.x
movc r1.xy, r1.xxxx, r2.xyxx, l(0,1.000000,0,0)
mul r1.zw, r0.yyyy, r1.xxxy
mad r0.y, r0.w, r1.y, -r1.z
store_structured u1.x, r0.z, l(0), r0.y
mad r0.y, r0.w, r1.x, r1.w
eq r1.x, cb0[7].y, l(0.000000)
if_nz r1.x
mov r1.x, r0.w
else
ne r1.z, cb0[7].y, l(0.000000)
mul r1.y, r1.y, r1.y
mul r1.y, r1.y, l(3.141593)
div r1.y, r1.y, cb0[7].y
sincos r2.x, r3.x, r1.y
mov r2.y, r3.x
movc r1.yz, r1.zzzz, r2.xxyx, l(0,0,1.000000,0)
mul r2.xy, r0.yyyy, r1.yzyy
mad r1.x, r0.w, r1.z, -r2.x
mad r0.y, r0.w, r1.y, r2.y
endif
store_structured u1.x, r0.z, l(0), r1.x
store_structured u1.x, r0.x, l(0), r0.y
endif
ret
@ -136,11 +132,11 @@ ret
const BYTE g_DFT[] =
{
68, 88, 66, 67, 222, 156,
188, 133, 179, 57, 118, 25,
122, 216, 102, 13, 91, 242,
99, 27, 1, 0, 0, 0,
172, 12, 0, 0, 3, 0,
68, 88, 66, 67, 63, 188,
200, 227, 206, 73, 64, 21,
140, 126, 47, 226, 169, 81,
175, 134, 1, 0, 0, 0,
112, 12, 0, 0, 3, 0,
0, 0, 44, 0, 0, 0,
60, 0, 0, 0, 76, 0,
0, 0, 73, 83, 71, 78,
@ -149,8 +145,8 @@ const BYTE g_DFT[] =
79, 83, 71, 78, 8, 0,
0, 0, 0, 0, 0, 0,
8, 0, 0, 0, 83, 72,
69, 88, 88, 12, 0, 0,
80, 0, 5, 0, 22, 3,
69, 88, 28, 12, 0, 0,
80, 0, 5, 0, 7, 3,
0, 0, 106, 8, 0, 1,
89, 0, 0, 4, 70, 142,
32, 0, 0, 0, 0, 0,
@ -164,7 +160,7 @@ const BYTE g_DFT[] =
17, 0, 2, 0, 0, 0,
4, 0, 0, 0, 95, 0,
0, 2, 18, 0, 2, 0,
104, 0, 0, 2, 6, 0,
104, 0, 0, 2, 5, 0,
0, 0, 155, 0, 0, 4,
64, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0,
@ -256,11 +252,9 @@ const BYTE g_DFT[] =
16, 0, 1, 0, 0, 0,
42, 0, 16, 0, 1, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 31, 0,
4, 3, 42, 0, 16, 0,
1, 0, 0, 0, 38, 0,
0, 9, 0, 208, 0, 0,
66, 0, 16, 0, 1, 0,
130, 0, 16, 0, 1, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 42, 128,
32, 0, 0, 0, 0, 0,
@ -268,221 +262,203 @@ const BYTE g_DFT[] =
0, 139, 2, 35, 0, 128,
131, 153, 25, 0, 18, 0,
16, 0, 4, 0, 0, 0,
42, 0, 16, 0, 1, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 6, 224,
17, 0, 2, 0, 0, 0,
35, 0, 0, 11, 66, 0,
16, 0, 1, 0, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 42, 128, 32, 0,
0, 0, 0, 0, 6, 0,
0, 0, 58, 128, 32, 0,
0, 0, 0, 0, 6, 0,
0, 0, 32, 0, 0, 8,
130, 0, 16, 0, 1, 0,
0, 0, 58, 128, 32, 0,
0, 0, 0, 0, 5, 0,
0, 0, 1, 64, 0, 0,
2, 0, 0, 0, 167, 0,
0, 139, 2, 35, 0, 128,
131, 153, 25, 0, 66, 0,
16, 0, 1, 0, 0, 0,
42, 0, 16, 0, 1, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 6, 224,
17, 0, 2, 0, 0, 0,
1, 0, 0, 7, 34, 0,
16, 0, 4, 0, 0, 0,
42, 0, 16, 0, 1, 0,
0, 0, 58, 0, 16, 0,
1, 0, 0, 0, 18, 0,
0, 1, 54, 0, 0, 8,
50, 0, 16, 0, 4, 0,
0, 0, 2, 64, 0, 0,
0, 0, 128, 63, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 21, 0,
0, 1, 79, 0, 0, 8,
66, 0, 16, 0, 1, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 26, 128,
32, 0, 0, 0, 0, 0,
1, 0, 0, 0, 31, 0,
4, 3, 42, 0, 16, 0,
1, 0, 0, 0, 38, 0,
0, 9, 0, 208, 0, 0,
130, 0, 16, 0, 0, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 26, 128,
32, 0, 0, 0, 0, 0,
2, 0, 0, 0, 35, 0,
0, 10, 130, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
10, 128, 32, 0, 0, 0,
0, 0, 2, 0, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 35, 0, 0, 10,
130, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
3, 0, 0, 0, 42, 128,
32, 0, 0, 0, 0, 0,
2, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
167, 0, 0, 139, 2, 35,
0, 128, 131, 153, 25, 0,
18, 0, 16, 0, 5, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
6, 224, 17, 0, 0, 0,
0, 0, 32, 0, 0, 8,
66, 0, 16, 0, 1, 0,
0, 0, 58, 128, 32, 0,
0, 0, 0, 0, 1, 0,
0, 0, 1, 64, 0, 0,
2, 0, 0, 0, 31, 0,
4, 3, 42, 0, 16, 0,
1, 0, 0, 0, 30, 0,
0, 8, 130, 0, 16, 0,
0, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
58, 128, 32, 0, 0, 0,
0, 0, 2, 0, 0, 0,
167, 0, 0, 139, 2, 35,
0, 128, 131, 153, 25, 0,
34, 0, 16, 0, 5, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
6, 224, 17, 0, 0, 0,
0, 0, 18, 0, 0, 1,
54, 0, 0, 5, 34, 0,
16, 0, 5, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 21, 0, 0, 1,
18, 0, 0, 1, 54, 0,
0, 8, 50, 0, 16, 0,
5, 0, 0, 0, 2, 64,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
21, 0, 0, 1, 56, 0,
0, 7, 130, 0, 16, 0,
0, 0, 0, 0, 26, 0,
16, 0, 4, 0, 0, 0,
26, 0, 16, 0, 5, 0,
0, 0, 50, 0, 0, 10,
130, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
5, 0, 0, 0, 10, 0,
16, 0, 4, 0, 0, 0,
58, 0, 16, 128, 65, 0,
0, 0, 0, 0, 0, 0,
15, 0, 0, 7, 66, 0,
16, 0, 1, 0, 0, 0,
22, 5, 16, 0, 5, 0,
0, 0, 70, 0, 16, 0,
4, 0, 0, 0, 79, 0,
0, 8, 130, 0, 16, 0,
1, 0, 0, 0, 26, 0,
16, 0, 0, 0, 0, 0,
42, 128, 32, 0, 0, 0,
0, 0, 5, 0, 0, 0,
1, 0, 0, 7, 34, 0,
16, 0, 1, 0, 0, 0,
58, 0, 16, 0, 1, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 31, 0,
4, 3, 26, 0, 16, 0,
1, 0, 0, 0, 38, 0,
0, 9, 0, 208, 0, 0,
34, 0, 16, 0, 1, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 42, 128,
32, 0, 0, 0, 0, 0,
6, 0, 0, 0, 167, 0,
0, 139, 2, 35, 0, 128,
131, 153, 25, 0, 18, 0,
16, 0, 4, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 6, 224,
17, 0, 2, 0, 0, 0,
35, 0, 0, 11, 34, 0,
32, 0, 0, 8, 130, 0,
16, 0, 1, 0, 0, 0,
26, 0, 16, 0, 0, 0,
0, 0, 42, 128, 32, 0,
0, 0, 0, 0, 6, 0,
0, 0, 58, 128, 32, 0,
0, 0, 0, 0, 6, 0,
0, 0, 32, 0, 0, 8,
130, 0, 16, 0, 1, 0,
0, 0, 58, 128, 32, 0,
0, 0, 0, 0, 5, 0,
0, 0, 1, 64, 0, 0,
2, 0, 0, 0, 167, 0,
58, 128, 32, 0, 0, 0,
0, 0, 5, 0, 0, 0,
1, 64, 0, 0, 2, 0,
0, 0, 31, 0, 4, 3,
58, 0, 16, 0, 1, 0,
0, 0, 35, 0, 0, 11,
34, 0, 16, 0, 2, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 42, 128,
32, 0, 0, 0, 0, 0,
6, 0, 0, 0, 58, 128,
32, 0, 0, 0, 0, 0,
6, 0, 0, 0, 167, 0,
0, 139, 2, 35, 0, 128,
131, 153, 25, 0, 34, 0,
16, 0, 1, 0, 0, 0,
26, 0, 16, 0, 1, 0,
16, 0, 4, 0, 0, 0,
26, 0, 16, 0, 2, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 6, 224,
17, 0, 2, 0, 0, 0,
1, 0, 0, 7, 34, 0,
16, 0, 4, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 58, 0, 16, 0,
1, 0, 0, 0, 18, 0,
0, 1, 54, 0, 0, 8,
50, 0, 16, 0, 4, 0,
0, 0, 2, 64, 0, 0,
0, 0, 128, 63, 0, 0,
18, 0, 0, 1, 54, 0,
0, 5, 34, 0, 16, 0,
4, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 21, 0,
0, 1, 79, 0, 0, 8,
34, 0, 16, 0, 1, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 26, 128,
32, 0, 0, 0, 0, 0,
1, 0, 0, 0, 31, 0,
4, 3, 26, 0, 16, 0,
1, 0, 0, 0, 38, 0,
0, 9, 0, 208, 0, 0,
34, 0, 16, 0, 0, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 26, 128,
32, 0, 0, 0, 0, 0,
2, 0, 0, 0, 35, 0,
0, 10, 34, 0, 16, 0,
0, 0, 0, 0, 10, 0,
21, 0, 0, 1, 55, 0,
0, 12, 98, 0, 16, 0,
2, 0, 0, 0, 166, 10,
16, 0, 1, 0, 0, 0,
86, 4, 16, 0, 4, 0,
0, 0, 2, 64, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 128, 63,
0, 0, 0, 0, 79, 0,
0, 8, 66, 0, 16, 0,
1, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
26, 128, 32, 0, 0, 0,
0, 0, 1, 0, 0, 0,
38, 0, 0, 9, 0, 208,
0, 0, 18, 0, 16, 0,
1, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
10, 128, 32, 0, 0, 0,
0, 0, 2, 0, 0, 0,
26, 0, 16, 0, 0, 0,
0, 0, 35, 0, 0, 10,
34, 0, 16, 0, 0, 0,
35, 0, 0, 10, 130, 0,
16, 0, 0, 0, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 26, 128, 32, 0,
0, 0, 0, 0, 2, 0,
0, 0, 10, 0, 16, 0,
3, 0, 0, 0, 42, 128,
1, 0, 0, 0, 35, 0,
0, 10, 130, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 3, 0, 0, 0,
42, 128, 32, 0, 0, 0,
0, 0, 2, 0, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 167, 0, 0, 139,
2, 35, 0, 128, 131, 153,
25, 0, 18, 0, 16, 0,
4, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 6, 224, 17, 0,
0, 0, 0, 0, 32, 0,
0, 8, 130, 0, 16, 0,
2, 0, 0, 0, 58, 128,
32, 0, 0, 0, 0, 0,
1, 0, 0, 0, 1, 64,
0, 0, 2, 0, 0, 0,
31, 0, 4, 3, 58, 0,
16, 0, 2, 0, 0, 0,
30, 0, 0, 8, 130, 0,
16, 0, 0, 0, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 58, 128, 32, 0,
0, 0, 0, 0, 2, 0,
0, 0, 167, 0, 0, 139,
2, 35, 0, 128, 131, 153,
25, 0, 34, 0, 16, 0,
4, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 6, 224, 17, 0,
0, 0, 0, 0, 18, 0,
0, 1, 54, 0, 0, 5,
34, 0, 16, 0, 4, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 21, 0,
0, 1, 1, 0, 0, 7,
98, 0, 16, 0, 3, 0,
0, 0, 166, 10, 16, 0,
1, 0, 0, 0, 6, 1,
16, 0, 4, 0, 0, 0,
56, 0, 0, 7, 130, 0,
16, 0, 0, 0, 0, 0,
26, 0, 16, 0, 2, 0,
0, 0, 42, 0, 16, 0,
3, 0, 0, 0, 50, 0,
0, 10, 130, 0, 16, 0,
0, 0, 0, 0, 26, 0,
16, 0, 3, 0, 0, 0,
42, 0, 16, 0, 2, 0,
0, 0, 58, 0, 16, 128,
65, 0, 0, 0, 0, 0,
0, 0, 15, 0, 0, 7,
66, 0, 16, 0, 1, 0,
0, 0, 150, 5, 16, 0,
3, 0, 0, 0, 150, 5,
16, 0, 2, 0, 0, 0,
79, 0, 0, 8, 34, 0,
16, 0, 2, 0, 0, 0,
26, 0, 16, 0, 0, 0,
0, 0, 42, 128, 32, 0,
0, 0, 0, 0, 5, 0,
0, 0, 1, 0, 0, 7,
34, 0, 16, 0, 1, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 26, 0,
16, 0, 2, 0, 0, 0,
38, 0, 0, 9, 0, 208,
0, 0, 34, 0, 16, 0,
2, 0, 0, 0, 26, 0,
16, 0, 0, 0, 0, 0,
42, 128, 32, 0, 0, 0,
0, 0, 6, 0, 0, 0,
167, 0, 0, 139, 2, 35,
0, 128, 131, 153, 25, 0,
18, 0, 16, 0, 1, 0,
18, 0, 16, 0, 4, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 1, 64,
2, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
6, 224, 17, 0, 0, 0,
0, 0, 32, 0, 0, 8,
6, 224, 17, 0, 2, 0,
0, 0, 31, 0, 4, 3,
58, 0, 16, 0, 1, 0,
0, 0, 35, 0, 0, 11,
130, 0, 16, 0, 1, 0,
0, 0, 58, 128, 32, 0,
0, 0, 0, 0, 1, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 42, 128,
32, 0, 0, 0, 0, 0,
6, 0, 0, 0, 58, 128,
32, 0, 0, 0, 0, 0,
6, 0, 0, 0, 167, 0,
0, 139, 2, 35, 0, 128,
131, 153, 25, 0, 34, 0,
16, 0, 4, 0, 0, 0,
58, 0, 16, 0, 1, 0,
0, 0, 1, 64, 0, 0,
2, 0, 0, 0, 31, 0,
0, 0, 0, 0, 6, 224,
17, 0, 2, 0, 0, 0,
18, 0, 0, 1, 54, 0,
0, 5, 34, 0, 16, 0,
4, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
21, 0, 0, 1, 55, 0,
0, 12, 162, 0, 16, 0,
1, 0, 0, 0, 86, 5,
16, 0, 1, 0, 0, 0,
86, 1, 16, 0, 4, 0,
0, 0, 2, 64, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 128, 63, 79, 0,
0, 8, 34, 0, 16, 0,
2, 0, 0, 0, 26, 0,
16, 0, 0, 0, 0, 0,
26, 128, 32, 0, 0, 0,
0, 0, 1, 0, 0, 0,
35, 0, 0, 10, 34, 0,
16, 0, 0, 0, 0, 0,
26, 0, 16, 0, 0, 0,
0, 0, 26, 128, 32, 0,
0, 0, 0, 0, 2, 0,
0, 0, 10, 0, 16, 0,
1, 0, 0, 0, 35, 0,
0, 10, 34, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 3, 0, 0, 0,
42, 128, 32, 0, 0, 0,
0, 0, 2, 0, 0, 0,
26, 0, 16, 0, 0, 0,
0, 0, 167, 0, 0, 139,
2, 35, 0, 128, 131, 153,
25, 0, 18, 0, 16, 0,
3, 0, 0, 0, 26, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 6, 224, 17, 0,
0, 0, 0, 0, 31, 0,
4, 3, 58, 0, 16, 0,
1, 0, 0, 0, 30, 0,
2, 0, 0, 0, 30, 0,
0, 8, 34, 0, 16, 0,
0, 0, 0, 0, 26, 0,
16, 0, 0, 0, 0, 0,
@ -490,39 +466,37 @@ const BYTE g_DFT[] =
0, 0, 2, 0, 0, 0,
167, 0, 0, 139, 2, 35,
0, 128, 131, 153, 25, 0,
34, 0, 16, 0, 1, 0,
34, 0, 16, 0, 3, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
6, 224, 17, 0, 0, 0,
0, 0, 18, 0, 0, 1,
54, 0, 0, 5, 34, 0,
16, 0, 1, 0, 0, 0,
16, 0, 3, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 21, 0, 0, 1,
18, 0, 0, 1, 54, 0,
0, 8, 50, 0, 16, 0,
1, 0, 0, 0, 2, 64,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
21, 0, 0, 1, 56, 0,
1, 0, 0, 7, 98, 0,
16, 0, 2, 0, 0, 0,
86, 5, 16, 0, 2, 0,
0, 0, 6, 1, 16, 0,
3, 0, 0, 0, 56, 0,
0, 7, 34, 0, 16, 0,
0, 0, 0, 0, 26, 0,
16, 0, 4, 0, 0, 0,
26, 0, 16, 0, 1, 0,
16, 0, 1, 0, 0, 0,
42, 0, 16, 0, 2, 0,
0, 0, 50, 0, 0, 10,
34, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
1, 0, 0, 0, 10, 0,
16, 0, 4, 0, 0, 0,
0, 0, 26, 0, 16, 0,
2, 0, 0, 0, 58, 0,
16, 0, 1, 0, 0, 0,
26, 0, 16, 128, 65, 0,
0, 0, 0, 0, 0, 0,
15, 0, 0, 7, 18, 0,
16, 0, 1, 0, 0, 0,
22, 5, 16, 0, 1, 0,
0, 0, 70, 0, 16, 0,
4, 0, 0, 0, 78, 0,
150, 5, 16, 0, 2, 0,
0, 0, 214, 5, 16, 0,
1, 0, 0, 0, 78, 0,
0, 8, 0, 208, 0, 0,
34, 0, 16, 0, 1, 0,
0, 0, 10, 0, 16, 0,
@ -610,65 +584,77 @@ const BYTE g_DFT[] =
16, 0, 0, 0, 0, 0,
166, 138, 32, 0, 0, 0,
0, 0, 7, 0, 0, 0,
57, 0, 0, 8, 18, 0,
24, 0, 0, 8, 18, 0,
16, 0, 1, 0, 0, 0,
26, 128, 32, 0, 0, 0,
0, 0, 7, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 31, 0, 4, 3,
10, 0, 16, 0, 1, 0,
0, 0, 54, 0, 0, 5,
18, 0, 16, 0, 1, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 18, 0,
0, 1, 57, 0, 0, 8,
66, 0, 16, 0, 1, 0,
0, 0, 26, 128, 32, 0,
0, 0, 0, 0, 7, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 56, 0,
0, 7, 34, 0, 16, 0,
1, 0, 0, 0, 26, 0,
16, 0, 1, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 56, 0, 0, 7,
34, 0, 16, 0, 1, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 26, 0,
16, 0, 1, 0, 0, 0,
56, 0, 0, 7, 34, 0,
1, 0, 0, 0, 1, 64,
0, 0, 219, 15, 73, 64,
14, 0, 0, 8, 34, 0,
16, 0, 1, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 1, 64, 0, 0,
219, 15, 73, 64, 14, 0,
0, 8, 34, 0, 16, 0,
1, 0, 0, 0, 26, 0,
0, 0, 26, 128, 32, 0,
0, 0, 0, 0, 7, 0,
0, 0, 77, 0, 0, 7,
18, 0, 16, 0, 2, 0,
0, 0, 18, 0, 16, 0,
3, 0, 0, 0, 26, 0,
16, 0, 1, 0, 0, 0,
26, 128, 32, 0, 0, 0,
0, 0, 7, 0, 0, 0,
77, 0, 0, 7, 18, 0,
54, 0, 0, 5, 34, 0,
16, 0, 2, 0, 0, 0,
18, 0, 16, 0, 3, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 54, 0,
0, 5, 34, 0, 16, 0,
2, 0, 0, 0, 10, 0,
16, 0, 3, 0, 0, 0,
55, 0, 0, 12, 50, 0,
16, 0, 1, 0, 0, 0,
6, 0, 16, 0, 1, 0,
0, 0, 70, 0, 16, 0,
2, 0, 0, 0, 2, 64,
10, 0, 16, 0, 3, 0,
0, 0, 55, 0, 0, 12,
98, 0, 16, 0, 1, 0,
0, 0, 166, 10, 16, 0,
1, 0, 0, 0, 6, 1,
16, 0, 2, 0, 0, 0,
2, 64, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 128, 63, 0, 0,
0, 0, 0, 0, 0, 0,
56, 0, 0, 7, 194, 0,
0, 0, 56, 0, 0, 7,
50, 0, 16, 0, 2, 0,
0, 0, 86, 5, 16, 0,
0, 0, 0, 0, 150, 5,
16, 0, 1, 0, 0, 0,
86, 5, 16, 0, 0, 0,
0, 0, 6, 4, 16, 0,
1, 0, 0, 0, 50, 0,
0, 10, 34, 0, 16, 0,
50, 0, 0, 10, 18, 0,
16, 0, 1, 0, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 42, 0, 16, 0,
1, 0, 0, 0, 10, 0,
16, 128, 65, 0, 0, 0,
2, 0, 0, 0, 50, 0,
0, 9, 34, 0, 16, 0,
0, 0, 0, 0, 58, 0,
16, 0, 0, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 42, 0, 16, 128,
65, 0, 0, 0, 1, 0,
0, 0, 168, 0, 0, 9,
0, 0, 26, 0, 16, 0,
2, 0, 0, 0, 21, 0,
0, 1, 168, 0, 0, 9,
18, 224, 17, 0, 1, 0,
0, 0, 42, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
26, 0, 16, 0, 0, 0,
0, 0, 50, 0, 0, 9,
34, 0, 16, 0, 0, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
58, 0, 16, 0, 1, 0,
10, 0, 16, 0, 1, 0,
0, 0, 168, 0, 0, 9,
18, 224, 17, 0, 1, 0,
0, 0, 10, 0, 16, 0,

View file

@ -15,7 +15,7 @@
; Name Index Mask Register SysValue Format Used
; -------------------- ----- ------ -------- -------- ------- ------
; no parameters
; shader hash: e08f21199c48b0db30bf21bd8c5b80dc
; shader hash: 6a1d88feb14177832f5ee49ca330c549
;
; Pipeline Runtime Information:
;
@ -125,7 +125,7 @@ define void @DFT() {
%47 = fpext half %46 to float
%48 = extractvalue %dx.types.CBufRet.i32 %37, 3
%49 = icmp eq i32 %48, 2
br i1 %49, label %50, label %56
br i1 %49, label %50, label %56, !dx.controlflow.hints !15
; <label>:50 ; preds = %41
%51 = extractvalue %dx.types.CBufRet.i32 %42, 3
@ -141,7 +141,7 @@ define void @DFT() {
%59 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %4, i32 1) ; CBufferLoadLegacy(handle,regIndex)
%60 = extractvalue %dx.types.CBufRet.i32 %59, 1
%61 = icmp ult i32 %33, %60
br i1 %61, label %62, label %83, !dx.controlflow.hints !15
br i1 %61, label %62, label %83, !dx.controlflow.hints !16
; <label>:62 ; preds = %56
%63 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %4, i32 2) ; CBufferLoadLegacy(handle,regIndex)
@ -158,7 +158,7 @@ define void @DFT() {
%74 = fpext half %73 to float
%75 = extractvalue %dx.types.CBufRet.i32 %59, 3
%76 = icmp eq i32 %75, 2
br i1 %76, label %77, label %83, !dx.controlflow.hints !16
br i1 %76, label %77, label %83, !dx.controlflow.hints !17
; <label>:77 ; preds = %62
%78 = extractvalue %dx.types.CBufRet.i32 %63, 3
@ -188,7 +188,7 @@ define void @DFT() {
%98 = fpext half %97 to float
%99 = extractvalue %dx.types.CBufRet.i32 %37, 3
%100 = icmp eq i32 %99, 2
br i1 %100, label %101, label %107
br i1 %100, label %101, label %107, !dx.controlflow.hints !15
; <label>:101 ; preds = %92
%102 = extractvalue %dx.types.CBufRet.i32 %93, 3
@ -202,7 +202,7 @@ define void @DFT() {
%108 = phi float [ %98, %101 ], [ %98, %92 ], [ 1.000000e+00, %83 ]
%109 = phi float [ %106, %101 ], [ 0.000000e+00, %92 ], [ 0.000000e+00, %83 ]
%110 = icmp ult i32 %34, %60
br i1 %110, label %111, label %132, !dx.controlflow.hints !15
br i1 %110, label %111, label %132, !dx.controlflow.hints !16
; <label>:111 ; preds = %107
%112 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %4, i32 2) ; CBufferLoadLegacy(handle,regIndex)
@ -219,7 +219,7 @@ define void @DFT() {
%123 = fpext half %122 to float
%124 = extractvalue %dx.types.CBufRet.i32 %59, 3
%125 = icmp eq i32 %124, 2
br i1 %125, label %126, label %132, !dx.controlflow.hints !16
br i1 %125, label %126, label %132, !dx.controlflow.hints !17
; <label>:126 ; preds = %111
%127 = extractvalue %dx.types.CBufRet.i32 %112, 3
@ -270,19 +270,21 @@ define void @DFT() {
%170 = fmul fast float %158, %169
%171 = extractvalue %dx.types.CBufRet.f32 %157, 1
%172 = fcmp fast oeq float %171, 0.000000e+00
br i1 %172, label %179, label %173
br i1 %172, label %173, label %176, !dx.controlflow.hints !18
; <label>:173 ; preds = %132
%174 = fmul fast float %146, %146
%175 = fmul fast float %174, 0x400921FB60000000
%176 = fdiv fast float %175, %171
%177 = call float @dx.op.unary.f32(i32 12, float %176) ; Cos(value)
%178 = call float @dx.op.unary.f32(i32 13, float %176) ; Sin(value)
br label %179
%174 = fptrunc float %164 to half
call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %2, i32 %154, i32 0, half %174, half undef, half undef, half undef, i8 1, i32 2) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment)
%175 = fptrunc float %170 to half
call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %2, i32 %156, i32 0, half %175, half undef, half undef, half undef, i8 1, i32 2) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment)
br label %190
; <label>:179 ; preds = %173, %132
%180 = phi float [ %177, %173 ], [ 1.000000e+00, %132 ]
%181 = phi float [ %178, %173 ], [ 0.000000e+00, %132 ]
; <label>:176 ; preds = %132
%177 = fmul fast float %146, %146
%178 = fmul fast float %177, 0x400921FB60000000
%179 = fdiv fast float %178, %171
%180 = call float @dx.op.unary.f32(i32 12, float %179) ; Cos(value)
%181 = call float @dx.op.unary.f32(i32 13, float %179) ; Sin(value)
%182 = fmul fast float %180, %164
%183 = fmul fast float %181, %170
%184 = fsub fast float %182, %183
@ -295,7 +297,7 @@ define void @DFT() {
call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %2, i32 %156, i32 0, half %189, half undef, half undef, half undef, i8 1, i32 2) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment)
br label %190
; <label>:190 ; preds = %179, %0
; <label>:190 ; preds = %176, %173, %0
ret void
}
@ -345,16 +347,18 @@ attributes #2 = { nounwind }
!11 = !{void ()* @DFT, !"DFT", null, !4, !12}
!12 = !{i32 0, i64 8388656, i32 4, !13}
!13 = !{i32 64, i32 1, i32 1}
!14 = distinct !{!14, !"dx.controlflow.hints", i32 1}
!14 = distinct !{!14, !"dx.controlflow.hints", i32 2}
!15 = distinct !{!15, !"dx.controlflow.hints", i32 1}
!16 = distinct !{!16, !"dx.controlflow.hints", i32 1}
!16 = distinct !{!16, !"dx.controlflow.hints", i32 2}
!17 = distinct !{!17, !"dx.controlflow.hints", i32 1}
!18 = distinct !{!18, !"dx.controlflow.hints", i32 1}
#endif
const unsigned char g_DFT[] = {
0x44, 0x58, 0x42, 0x43, 0x0f, 0xc1, 0xea, 0x65, 0x6d, 0xe3, 0x8d, 0x13,
0x2c, 0xb2, 0x19, 0xb3, 0xd4, 0xb1, 0x94, 0xb9, 0x01, 0x00, 0x00, 0x00,
0xfc, 0x0b, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
0x44, 0x58, 0x42, 0x43, 0x12, 0x40, 0x8a, 0x15, 0xf2, 0x7d, 0x33, 0xd8,
0x35, 0x6a, 0x11, 0xd5, 0x43, 0xa1, 0x29, 0x3b, 0x01, 0x00, 0x00, 0x00,
0x3c, 0x0c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
0x48, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00,
0x18, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -376,12 +380,12 @@ const unsigned char g_DFT[] = {
0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xe0, 0x8f, 0x21, 0x19, 0x9c, 0x48, 0xb0, 0xdb,
0x30, 0xbf, 0x21, 0xbd, 0x8c, 0x5b, 0x80, 0xdc, 0x44, 0x58, 0x49, 0x4c,
0xc0, 0x0a, 0x00, 0x00, 0x62, 0x00, 0x05, 0x00, 0xb0, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6a, 0x1d, 0x88, 0xfe, 0xb1, 0x41, 0x77, 0x83,
0x2f, 0x5e, 0xe4, 0x9c, 0xa3, 0x30, 0xc5, 0x49, 0x44, 0x58, 0x49, 0x4c,
0x00, 0x0b, 0x00, 0x00, 0x62, 0x00, 0x05, 0x00, 0xc0, 0x02, 0x00, 0x00,
0x44, 0x58, 0x49, 0x4c, 0x02, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0xa8, 0x0a, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
0xa7, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00,
0xe8, 0x0a, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00,
0xb7, 0x02, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00,
0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49,
0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19,
0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42,
@ -441,7 +445,7 @@ const unsigned char g_DFT[] = {
0x4a, 0xa0, 0x08, 0x8a, 0x61, 0x04, 0xa0, 0x30, 0x0a, 0x50, 0xa0, 0x10,
0x0a, 0x30, 0x80, 0xb0, 0x11, 0x00, 0x0a, 0x0b, 0x1c, 0x10, 0x10, 0x81,
0xc0, 0x19, 0x00, 0xea, 0x66, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
0x4f, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
0x52, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44,
0x35, 0x18, 0x63, 0x0b, 0x73, 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b, 0x4b,
0x7b, 0x73, 0x03, 0x99, 0x71, 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b, 0x9b,
0x7b, 0x91, 0x2a, 0x62, 0x2a, 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9, 0x81,
@ -458,16 +462,17 @@ const unsigned char g_DFT[] = {
0x70, 0x26, 0x08, 0xc3, 0xb3, 0x61, 0xe0, 0x86, 0x61, 0x03, 0xa1, 0x68,
0x5b, 0xb7, 0xa1, 0xc0, 0x32, 0xe0, 0xf2, 0x48, 0x91, 0xe1, 0xb9, 0x8c,
0xbd, 0xb9, 0xd1, 0xc9, 0xbd, 0xb1, 0x99, 0xb1, 0xbd, 0xdd, 0xb9, 0xa0,
0xa5, 0xb9, 0xd1, 0xcd, 0xad, 0x18, 0xc2, 0x00, 0x0c, 0x86, 0x15, 0x83,
0x18, 0x80, 0xc1, 0xb0, 0x62, 0x18, 0x03, 0x30, 0x18, 0xaa, 0xb0, 0xb1,
0xd9, 0xb5, 0xb9, 0xa4, 0x91, 0x95, 0xb9, 0xd1, 0x4d, 0x09, 0x82, 0x2a,
0x64, 0x78, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x02,
0xa2, 0x09, 0x19, 0x9e, 0x8b, 0x5d, 0x18, 0x9b, 0x5d, 0x99, 0xdc, 0x94,
0xc0, 0xa8, 0x43, 0x86, 0xe7, 0x32, 0x87, 0x16, 0x46, 0x56, 0x26, 0xd7,
0xf4, 0x46, 0x56, 0xc6, 0x36, 0x25, 0x40, 0xca, 0x90, 0xe1, 0xb9, 0xc8,
0x95, 0xcd, 0xbd, 0xd5, 0xc9, 0x8d, 0x95, 0xcd, 0x4d, 0x09, 0xac, 0x3a,
0x64, 0x78, 0x2e, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x69, 0x6e,
0x74, 0x73, 0x53, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
0xa5, 0xb9, 0xd1, 0xcd, 0xad, 0x18, 0xc2, 0x00, 0x0c, 0x88, 0x15, 0x83,
0x18, 0x80, 0xc1, 0xb0, 0x62, 0x18, 0x03, 0x30, 0x20, 0x56, 0x0c, 0x64,
0x00, 0x06, 0xc3, 0x8a, 0xa1, 0x0c, 0xc0, 0x60, 0xa8, 0xc2, 0xc6, 0x66,
0xd7, 0xe6, 0x92, 0x46, 0x56, 0xe6, 0x46, 0x37, 0x25, 0x08, 0xaa, 0x90,
0xe1, 0xb9, 0xd8, 0x95, 0xc9, 0xcd, 0xa5, 0xbd, 0xb9, 0x4d, 0x09, 0x88,
0x26, 0x64, 0x78, 0x2e, 0x76, 0x61, 0x6c, 0x76, 0x65, 0x72, 0x53, 0x02,
0xa3, 0x0e, 0x19, 0x9e, 0xcb, 0x1c, 0x5a, 0x18, 0x59, 0x99, 0x5c, 0xd3,
0x1b, 0x59, 0x19, 0xdb, 0x94, 0x00, 0x29, 0x43, 0x86, 0xe7, 0x22, 0x57,
0x36, 0xf7, 0x56, 0x27, 0x37, 0x56, 0x36, 0x37, 0x25, 0xb0, 0xea, 0x90,
0xe1, 0xb9, 0x94, 0xb9, 0xd1, 0xc9, 0xe5, 0x41, 0xbd, 0xa5, 0xb9, 0xd1,
0xcd, 0x4d, 0x09, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00,
0x59, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66,
0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07,
0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10,
@ -510,9 +515,9 @@ const unsigned char g_DFT[] = {
0x13, 0x11, 0x7e, 0x51, 0xeb, 0x16, 0x20, 0x0d, 0x97, 0xef, 0x3c, 0xfe,
0x74, 0x44, 0x04, 0x30, 0x88, 0x83, 0x8f, 0xdc, 0xb6, 0x09, 0x3c, 0xc3,
0xe5, 0x3b, 0x8f, 0x4f, 0x35, 0x40, 0x84, 0xf9, 0xc5, 0x6d, 0x03, 0x00,
0x61, 0x20, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x13, 0x04, 0x51, 0x2c,
0x61, 0x20, 0x00, 0x00, 0x2f, 0x01, 0x00, 0x00, 0x13, 0x04, 0x51, 0x2c,
0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x34, 0x94, 0x5d, 0x59,
0x0a, 0x94, 0x5c, 0xf9, 0x94, 0x43, 0x0d, 0x94, 0x46, 0x61, 0x0a, 0x94,
0x0a, 0x94, 0x5c, 0x61, 0x0a, 0x94, 0x4f, 0x39, 0xd4, 0x40, 0x69, 0x94,
0x6e, 0x40, 0x19, 0x94, 0x02, 0x2d, 0x45, 0x50, 0x02, 0x64, 0x8c, 0x11,
0xec, 0xfe, 0x28, 0xb3, 0x60, 0x30, 0x46, 0xb0, 0xfb, 0xa3, 0xcc, 0x82,
0xc3, 0x18, 0xc1, 0xee, 0x8f, 0x32, 0x09, 0x06, 0x94, 0xcc, 0x00, 0x90,
@ -525,87 +530,91 @@ const unsigned char g_DFT[] = {
0x3c, 0x60, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0xd3, 0x19, 0x60,
0x42, 0x18, 0x8c, 0x26, 0x04, 0x40, 0x05, 0x03, 0x8c, 0x26, 0x0c, 0xc1,
0x70, 0x83, 0x10, 0x90, 0xc1, 0x2c, 0x43, 0x00, 0x05, 0x23, 0x06, 0x07,
0x00, 0x82, 0x60, 0x30, 0xb1, 0x41, 0x77, 0x64, 0xa3, 0x09, 0xc1, 0x50,
0xc1, 0x1a, 0xe0, 0x68, 0x02, 0x22, 0x54, 0xe0, 0x69, 0xb9, 0x41, 0x70,
0x35, 0x80, 0x01, 0x54, 0x10, 0x06, 0x6a, 0x71, 0x10, 0x5c, 0x60, 0xc4,
0xe0, 0x00, 0x40, 0x10, 0x0c, 0xa6, 0x3a, 0x30, 0x03, 0xa8, 0x1b, 0x4d,
0x08, 0x82, 0xd1, 0x04, 0x41, 0xa8, 0x40, 0x90, 0x82, 0x82, 0xaa, 0x48,
0x98, 0x12, 0x88, 0xa9, 0xa1, 0xa8, 0x12, 0x1a, 0xac, 0x60, 0xb9, 0x5a,
0xd6, 0x00, 0xaa, 0x08, 0xb4, 0x86, 0x00, 0x2a, 0xa0, 0x60, 0x34, 0xe1,
0x02, 0x86, 0x1b, 0x82, 0x50, 0x00, 0x83, 0x11, 0x83, 0x03, 0x00, 0x41,
0x30, 0x98, 0x4a, 0xc1, 0x0e, 0xc0, 0x80, 0x0d, 0x46, 0x13, 0x02, 0x61,
0xb8, 0xc1, 0x08, 0xc8, 0xa0, 0x88, 0x40, 0x67, 0x19, 0x04, 0x22, 0x18,
0x31, 0x38, 0x00, 0x10, 0x04, 0x83, 0x29, 0x15, 0xf4, 0x80, 0x0c, 0x48,
0x61, 0x34, 0x21, 0x10, 0x2a, 0x50, 0x64, 0xc4, 0x40, 0x01, 0x40, 0x10,
0x0c, 0x1c, 0x57, 0xe0, 0x03, 0x35, 0x08, 0x4c, 0x21, 0x0e, 0x50, 0x61,
0x34, 0x21, 0x00, 0x2e, 0x30, 0x70, 0x34, 0x41, 0x19, 0x86, 0x1b, 0x02,
0x56, 0x00, 0x83, 0x59, 0x86, 0x81, 0x08, 0x46, 0x13, 0x90, 0xa1, 0x82,
0x03, 0x46, 0x0c, 0x14, 0x00, 0x04, 0xc1, 0xc0, 0xa9, 0x85, 0x51, 0x88,
0x83, 0xa0, 0x15, 0xf0, 0xe0, 0x15, 0x46, 0x13, 0x02, 0xe0, 0x02, 0x03,
0x67, 0x09, 0x88, 0x81, 0x0e, 0x03, 0x1a, 0x20, 0x81, 0x1d, 0x82, 0x81,
0x0e, 0x83, 0x18, 0xd8, 0x41, 0x60, 0x87, 0x60, 0xc4, 0xe0, 0x00, 0x40,
0x10, 0x0c, 0x26, 0x5c, 0x48, 0x85, 0x39, 0xa8, 0x85, 0xd1, 0x84, 0x20,
0x18, 0x6e, 0xc8, 0x02, 0x32, 0x98, 0x65, 0x28, 0x8e, 0x60, 0xc4, 0xe0,
0x00, 0x40, 0x10, 0x0c, 0xa6, 0x5d, 0x60, 0x05, 0x3b, 0xb8, 0x85, 0xd1,
0x84, 0x00, 0xa8, 0x60, 0x0c, 0x64, 0x34, 0x61, 0x08, 0x2a, 0xf0, 0xa4,
0x82, 0x01, 0x46, 0x13, 0x0c, 0xa1, 0x02, 0x33, 0x90, 0x1a, 0x02, 0x18,
0x31, 0x50, 0x00, 0x10, 0x04, 0x03, 0xc7, 0x1c, 0x68, 0x01, 0x14, 0x02,
0x5f, 0x48, 0x05, 0x70, 0x18, 0x4d, 0x08, 0x80, 0x0b, 0x0c, 0x1c, 0x4d,
0x78, 0x86, 0xe1, 0x86, 0x80, 0x1c, 0xc0, 0x60, 0x96, 0xc1, 0x38, 0x82,
0xd1, 0x04, 0x67, 0xa8, 0xe0, 0x80, 0x11, 0x03, 0x05, 0x00, 0x41, 0x30,
0x70, 0xda, 0x61, 0x17, 0x4e, 0x21, 0x28, 0x07, 0x58, 0x38, 0x87, 0xd1,
0x84, 0x00, 0xb8, 0xc0, 0xc0, 0x59, 0x82, 0x63, 0xa0, 0xc3, 0x80, 0x0c,
0xa8, 0xd0, 0x09, 0x62, 0xa0, 0xc3, 0x20, 0x0c, 0x9e, 0x28, 0x78, 0x82,
0x30, 0x41, 0x93, 0x8f, 0x09, 0x9a, 0x7c, 0x8c, 0xd8, 0xe4, 0x63, 0x44,
0x27, 0x9f, 0xe1, 0x06, 0x39, 0x70, 0x03, 0x32, 0xa8, 0x38, 0x08, 0x74,
0x96, 0x01, 0x51, 0x82, 0x11, 0x83, 0x03, 0x00, 0x41, 0x30, 0x98, 0xec,
0xe1, 0x1c, 0x62, 0x21, 0x1e, 0x46, 0x13, 0x02, 0xa1, 0x02, 0x3b, 0x90,
0x11, 0x03, 0x05, 0x00, 0x41, 0x30, 0x70, 0xf6, 0x21, 0x1d, 0x6e, 0x21,
0x98, 0x07, 0x5f, 0xa8, 0x87, 0xd1, 0x84, 0x00, 0xb8, 0xc0, 0xc0, 0xd1,
0x84, 0x3b, 0x18, 0x86, 0x1b, 0x82, 0x7c, 0x00, 0x83, 0x59, 0x86, 0x44,
0x09, 0x46, 0x13, 0x90, 0xa1, 0x82, 0x03, 0x46, 0x0c, 0x14, 0x00, 0x04,
0xc1, 0xc0, 0x11, 0x09, 0x78, 0xf0, 0x85, 0x40, 0x1f, 0xca, 0x81, 0x1f,
0x46, 0x13, 0x02, 0xe0, 0x02, 0x03, 0x67, 0x09, 0x94, 0x81, 0x0e, 0x03,
0x4a, 0x20, 0xc4, 0x34, 0x8e, 0x81, 0x0e, 0x83, 0x48, 0x4c, 0x03, 0x31,
0x8d, 0x63, 0xb8, 0x61, 0x14, 0xd8, 0x80, 0x0c, 0x66, 0x19, 0x96, 0x26,
0x18, 0x31, 0x38, 0x00, 0x10, 0x04, 0x83, 0xc9, 0x24, 0xee, 0x21, 0x1c,
0x44, 0x62, 0x34, 0x21, 0x00, 0x2a, 0x70, 0x05, 0x19, 0x4d, 0x18, 0x82,
0x0a, 0x50, 0x41, 0x2a, 0x18, 0x60, 0x34, 0xc1, 0x10, 0x2a, 0x88, 0x05,
0xa9, 0x21, 0x80, 0x11, 0x03, 0x05, 0x00, 0x41, 0x30, 0x70, 0x62, 0xe2,
0x1f, 0xd6, 0x21, 0x48, 0x09, 0x7a, 0x58, 0x89, 0xd1, 0x84, 0x00, 0xb8,
0xc0, 0xc0, 0xd1, 0x04, 0x3d, 0x18, 0x86, 0x1b, 0x82, 0x97, 0x00, 0x83,
0x59, 0x06, 0xa6, 0x09, 0x46, 0x13, 0x9c, 0xa1, 0x82, 0x03, 0x46, 0x0c,
0x14, 0x00, 0x04, 0xc1, 0xc0, 0xc1, 0x09, 0x93, 0x90, 0x87, 0x00, 0x26,
0xf6, 0x41, 0x26, 0x46, 0x13, 0x02, 0xe0, 0x02, 0x03, 0x67, 0x09, 0x9a,
0x81, 0x0e, 0x03, 0x62, 0xa0, 0x05, 0x3e, 0x94, 0x81, 0x0e, 0x83, 0x60,
0xe4, 0x63, 0x91, 0x0f, 0xc5, 0x04, 0x4c, 0x3e, 0x26, 0x60, 0xf2, 0x31,
0x21, 0x88, 0x8f, 0x15, 0x9a, 0x7c, 0xac, 0xe0, 0xe4, 0x63, 0x81, 0x00,
0x9f, 0x82, 0x87, 0x96, 0x80, 0x3a, 0x87, 0x40, 0x47, 0x13, 0xf8, 0x61,
0x18, 0x6e, 0x08, 0xc2, 0x02, 0x0c, 0xa6, 0x1b, 0x52, 0x02, 0x25, 0x82,
0x23, 0x8c, 0x32, 0x21, 0x90, 0xcf, 0xdd, 0x83, 0x51, 0x26, 0x04, 0xf4,
0x19, 0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0xa3, 0x2d, 0xc6, 0x22, 0x18,
0x31, 0x30, 0x00, 0x10, 0x04, 0x83, 0xc3, 0x2d, 0x6c, 0x42, 0x18, 0x31,
0x38, 0x00, 0x10, 0x04, 0x83, 0x89, 0x2d, 0x7a, 0xe2, 0x24, 0xc6, 0x62,
0x34, 0x21, 0x10, 0x2a, 0x28, 0x09, 0x19, 0x4d, 0x18, 0x86, 0x12, 0x02,
0x18, 0x31, 0x38, 0x00, 0x10, 0x04, 0x03, 0x0b, 0x2e, 0xc4, 0x82, 0x25,
0x7c, 0x62, 0x34, 0x21, 0x10, 0x2c, 0xb1, 0xe4, 0x63, 0x09, 0x25, 0x1f,
0x2b, 0x05, 0x52, 0x88, 0x8f, 0x05, 0x03, 0x7c, 0x2c, 0x18, 0xe2, 0x63,
0x46, 0x20, 0x1f, 0x7b, 0x32, 0xf9, 0xd8, 0xd3, 0xc9, 0xc7, 0x50, 0x21,
0x15, 0xe0, 0x63, 0xc1, 0x00, 0x1f, 0x0b, 0x06, 0xf8, 0x18, 0x13, 0xc8,
0x67, 0x34, 0xc1, 0x09, 0x86, 0x23, 0x82, 0x9f, 0x08, 0xbe, 0x59, 0x86,
0xc7, 0x09, 0x6c, 0xdb, 0xe4, 0x63, 0x01, 0x59, 0xc8, 0xc7, 0x02, 0x82,
0x3e, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0x70, 0x9c, 0x46, 0x5f, 0x04,
0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0x70, 0xa0, 0x06, 0x5c, 0x08, 0xb3,
0x04, 0xcf, 0x40, 0x85, 0x41, 0x38, 0xac, 0xd2, 0x0c, 0x54, 0x18, 0x84,
0xc3, 0x2a, 0x8d, 0x09, 0x90, 0x7c, 0x4c, 0x58, 0xe4, 0x63, 0x42, 0x10,
0x9f, 0x0b, 0x92, 0x1b, 0x31, 0x70, 0x00, 0x10, 0x04, 0x03, 0xa8, 0x35,
0xec, 0x22, 0x2d, 0x3c, 0xd3, 0x08, 0xda, 0xa2, 0x2d, 0xda, 0x22, 0x2e,
0x50, 0xc3, 0x0a, 0x4a, 0x3e, 0x76, 0x3c, 0xf2, 0x31, 0x21, 0x80, 0xcf,
0x05, 0xc9, 0x8d, 0x18, 0x38, 0x00, 0x08, 0x82, 0x01, 0x14, 0x1b, 0x7a,
0xd1, 0x16, 0x60, 0xa0, 0x1a, 0x41, 0x5c, 0xc4, 0x45, 0x5c, 0xd4, 0x05,
0x6b, 0xcc, 0x12, 0x40, 0x18, 0x10, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00,
0x5b, 0x06, 0x34, 0x78, 0xc0, 0x60, 0xcb, 0xd0, 0x07, 0x4f, 0x18, 0x6c,
0x19, 0x58, 0xe1, 0x11, 0x83, 0x2d, 0xc3, 0x2e, 0x3c, 0x60, 0xb0, 0x65,
0x70, 0x87, 0x27, 0x0c, 0xb6, 0x0c, 0xfd, 0xf0, 0x88, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0x00, 0x82, 0x60, 0x30, 0xb1, 0x41, 0x77, 0x60, 0xa3, 0x09, 0xc1, 0x50,
0xc1, 0x1a, 0xe0, 0x68, 0x02, 0x22, 0x54, 0xd0, 0x69, 0xb9, 0x41, 0x70,
0x35, 0x7c, 0x50, 0x01, 0x18, 0xa8, 0xc5, 0x41, 0x70, 0x81, 0x11, 0x83,
0x03, 0x00, 0x41, 0x30, 0x98, 0xea, 0xc0, 0x0c, 0xa0, 0x6e, 0x34, 0x21,
0x08, 0x46, 0x13, 0x04, 0xa1, 0x02, 0x41, 0x0a, 0x0a, 0xaa, 0x22, 0x61,
0x4a, 0x20, 0xa6, 0x86, 0xa2, 0x4a, 0x68, 0xb0, 0x82, 0xe5, 0x6a, 0x51,
0x03, 0xa8, 0x22, 0xd0, 0x1a, 0x02, 0xa8, 0x80, 0x82, 0xd1, 0x84, 0x0b,
0x18, 0x6e, 0x08, 0x42, 0x01, 0x0c, 0x46, 0x0c, 0x0e, 0x00, 0x04, 0xc1,
0x60, 0x2a, 0x05, 0x3b, 0x00, 0x03, 0x36, 0x18, 0x4d, 0x08, 0x84, 0xe1,
0x06, 0x23, 0x20, 0x83, 0x22, 0x02, 0x9d, 0x65, 0x10, 0x88, 0x60, 0xc4,
0xe0, 0x00, 0x40, 0x10, 0x0c, 0xa6, 0x54, 0xd0, 0x03, 0x32, 0x20, 0x85,
0xd1, 0x84, 0x40, 0xa8, 0x40, 0x91, 0x11, 0x03, 0x05, 0x00, 0x41, 0x30,
0x70, 0x5c, 0x81, 0x0f, 0xd4, 0x20, 0x30, 0x85, 0x38, 0x40, 0x85, 0xd1,
0x84, 0x00, 0xb8, 0xc0, 0xc0, 0xd1, 0x04, 0x65, 0x18, 0x6e, 0x08, 0x58,
0x01, 0x0c, 0x66, 0x19, 0x06, 0x22, 0x18, 0x4d, 0x40, 0x86, 0x0a, 0x0e,
0x18, 0x31, 0x50, 0x00, 0x10, 0x04, 0x03, 0xa7, 0x16, 0x46, 0x21, 0x0e,
0x82, 0x56, 0xc0, 0x83, 0x57, 0x18, 0x4d, 0x08, 0x80, 0x0b, 0x0c, 0x9c,
0x25, 0x20, 0x06, 0x3a, 0x0c, 0x68, 0x80, 0x04, 0x76, 0x08, 0x06, 0x3a,
0x0c, 0x62, 0x60, 0x07, 0x81, 0x1d, 0x82, 0x11, 0x83, 0x03, 0x00, 0x41,
0x30, 0x98, 0x70, 0x21, 0x15, 0xe6, 0xa0, 0x16, 0x46, 0x13, 0x82, 0x60,
0xb8, 0x21, 0x0b, 0xc8, 0x60, 0x96, 0xa1, 0x38, 0x82, 0x11, 0x83, 0x03,
0x00, 0x41, 0x30, 0x98, 0x76, 0x81, 0x15, 0xec, 0xe0, 0x16, 0x46, 0x13,
0x02, 0xa0, 0x82, 0x31, 0x90, 0xd1, 0x84, 0x21, 0xa8, 0xc0, 0x93, 0x0a,
0x06, 0x18, 0x4d, 0x30, 0x84, 0x0a, 0xcc, 0x40, 0x6a, 0x08, 0x60, 0xc4,
0x40, 0x01, 0x40, 0x10, 0x0c, 0x1c, 0x73, 0xa0, 0x05, 0x50, 0x08, 0x7c,
0x21, 0x15, 0xc0, 0x61, 0x34, 0x21, 0x00, 0x2e, 0x30, 0x70, 0x34, 0xe1,
0x19, 0x86, 0x1b, 0x02, 0x72, 0x00, 0x83, 0x59, 0x06, 0xe3, 0x08, 0x46,
0x13, 0x9c, 0xa1, 0x82, 0x03, 0x46, 0x0c, 0x14, 0x00, 0x04, 0xc1, 0xc0,
0x69, 0x87, 0x5d, 0x38, 0x85, 0xa0, 0x1c, 0x60, 0xe1, 0x1c, 0x46, 0x13,
0x02, 0xe0, 0x02, 0x03, 0x67, 0x09, 0x8e, 0x81, 0x0e, 0x03, 0x32, 0xa0,
0x42, 0x27, 0x88, 0x81, 0x0e, 0x83, 0x30, 0x78, 0xa2, 0xe0, 0x09, 0xc2,
0x04, 0x4d, 0x3e, 0x26, 0x68, 0xf2, 0x31, 0x62, 0x93, 0x8f, 0x11, 0x9d,
0x7c, 0x86, 0x1b, 0xe4, 0xc0, 0x0d, 0xc8, 0xa0, 0xe2, 0x20, 0xd0, 0x59,
0x06, 0x44, 0x09, 0x46, 0x0c, 0x0e, 0x00, 0x04, 0xc1, 0x60, 0xb2, 0x87,
0x73, 0x88, 0x85, 0x78, 0x18, 0x4d, 0x08, 0x84, 0x0a, 0xec, 0x40, 0x46,
0x0c, 0x14, 0x00, 0x04, 0xc1, 0xc0, 0xd9, 0x87, 0x74, 0xb8, 0x85, 0x60,
0x1e, 0x7c, 0xa1, 0x1e, 0x46, 0x13, 0x02, 0xe0, 0x02, 0x03, 0x47, 0x13,
0xee, 0x60, 0x18, 0x6e, 0x08, 0xf2, 0x01, 0x0c, 0x66, 0x19, 0x12, 0x25,
0x18, 0x4d, 0x40, 0x86, 0x0a, 0x0e, 0x18, 0x31, 0x50, 0x00, 0x10, 0x04,
0x03, 0x47, 0x24, 0xe0, 0xc1, 0x17, 0x02, 0x7d, 0x28, 0x07, 0x7e, 0x18,
0x4d, 0x08, 0x80, 0x0b, 0x0c, 0x9c, 0x25, 0x50, 0x06, 0x3a, 0x0c, 0x28,
0x81, 0x10, 0xd3, 0x38, 0x06, 0x3a, 0x0c, 0x22, 0x31, 0x0d, 0xc4, 0x34,
0x8e, 0xe1, 0x86, 0x51, 0x60, 0x03, 0x32, 0x98, 0x65, 0x58, 0x9a, 0x60,
0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0x26, 0x93, 0xb8, 0x87, 0x70, 0x10,
0x89, 0xd1, 0x84, 0x00, 0xa8, 0xc0, 0x15, 0x64, 0x34, 0x61, 0x08, 0x2a,
0x40, 0x05, 0xa9, 0x60, 0x80, 0xd1, 0x04, 0x43, 0xa8, 0x20, 0x16, 0xa4,
0x86, 0x00, 0x46, 0x0c, 0x14, 0x00, 0x04, 0xc1, 0xc0, 0x89, 0x89, 0x7f,
0x58, 0x87, 0x20, 0x25, 0xe8, 0x61, 0x25, 0x46, 0x13, 0x02, 0xe0, 0x02,
0x03, 0x47, 0x13, 0xf4, 0x60, 0x18, 0x6e, 0x08, 0x5e, 0x02, 0x0c, 0x66,
0x19, 0x98, 0x26, 0x18, 0x4d, 0x70, 0x86, 0x0a, 0x0e, 0x18, 0x31, 0x50,
0x00, 0x10, 0x04, 0x03, 0x07, 0x27, 0x4c, 0x42, 0x1e, 0x02, 0x98, 0xd8,
0x07, 0x99, 0x18, 0x4d, 0x08, 0x80, 0x0b, 0x0c, 0x9c, 0x25, 0x68, 0x06,
0x3a, 0x0c, 0x88, 0x81, 0x16, 0xf8, 0x50, 0x06, 0x3a, 0x0c, 0x82, 0x91,
0x8f, 0x45, 0x3e, 0x14, 0x13, 0x30, 0xf9, 0x98, 0x80, 0xc9, 0xc7, 0x84,
0x20, 0x3e, 0x56, 0x68, 0xf2, 0xb1, 0x82, 0x93, 0x8f, 0x05, 0x02, 0x7c,
0x0a, 0x1e, 0x58, 0x02, 0xea, 0x1c, 0x02, 0x1d, 0x4d, 0xe0, 0x87, 0x61,
0xb8, 0x21, 0x08, 0x0b, 0x30, 0x98, 0x6e, 0x48, 0x09, 0x94, 0x08, 0x8e,
0x30, 0xca, 0x84, 0x40, 0x3e, 0x77, 0x0f, 0x46, 0x99, 0x10, 0xd0, 0x67,
0xc4, 0xc0, 0x00, 0x40, 0x10, 0x0c, 0x8e, 0xb6, 0x18, 0x8b, 0x60, 0xc4,
0xc0, 0x00, 0x40, 0x10, 0x0c, 0x0e, 0xb7, 0xa8, 0x09, 0x61, 0xc4, 0xe0,
0x00, 0x40, 0x10, 0x0c, 0x26, 0xb6, 0xe8, 0x89, 0x93, 0x18, 0x8b, 0xd1,
0x84, 0x40, 0xa8, 0xa0, 0x24, 0x64, 0x34, 0x61, 0x18, 0x4a, 0x08, 0x60,
0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0x2c, 0xb8, 0x10, 0x0b, 0x96, 0xe8,
0x89, 0xd1, 0x84, 0x40, 0xb0, 0xc4, 0x92, 0x8f, 0x25, 0x94, 0x7c, 0xac,
0x14, 0x48, 0x21, 0x3e, 0x16, 0x0c, 0xf0, 0xb1, 0x60, 0x88, 0x8f, 0x19,
0x81, 0x7c, 0xec, 0xc9, 0xe4, 0x63, 0x4f, 0x27, 0x1f, 0x43, 0x85, 0x54,
0x80, 0x8f, 0x05, 0x03, 0x7c, 0x2c, 0x18, 0xe0, 0x63, 0x4c, 0x20, 0x9f,
0xd1, 0x04, 0x27, 0x18, 0x8e, 0x08, 0x7e, 0x22, 0xf8, 0x66, 0x19, 0x9c,
0x27, 0xb8, 0x24, 0xb9, 0x11, 0x03, 0x07, 0x00, 0x41, 0x30, 0x80, 0x46,
0x03, 0x2e, 0x7e, 0x82, 0xe2, 0x8b, 0x60, 0x2c, 0xc6, 0x62, 0x2c, 0xce,
0xc2, 0x2f, 0x8e, 0x48, 0x6e, 0xc4, 0xc0, 0x01, 0x40, 0x10, 0x0c, 0x20,
0xd2, 0x88, 0x0b, 0xb0, 0x98, 0xfa, 0x22, 0x20, 0x0b, 0xb2, 0x20, 0x0b,
0xb4, 0xf8, 0x8b, 0x59, 0x02, 0xc8, 0xba, 0x4e, 0x3e, 0x16, 0x98, 0x85,
0x7c, 0x2c, 0x30, 0xe8, 0x33, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x47,
0x6a, 0xfc, 0x45, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x87, 0x6a,
0xc4, 0x85, 0x60, 0x02, 0x24, 0x1f, 0x13, 0x16, 0xf9, 0x98, 0x10, 0xc4,
0xe7, 0x82, 0xe4, 0x46, 0x0c, 0x1c, 0x00, 0x04, 0xc1, 0x00, 0x6a, 0x0d,
0xbd, 0x48, 0x0b, 0xcf, 0x34, 0x82, 0xb6, 0x68, 0x8b, 0xb6, 0x88, 0x0b,
0xd4, 0xb0, 0x82, 0x92, 0x8f, 0x1d, 0x8f, 0x7c, 0x4c, 0x08, 0xe0, 0x73,
0x41, 0x72, 0x23, 0x06, 0x0e, 0x00, 0x82, 0x60, 0x00, 0xc5, 0x86, 0x5f,
0xb4, 0x05, 0x18, 0xa8, 0x46, 0x10, 0x17, 0x71, 0x11, 0x17, 0x75, 0xc1,
0x1a, 0xb3, 0x04, 0x10, 0x06, 0xc4, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
0x5b, 0x06, 0x34, 0x78, 0xc0, 0x60, 0xcb, 0x10, 0x07, 0x4f, 0x18, 0x6c,
0x19, 0xfa, 0xe0, 0x11, 0x83, 0x2d, 0x03, 0x2b, 0x3c, 0x63, 0xb0, 0x65,
0xd8, 0x85, 0x07, 0x0c, 0xb6, 0x0c, 0xe4, 0xf0, 0x84, 0xc1, 0x96, 0xc1,
0x1d, 0x1e, 0x31, 0xd8, 0x32, 0xf4, 0xc3, 0x33, 0x06, 0x5b, 0x06, 0xb6,
0x78, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

View file

@ -41,20 +41,21 @@ float2 ReadSourceValue(uint3 index)
float2 value = float2(0, 0);
bool hasWindow = HasWindow == 1;
[branch]
[flatten]
if (hasWindow && index.y < (uint)WindowSizes[2])
{
uint windowIndexReal = index.y * WindowStrides[2];
window_value.x = window[windowIndexReal];
uint windowIndexImaginary = windowIndexReal + WindowStrides[3];
[branch]
if (WindowSizes[3] == 2)
{
window_value.y = window[windowIndexImaginary];
}
}
[branch]
[flatten]
if (index.y < (uint)InputSizes[1])
{
uint indexReal =
@ -108,7 +109,7 @@ void DFT(uint3 dtid : SV_DispatchThreadId)
uint index = StartIndex + dtid.x;
if (index < ElementCount)
{
uint halfTotalDFTLength = DFTLength / 2;
uint halfTotalDFTLength = DFTLength >> 1;
uint N = 1U << DFTIteration;
uint halfN = 1U << (DFTIteration - 1);
@ -143,8 +144,16 @@ void DFT(uint3 dtid : SV_DispatchThreadId)
unweighted.y = Scale * (inputEvenValue.y + (w.x * inputOddValue.y + w.y * inputOddValue.x));
// When ChirpLength is 0, then chirp should evaluate to (1,0), which is a no-op.
float2 chirp = CalculateChirp(k, ChirpLength);
dst[outputIndex.x] = (TBUFFER)(unweighted.x * chirp.x - unweighted.y * chirp.y);
dst[outputIndex.y] = (TBUFFER)(unweighted.x * chirp.y + unweighted.y * chirp.x);
[branch]
if (ChirpLength == 0)
{
dst[outputIndex.x] = (TBUFFER)(unweighted.x);
dst[outputIndex.y] = (TBUFFER)(unweighted.y);
}
else {
float2 chirp = CalculateChirp(k, ChirpLength);
dst[outputIndex.x] = (TBUFFER)(unweighted.x * chirp.x - unweighted.y * chirp.y);
dst[outputIndex.y] = (TBUFFER)(unweighted.x * chirp.y + unweighted.y * chirp.x);
}
}
}

View file

@ -60,6 +60,7 @@
#include "core/providers/dml/DmlExecutionProvider/src/GraphTransformer.h"
#include "core/providers/dml/dml_session_options_config_keys.h"
#include "core/providers/dml/DmlExecutionProvider/src/ExecutionProvider.h"
#include "core/optimizer/stft_decomposition.h"
#endif
#include "core/session/environment.h"
#include "core/session/user_logging_sink.h"
@ -1761,6 +1762,14 @@ common::Status InferenceSession::Initialize() {
}
ORT_RETURN_IF_ERROR_SESSIONID_(graph_transformer_mgr_.Register(std::move(dmlOperatorFusionTransformer), onnxruntime::TransformerLevel::Level2));
}
const auto dml_ep_impl = static_cast<const Dml::ExecutionProvider*>(dmlExecutionProvider);
auto is_mcdm_device = dml_ep_impl->GetImpl()->IsMcdmDevice();
if (is_mcdm_device) {
const InlinedHashSet<std::string_view> dml_ep = {onnxruntime::kDmlExecutionProvider};
auto stft_decomposition_transformer = std::make_unique<STFTDecomposition>(dml_ep);
ORT_RETURN_IF_ERROR_SESSIONID_(graph_transformer_mgr_.Register(std::move(stft_decomposition_transformer), onnxruntime::TransformerLevel::Level1));
}
}
#endif