2 #include "../core/GLFilter.h" 3 #include "../core/GLImage.h" 4 #include "../core/ImageAllocator.h" 6 #include "caffe2/core/operator.h" 7 #include "caffe2/core/timer.h" 8 #include "caffe2/operators/conv_pool_op_base.h" 22 std::vector<binding*>(
23 {BINDING(padSize), BINDING(inputSize), BINDING(outputSize), BINDING(inputData)}),
34 static const char* fragment_shader;
39 const char* GLPadImage::fragment_shader = R
"GLSL(#version 300 es 41 precision mediump float; 42 precision mediump int; 44 in highp vec2 v_texCoord; 46 uniform ivec2 padSize; 47 uniform ivec2 inputSize; 48 uniform ivec2 outputSize; 50 TEXTURE_INPUT(inputData); 51 TEXTURE_OUTPUT(0, outputData); 54 ivec2 texelCoord = ivec2(v_texCoord * vec2(outputSize)) - padSize; 55 texelCoord = max(texelCoord, -texelCoord); 56 texelCoord = min(texelCoord, ivec2(2) * (inputSize - 1) - texelCoord); 57 vec4 value = TEXTURE_LOAD(inputData, texelCoord); 58 outputData = TEXTURE_STORE(value); 68 for (
int i = 0; i < input_images.size(); i++) {
69 auto input_image = input_images[i];
70 auto output_image = output_images[i];
71 int input_slices = input_image->slices;
72 int output_slices = output_image->slices;
74 for (
int is = 0; is < input_slices; is++) {
75 run(std::vector<texture_attachment>({{input_image->textures[is], inputData}}),
76 {output_image->textures.begin() + is, output_image->textures.begin() + is + 1},
78 glUniform2i(inputSize->location, input_image->width, input_image->height);
79 glUniform2i(outputSize->location, output_image->width, output_image->height);
80 glUniform2i(padSize->location, pad_l, pad_t);
83 output_image->height);
90 template <
typename OPBase>
91 static void computeOutputHW(OPBase* op,
int H,
int W,
int* OH,
int* OW) {
93 input.Resize(1, 1, H, W);
94 op->SetOutputSize(input, &output, 1);
95 CAFFE_ENFORCE_EQ(output.ndim(), 4);
105 mode_(OperatorBase::GetSingleArgument<string>(
"mode",
"")) {
106 OPERATOR_NEEDS_FEATURE(order_ == StorageOrder::NCHW,
"OpenGL only supports NCHW order.");
107 OPERATOR_NEEDS_FEATURE(mode_ ==
"reflect",
"OpenGL only supports reflection");
109 CAFFE_ENFORCE(legacy_pad_ == LegacyPadding::NOTSET,
110 "Padding layer only supports explicit pad values.");
111 CAFFE_ENFORCE(dilation_h() == 1 && dilation_w() == 1,
112 "Pooling op does not support dilation right now.");
113 CAFFE_ENFORCE(stride_h() == 1 && stride_w() == 1,
114 "Pooling op does not support stride right now.");
117 kernel_.assign(pads_.size() / 2, 1);
120 bool RunOnDeviceWithOrderNCHW()
override {
121 const GLImageVector<T>& input = Inputs()[0]->template Get<GLImageVector<T>>();
123 const int num_images = input.size();
124 const int input_width = input.width();
125 const int input_height = input.height();
126 const int input_channels = input.channels();
127 const int output_channels = input_channels;
129 int output_height, output_width;
130 computeOutputHW(
this, input_height, input_width, &output_height, &output_width);
132 int is_last = OperatorBase::GetSingleArgument<int>(
"is_last", 0);
135 num_images, output_width, output_height, output_channels, is_last);
139 LOG(INFO) << input_channels <<
": " << input_height <<
" X " << input_width <<
" => " 140 << output_channels <<
": " << output_height <<
" X " << output_width;
141 LOG(INFO) <<
"Padmode: " << mode_ <<
", pad_l = " << pad_l() <<
", pad_r = " << pad_r() <<
", pad_t = " << pad_t()
142 <<
", pad_b = " << pad_b();
145 padImage_->pad(input, *output, pad_l(), pad_t());
147 Outputs()[0]->Reset(output);
154 std::unique_ptr<GLPadImage> padImage_;
158 OPERATOR_SCHEMA(OpenGLPadImage).NumInputs(1).NumOutputs(1);
Workspace is a class that holds all the related objects created during runtime: (1) all blobs...
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...