summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/radeon/AMDILDevice.h
blob: 338212101b4e1cde22a674891c3c5c5a3ecbd81b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//===---- AMDILDevice.h - Define Device Data for AMDIL -----*- C++ -*------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//==-----------------------------------------------------------------------===//
//
// Interface for the subtarget data classes.
//
//===----------------------------------------------------------------------===//
// This file will define the interface that each generation needs to
// implement in order to correctly answer queries on the capabilities of the
// specific hardware.
//===----------------------------------------------------------------------===//
#ifndef _AMDILDEVICEIMPL_H_
#define _AMDILDEVICEIMPL_H_
#include "AMDIL.h"
#include "llvm/ADT/BitVector.h"

namespace llvm {
  class AMDILSubtarget;
  class AMDILAsmPrinter;
  class AMDILIOExpansion;
  class AMDILPointerManager;
  class AsmPrinter;
  class MCStreamer;
//===----------------------------------------------------------------------===//
// Interface for data that is specific to a single device
//===----------------------------------------------------------------------===//
class AMDILDevice {
public:
  AMDILDevice(AMDILSubtarget *ST);
  virtual ~AMDILDevice();

  // Enum values for the various memory types.
  enum {
    RAW_UAV_ID   = 0,
    ARENA_UAV_ID = 1,
    LDS_ID       = 2,
    GDS_ID       = 3,
    SCRATCH_ID   = 4,
    CONSTANT_ID  = 5,
    GLOBAL_ID    = 6,
    MAX_IDS      = 7
  } IO_TYPE_IDS;

  // Returns the max LDS size that the hardware supports.  Size is in
  // bytes.
  virtual size_t getMaxLDSSize() const = 0;

  // Returns the max GDS size that the hardware supports if the GDS is
  // supported by the hardware.  Size is in bytes.
  virtual size_t getMaxGDSSize() const;

  // Returns the max number of hardware constant address spaces that
  // are supported by this device.
  virtual size_t getMaxNumCBs() const;

  // Returns the max number of bytes a single hardware constant buffer
  // can support.  Size is in bytes.
  virtual size_t getMaxCBSize() const;

  // Returns the max number of bytes allowed by the hardware scratch
  // buffer.  Size is in bytes.
  virtual size_t getMaxScratchSize() const;

  // Get the flag that corresponds to the device.
  virtual uint32_t getDeviceFlag() const;

  // Returns the number of work-items that exist in a single hardware
  // wavefront.
  virtual size_t getWavefrontSize() const = 0;

  // Get the generational name of this specific device.
  virtual uint32_t getGeneration() const = 0;

  // Get the stack alignment of this specific device.
  virtual uint32_t getStackAlignment() const;

  // Get the resource ID for this specific device.
  virtual uint32_t getResourceID(uint32_t DeviceID) const = 0;

  // Get the max number of UAV's for this device.
  virtual uint32_t getMaxNumUAVs() const = 0;

  // Interface to get the IO Expansion pass for each device.
  virtual FunctionPass* 
    getIOExpansion(TargetMachine& AMDIL_OPT_LEVEL_DECL) const = 0;

  // Interface to get the Asm printer for each device.
  virtual AsmPrinter*
    getAsmPrinter(TargetMachine& TM, MCStreamer &Streamer) const = 0;

  // Interface to get the Pointer manager pass for each device.
  virtual FunctionPass* 
    getPointerManager(TargetMachine& AMDIL_OPT_LEVEL_DECL) const = 0;


  // API utilizing more detailed capabilities of each family of
  // cards. If a capability is supported, then either usesHardware or
  // usesSoftware returned true.  If usesHardware returned true, then
  // usesSoftware must return false for the same capability.  Hardware
  // execution means that the feature is done natively by the hardware
  // and is not emulated by the softare.  Software execution means
  // that the feature could be done in the hardware, but there is
  // software that emulates it with possibly using the hardware for
  // support since the hardware does not fully comply with OpenCL
  // specs.
  bool isSupported(AMDILDeviceInfo::Caps Mode) const;
  bool usesHardware(AMDILDeviceInfo::Caps Mode) const;
  bool usesSoftware(AMDILDeviceInfo::Caps Mode) const;
  virtual std::string getDataLayout() const;
  static const unsigned int MAX_LDS_SIZE_700 = 16384;
  static const unsigned int MAX_LDS_SIZE_800 = 32768;
  static const unsigned int WavefrontSize = 64;
  static const unsigned int HalfWavefrontSize = 32;
  static const unsigned int QuarterWavefrontSize = 16;
protected:
  virtual void setCaps();
  llvm::BitVector mHWBits;
  llvm::BitVector mSWBits;
  AMDILSubtarget *mSTM;
  uint32_t mDeviceFlag;
private:
  AMDILDeviceInfo::ExecutionMode
  getExecutionMode(AMDILDeviceInfo::Caps Caps) const;
}; // AMDILDevice

} // namespace llvm
#endif // _AMDILDEVICEIMPL_H_